php发展

首页 » 常识 » 常识 » 详解某cms代码审计过程
TUhjnbcbe - 2022/12/7 14:29:00
行*求职招聘QQ群 https://baijiahao.baidu.com/s?id=1713591262929630808&wfr=spider&for=pc

随着通用型漏洞证书颁发的要求越来越高,整理了一篇关于通用型证书php框架漏洞的白盒审计思路。

0×0:重组漏洞

漏洞位置:/install/index.php

配置安装成功后,访问/install目录,如下图所示,若显示重新安装,请删除/install/install.lock。

全局搜索/install/install.lock,并在/install/step_1.php中找到:

分析index.php代码可知,这里通过变量step的值来执行不同的操作语句,当step的值为1时包含step_1.php,此时会检查是否存在install.lock文件,所以要想办法跳过这一步。

继续向上查找变量step的值,发现通过post传值来给step,不传值默认为1,所以直接post一个step的值为2,即可跳过install.lock检查,实现重装。

验证:

0×1:SQL注入

漏洞位置:

/admin/ask.php

/inc/stopsqlin.php

这里发现只验证传入的cookie值不为空,就会拼接在sql语句中执行。

继续向上查找如何到达该漏洞位置,发现需要进入到add()方法中。

继续查找哪里调用了add()方法,在ask.php的第55行,执行三元运算符来判断是否以GET方式传了一个do参数,并且值为add时,会调用add()方法。

由于该cms将传入的cookie变量带入到了/inc/stopsqlin.php文件的stopsqlin的方法中进行了过滤,所以我们要考虑绕过该方法。

在stopsqlin.php的55行做了一个if判断,用strpos函数匹配r_url中是否存在siteconfig.php关键字,如果存在的话返回值为具体位数,若返回值等于0的话会进入该方法,因此我们可以在url中传入一个参数值为siteconfig.php就不会进入到stopsqlin方法中,即绕过。

验证:

0×2:存储型XSS

漏洞位置:/inc/function.php

在函数stripfxg中,存在使用方法htmlspecialchars_decode()对htmlspecialchars()方法。

过滤后的参数进行解码,导致可能存在XSS漏洞。

由stripfxg函数可知:

当此函数被调用且参数htmlspecialchars_decode为true时,htmlspecialchars_decod()方法会被调用。

全局查找函数stripfxg被调用的地方:发现在/zt/show.php。

发现赋值给变量gsjj,这个时候考虑搜索有没有类似于echojsjj打印的语句。

搜索发现没有,但是发现通过str_replace函数将变量strout中的{#gsjj}替换成gsjj并打印出来:

查找stripfxg函数中参数content的来源,发现在包含的文件top.php中,继续查找变量row[“content”]的来源发现找不到。

通过分析代码发现content是zz_cmsuser表中的一个字段,在数据库中执行sql语句确实存在content字段。

这个时候考虑如何修改zzcms_user这个表来修改content这个字段,全局搜索updatezzcms_user发现在/user/manage.php中找到修改content字段的sql语句。

继续向上分析,当存在参数变量action且值为modify时执行sql语句修改contnet,即用户可以在信息修改时控制content参数来插入XSS。

验证:

注册一个用户,在用户个人中心点击修改注册信息并抓包:

在数据包中添加参数content=img/src=1=alert(1)。

此时访问/zt/show.php?id=1即可触发XSS。

0×3:总结

php框架的大厂漏洞越来越难审计了,JAVA代码审计能力在实战中越来越重要。非常喜欢圈内的一句话:代码能力决定了你的上限。

1
查看完整版本: 详解某cms代码审计过程