NexusPHP是用于P2P下载的资源分享类CMS,源码下载链接是https://github.com/ZJUT/NexusPHP

前置分析

[

](https://github.com/ZJUT/NexusPHP)

这套cms,存在全局过滤sql注入的函数sqlesc()

nexusphp/include/globalfunctions.php #75

  1. **全局过滤之防止SQL注入1。**用mysql防注入函数转义,并且用单引号包裹住语句,导致无法注入引号,也无法引入变量(单引号中的$不会被识别成变量)

  2. **全局过滤之防止SQL注入2。**常有整型转换,利用加法强转为数字

  1. **getip() 函数校验不当导致可伪造ip。**首先,获取ip的函数写成了下面这样:
<?php
function getip() {
	if (isset($_SERVER)) {
		if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && validip($_SERVER['HTTP_X_FORWARDED_FOR'])) {
			$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
		} elseif (isset($_SERVER['HTTP_CLIENT_IP']) && validip(......
                                                           ...
?>
  • X_FORWARDED_FOR请求头作为ip地址,这个请求头是可以伪造滴!
  • 其次,在校验函数validip()中的逻辑也以偏概全,认为只要是让ip2long()函数出错内容就是IPV6地址。。

  • 实际上:任何不是IP的字符串都可以让它输出False,即该点完全可控,美滋滋。

废话不多说,开始审计。

0x01 前台找回密码处存在邮件内容可控问题,可导致储存XSS

接着刚刚说的getip()函数的IP伪造问题,我们找找它的引用

找到recover.php,存在一段找回密码的功能

heredoc

PHP EOF(heredoc) 使用说明 PHP EOF(heredoc)是一种在命令行shell(如sh、csh、ksh、bash、PowerShell和zsh)和程序语言(像Perl、PHP、Python和Ruby)里定义一个字符串的方法。

加入一段打印body的代码,抓包改一下XFF请求头,加入XSS的payload

模拟在email中收信的场景,是熟悉的XSS

0x02 nowarn.php 存在SQL注入

需要登录且不为普通用户

nowarn.php的第36行开始,直接拼接进sql语句了

# payload仅供参考
(select*from(select sleep(10))x)# 

只不过这个注入点需要认证

0x03 linksmanage.php存在SQL注入

如图,关键逻辑就是直接传入了用户的变量,连都sqlesc这个过滤函数都没使用。。。

还有其它好几个SQL注入点,用正则表达式都可以发现,可以参考它的CVE网站,不再赘述。

0x04 恶意SQL查询风险

moforums.php中,存在如下的查询语句

sql_query("UPDATE overforums SET sort = " . sqlesc($_POST['sort']) . ", name = " . sqlesc($_POST['name']). ", description = " . sqlesc($_POST['desc']). ", minclassview = " . sqlesc($_POST['viewclass']) . " WHERE id = ".sqlesc($_POST['id'])) or sqlerr(__FILE__, __LINE__);

那么可以考虑利用/* */来注释掉中间的部分,达成执行恶意语句的效果。。。不过也只是风险罢了。。

其余风险点

iconv的截断

低版本,(默认)乱杀

高版本,(有条件)乱杀

我们看下php官方的文档,关于iconv这个函数,官方是怎么说的

在PHP < 5.4.0,字符非法时会被截断,只返回非法字符串之前能正常解码的内容

在PHP >= 5.4.0时,字符非法时会报错返回False,除非输出字符串里拼接了//IGNORE,本套cms就是这种情况

也就是说,我们可以控制输出,利用特性bypass文件后缀之类的检测

总结

  1. 这套cms审下来,有好很多地方都是形如0x02的注入一样的拼接,但都需要高权限才能访问到漏洞代码处,进而注入,价值不大。
  2. 参数绝大部分都来强制类型转换,没有常见的命令执行函数
  3. 可以参考这几个老哥的cvecnnvd,17年的时候刷了一波大规模的洞,主要是xss和sql注入,重复性工作,索然无味
  4. 这次审计在前人的基础上,发现了SQL多参数时利用注释来绕过减少查询字段数的骚姿势,还是学习了不少姿势的。