2023春秋杯春季赛 qqcms复现
闲着无聊,发现phpstorm中还留有一个代码审计的题,当时比赛的时候没做出来,那么就复现一下
环境搭建
直接在官网中下载源码:https://down.q-cms.cn/QCMS_V6.0.1_220515.zip
用phpstudy搭建,web目录如下
然后创建一个数据库,导入sql文件,设置手机号以及密码就安装成功了
但是我不是在本机搭建的,就需要添加远程调试,phpstudy扩展开启xdebug,然后修改php.ini为:
1 | [Xdebug] |
注意的是xdebug.remote_host
需要为本机ip,最后搞个路径映射即可
代码审计(前台)
可以看到注册的时候执行了$this->UserObj->ExecDelete();
将默认管理员用户给删除了
所以说我们不能通过默认账号密码进后台,又使用了PDO预编译处理,无法进行sql注入
看到Lib/Config/Controllers.php
中的ControllersAdmin
不仅仅验证了User_Token
,还验证了qc_user表中的UserId是否存在,所以说通过token登录也失败了
就看看前台的相关功能了,相关的文件为:
1 | System/Controller/index.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
直接进行的拼接,使用../
穿越即可
配合文件读取利用
总结
文件上传白名单写死了
也找不到反序列化与命令执行,开摆!
代码审计,一定要耐心+动调,这样才称得上健全