随着通用型漏洞证书颁发的要求越来越高,整理了一篇关于通用型证书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代码审计能力在实战中越来越重要。非常喜欢圈内的一句话:代码能力决定了你的上限。