前言
今天拿到一篇某前辈发的代码审计文章,就复盘了一下,目前暂时没看到升级版,或者是补丁,目前也处
于0day状态
参考文章https://mp.weixin.qq.com/s/DD0lJD_COKLzF-HBPYvIwQ
环境搭建
本机环境:
apeche2.4.39
ftp0.9.60
mysql5.7.26
代码审计分析
app/content/cls/api.cls.php
此处可以看到当blocktype==4的时候执行以下代码
可以看到eval中存在变量$tp
发现其调用函数fetchContent
全文追踪此函数
/lib/tpl.cls.php
进一步追踪compileContentTpl函数
对其中函数进行全部追踪发现再此处仅仅只是做了无关紧要的正则过滤并不影响我们的输入与输出
回到位置继续追踪$tp的值:
html_entity_decode函数的作用将html实体编码的值转化为字符
追踪stripSlashes函数方法:
lib/ev.cls.php
发现此处操作为将sql注入的转义的/去除
且此处发现blocktype的值
分析此段代码得结论,那么就是需要控制blocktype的值为4和blockcontent的值为我们想要使用的php
代码那么就可以造成代码执行漏洞
/app/content/cls/api.cls.php
可以看出函数中blocktype的值由getBlockById($blockid)此处控制
定位此函数方法的函数
/app/content/cls/block.cls.php
根据框架预先定义好的数据库查询方法可以得知此处为数据库增加查询语句,查询blockid表中的数据查
询条件为$blockid值,
函数eval在传入$tp值并没有加入有效的过滤,那么此处只要我们可以控制数据表中的内容和blocktype
的值,并且可以控制传参那么此代码执行就生效
根据上诉代码可以得到存在调用/app/content/cls/block.cls.php getBlockById方法就可能存在代码执行
漏洞
/app/content/controller/blocks.master.php
此处modify方法调用getBlockById
get指的是通过get方法获取,stripSlashes对$block['blockcontent']进行了html实体化,和sql注入的过
滤
由于再我们发现漏洞处的位置,代码对传入的值进行去html和删除转义字符的处理从而导致漏洞的存在