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


[
](https://github.com/ZJUT/NexusPHP)
这套cms,存在全局过滤sql注入的函数sqlesc()
nexusphp/include/globalfunctions.php #75

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

- **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文件后缀之类的检测