freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

php代码审计篇二——ZbzCMS
青青草原羊真香 2023-10-16 17:28:16 124371

有段时间没有更新了,这段时间一直在对一些项目重点保护,所以学习有些滞后,但是审代码一直是我比较感兴趣的事,这次也是选择用自己学到的方法结合网上一些已知的漏洞进行审计,希望我的文章也能给想做代审的小伙伴提供思路。

环境搭建

  • 环境部署好后,访问localhost/zbzcms.com

1697447459_652cfe23e49349208b5b9.png!small1697447487_652cfe3f270dd2101775b.png!small


1697447508_652cfe542fe5e2d8ec8b6.png!small


  • 发布后才有前台

1697447527_652cfe678f9b6f4fe935e.png!small


1697447549_652cfe7ddda7613d2d3a6.png!small



XSS漏洞

  • echo全局搜索函数,优先找前台产生漏洞的地方

1697447574_652cfe964e94a163d69e5.png!small


1697447592_652cfea8c6d2b2423cefe.png!small


  • search.php里面无漏洞

1697447846_652cffa690b87da4b0d86.png!small

  • cms/api/difangzhan.php里也无漏洞:$difang_json受到$url影响,$url也是写死的ip

1697447867_652cffbb7966a5c38622b.png!small

  • 关注到一个post地方,传入$neirong

1697447886_652cffce38f1a9ee23ce3.png!small

  • post['neirong']受到变量$neirong控制

1697447906_652cffe2df02f77e9d5d9.png!small

  • 可以看到这段代码要求$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

1697447931_652cfffbcf08a6d462ba9.png!small


1697447949_652d000d63dc77b6f0b3a.png!small

  • 还是个存储型的,后台留言框被插入了

1697447969_652d0021b50a657419b33.png!small

SQL注入

  • 全据搜索select语句,查看有没有sql语句,也是重点先看前台的注入。

1697448002_652d0042b78f9e7aa4a49.png!small

  • 这里找到一处select的sql语句,并且id变量是可控的

1697448020_652d005406b80d459e6c2.png!small

  • 尝试sqlmap跑一下: python3 sqlmap -u "http://127.0.0.1/zbzcms.com/cms/common/php/ajax.php?run=ad&id=1" --dbs

1697448053_652d00759e03cdba0dbca.png!small

任意文件写入

  • 同样的我们全局搜索一下容易出现任意文件写入漏洞的函数,比如file_put_contents

1697448076_652d008c9c51c904507d6.png!small

  • 但是这里漏洞就是在后台了,尝试构造payload:http://127.0.0.1/zbzcms.com/cms/cms/admin/run_ajax.php?run=wenjian_edit,post方式请求1697448097_652d00a1ab07b0e2a226a.png!small

1697448116_652d00b4a75dc214067a1.png!small


  • 成功写入后台

1697448142_652d00ce1f47a29ed3ee6.png!small

  • 写入1.php文件中

1697448170_652d00eab245626e77020.png!small

  • 访问1.php,成功解析

1697448191_652d00ff352c40b1047d9.png!small



任意文件删除

  • 这里可以自动审计一下

1697448212_652d01148daee8f5f06a4.png!small

  • 可以看到这里使用了unlink函数,并且变量没有任何过滤

1697448229_652d01259f866b8f8ab16.png!small

  • 构造payload验证一下,定位路由位置:cms/cms/include/up.php,创建test.txt

1697448253_652d013da09ef8f75adcf.png!small

  • 尝试删除test.txt

1697448271_652d014f6adfac0069810.png!small


  • test.txt被成功删除

1697448293_652d0165d21f431c0878f.png!small

后记

代码审计其实就是找危险函数的调用关系,看是否存在可控变量的调用链。纯白盒的方式大概就是这样,但是现实挖漏洞更多的也要结合黑盒与断点调试的方式。这次就先写到这里,后面我们再会。

# xss # SQL注入 # php代码审计
本文为 青青草原羊真香 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
青青草原羊真香 LV.4
这家伙太懒了,还未填写个人描述!
  • 9 文章数
  • 9 关注者
php代码审计学习笔记-xhcms
2023-09-28
java反射探讨
2023-09-07
burpLab——sql注入学习笔记
2023-08-27
文章目录