php代码审计篇二——ZbzCMS
青青草原羊真香
- 关注
php代码审计篇二——ZbzCMS

有段时间没有更新了,这段时间一直在对一些项目重点保护,所以学习有些滞后,但是审代码一直是我比较感兴趣的事,这次也是选择用自己学到的方法结合网上一些已知的漏洞进行审计,希望我的文章也能给想做代审的小伙伴提供思路。
环境搭建
- 环境部署好后,访问localhost/zbzcms.com
- 发布后才有前台
XSS漏洞
- echo全局搜索函数,优先找前台产生漏洞的地方
- search.php里面无漏洞
- cms/api/difangzhan.php里也无漏洞:$difang_json受到$url影响,$url也是写死的ip
- 关注到一个post地方,传入$neirong
- post['neirong']受到变量$neirong控制
- 可以看到这段代码要求$run='liuyan',才能往下触发,核心代码解释:
if(count($_POST)>0){
$neirong='';
foreach($_POST as $k=>$v){
if($neirong==''){$neirong=$k.':'.$v;}
else{$neirong.="<br/>".$k.':'.$v;}
}
}
第一行:if(count($_POST)>0)来检查$_POST数组中是否有数据被提交。如果有数据被提交,代码会执行下面的逻辑。
第二行:定义了一个空字符串变量$neirong,用于存储生成的留言内容。
第三行:代码使用foreach循环遍历$_POST数组中的每个键值对。在循环中,$k表示当前键,$v表示当前值。
第四行:代码使用条件语句判断$neirong是否为空。如果为空,说明是第一个键值对,代码会将当前键和值拼接成一个字符串,并赋值给$neirong变量。
第五行:如果$neirong不为空,说明已经有之前的键值对存在,代码会在已有的字符串后面添加一个换行符和新的键值对。
总结:通过这个循环,代码会将$_POST数组中的所有键值对拼接成一个字符串,每个键值对之间用换行符分隔。最后,生成的留言内容存储在$neirong变量中。
- 找到页面:http://127.0.0.1/zbzcms.com/cms/common/php/ajax.php?run=liuyan,post相关payload
- 还是个存储型的,后台留言框被插入了
SQL注入
- 全据搜索select语句,查看有没有sql语句,也是重点先看前台的注入。
- 这里找到一处select的sql语句,并且id变量是可控的
- 尝试sqlmap跑一下: python3 sqlmap -u "http://127.0.0.1/zbzcms.com/cms/common/php/ajax.php?run=ad&id=1" --dbs
任意文件写入
- 同样的我们全局搜索一下容易出现任意文件写入漏洞的函数,比如file_put_contents
- 但是这里漏洞就是在后台了,尝试构造payload:http://127.0.0.1/zbzcms.com/cms/cms/admin/run_ajax.php?run=wenjian_edit,post方式请求
- 成功写入后台
- 写入1.php文件中
- 访问1.php,成功解析
任意文件删除
- 这里可以自动审计一下
- 可以看到这里使用了unlink函数,并且变量没有任何过滤
- 构造payload验证一下,定位路由位置:cms/cms/include/up.php,创建test.txt
- 尝试删除test.txt
- test.txt被成功删除
后记
代码审计其实就是找危险函数的调用关系,看是否存在可控变量的调用链。纯白盒的方式大概就是这样,但是现实挖漏洞更多的也要结合黑盒与断点调试的方式。这次就先写到这里,后面我们再会。
本文为 青青草原羊真香 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
php代码审计学习笔记-xhcms
2023-09-28
java反射探讨
2023-09-07
burpLab——sql注入学习笔记
2023-08-27
文章目录