前言
划水的时候无意中看到了一篇关于极致CMS代码审计的文章,正好无事可做,照着文章上的复现一波,在此记录一下
参考文章:
审计思路以及环境准备
从极致CMS官网的版本更新日志中发现最新版本较上一版本的更新差异
查看v1.8
的更新日志
说明在上一版本存在SQL语句报错信息直接显示到页面上的问题,因此我们将v1.7.1
版本下载下来,进行代码审计,重点审计SQL注入
这里代码调试环境我们选择JetBrains的IDEA,通过xdebug进行php代码的调试
CMS源代码下载链接:极致CMS--v1.7.1
由于一些我也不太清楚的原因,我只能把代码解压到网站根目录才可以正常进行安装和访问,之前审计laravel时也出现过问题,通过设置vhost解决
审计过程
我们直接切入主题,查看SQL语句执行的地方,随便找一个SQL查询的语句
通过上面的方式,找到进行SQL查询的代码
打开对应文件C:\phpStudy\PHPTutorial\WWW\123\jizhicms_Beta1.7.1\FrPHP\Extend\DB_API.php
查看SQL查询相关代码
跟入getData
方法
跟入query
方法
可以看到这里SQL语句是没有进行任何过滤的
直接调用pdo的query方法进行数据库的查询,这里我们全局搜索一下DB_API这个类调用的地方,发现一共只有一处:C:\phpStudy\PHPTutorial\WWW\static\common\user\uedit\php\Uploader.class.php
的387行,且只调用了其set_table
方法,因此这个地方我们并没有办法去利用,因此需要再去寻找一处可以进行传参的SQL语句查询代码
通过参考文章了解到,该CMS查询SQL的方法为find和findAll,因此我们只需要全局搜索find方法出现的地方即可
在C:\phpStudy\PHPTutorial\WWW\Home\c\MypayController.php
找到符合条件的代码
使用chrome的postman插件构造出报错注入的payload即可触发SQL报错注入:
构造请求http://localhost/index.php/mypay/alipay_return_pay?out_trade_no=1%27%20and%20updatexml(1,concat(0x7e,(select%20version()),0x7e),1)--+%22