闲着无聊,发现phpstorm中还留有一个代码审计的题,当时比赛的时候没做出来,那么就复现一下

环境搭建

直接在官网中下载源码:https://down.q-cms.cn/QCMS_V6.0.1_220515.zip

用phpstudy搭建,web目录如下

然后创建一个数据库,导入sql文件,设置手机号以及密码就安装成功了

但是我不是在本机搭建的,就需要添加远程调试,phpstudy扩展开启xdebug,然后修改php.ini为:

1
2
3
4
5
6
7
8
9
10
11
12
13
[Xdebug]
zend_extension=C:/phpstudy_pro/Extensions/php/php7.3.4nts/ext/php_xdebug.dll
xdebug.collect_params=1
xdebug.collect_return=1
xdebug.auto_trace=On
xdebug.trace_output_dir=C:/phpstudy_pro/Extensions/php_log/php7.3.4nts.xdebug.trace
xdebug.profiler_enable=On
xdebug.profiler_output_dir=C:/phpstudy_pro/Extensions/php_log/php7.3.4nts.xdebug.profiler
xdebug.remote_enable=On
xdebug.remote_host=192.168.111.1
xdebug.remote_port=9002
xdebug.remote_handler=dbgp
xdebug.idekey = PHPSTORM

注意的是xdebug.remote_host需要为本机ip,最后搞个路径映射即可

代码审计(前台)

可以看到注册的时候执行了$this->UserObj->ExecDelete();将默认管理员用户给删除了

所以说我们不能通过默认账号密码进后台,又使用了PDO预编译处理,无法进行sql注入
看到Lib/Config/Controllers.php中的ControllersAdmin

不仅仅验证了User_Token,还验证了qc_user表中的UserId是否存在,所以说通过token登录也失败了

就看看前台的相关功能了,相关的文件为:

1
2
3
4
System/Controller/index.php
System/Controller/install.php
System/Controller/home.php
System/Controller/api/common.php

mysql探针

先看到 install.php 的 checkDb_Action 函数,存在一个PDO远程连接数据库

随便设置一个POST进行测试:
Name=123&Host=192.168.111.1&Port=6666&Accounts=1&Password=1

那么是不是可以 mysql client 任意文件读取呢,很可惜的是php pdo默认禁用

可参考:
CSS-T | Mysql Client 任意文件读取攻击链拓展
2022春秋杯联赛 传说殿堂赛道 sql_debug题目解析

phpinfo泄露

在home.php倒是存在 phpinfo_Action ,但也没啥用

默认Secret登录

最后看到index.php,发现有个大的 muLogin_Action,如果Secret为md5($this->SysRs['Secret']),就直接成为管理员登录

而 Secret 在 qcms.sql 也给了默认值为 123456 ,md5后为 e10adc3949ba59abbe56e057f20f883e

直接/index/muLogin?Secret=e10adc3949ba59abbe56e057f20f883e,成功登录后台,妥妥的后门

可以配合/api/common/sys获取系统信息

访问得到 Secret

标签内sql注入

万能标签:列表形式调用数据库里任何数据

1
{{loop sql='select * from qc_user'}}

首先搜索这里很明显存在反射型xss,没啥好说的/index/search.html?Search="><script>alert(1)</script>

看到search_Action

跟进tempRun,发现对页面解析了所有的标签

跟进loop_Tmp,看到对页面进行了正则匹配,正好我们通过Search传参可以在页面写入标签

执行sql语句,修改账号密码

1
{{loop sql='update qc_user set Password=md5(114514),Phone=16666666666'}}test{{/loop}}

即可登录后台

参考:
2023年春秋杯春季赛-WriteUp By EDISEC

代码审计(后台)

后台漏洞就很多了,简单看看吧

后台任意文件读取

引入组件:引入一些通用代码页面,比如一个网站的导航和底部都是一样的,就单独做一个组件,通过include标签引入

1
{{include filename='component_header.html'/}}

直接在模版标签测试这里使用引入组件,尝试目录穿越到 win.ini
{{include filename='../../../../Windows/win.ini'/}}

根据相关功能,看到System/Controller/admin/templates.php

没有任何过滤的文件读取,通过/admin/templates/edit.html?Name=../../../../../Windows/win.ini读文件

后台目录遍历

看到System/Controller/admin/api.php

直接进行的拼接,使用../穿越即可

配合文件读取利用

总结

文件上传白名单写死了

也找不到反序列化与命令执行,开摆!

代码审计,一定要耐心+动调,这样才称得上健全