一次对基于thinkphp开发程序的审计
2022-11-15 10:30:0 Author: xz.aliyun.com(查看原文) 阅读量:16 收藏

最近想加强各种web的审计,刚好有朋友抛出了一套基于thinkphp5.1开发的代码,就借此机会看一次。下载源码按照教程安装,瞎点点看看功能,开始审计。

thinkphp的系统代码结构一般大同小异,这里需要去看thinkphp的开发文档,这里重点关注application(主程序),puiblic(公开)文件夹,这是一个多应用系统,托thinkphp的福,代码很容易就能看懂理清楚。

失败的文件上传测试

/index/controller/upload.php
这是图片上传代码片段,很明显是一个白名单的拦截,文件上传也同样使用了白名单

还有一个音频上传接口,这里直接把文件重命名了,没有中间件解析漏洞配合的话,文件上传漏洞因该是没有的

sql注入

全局搜索sql查询语句,如query,$sql,select(,where(等,尝试找一找在where字段直接进行拼接或使用原始sql查询语句的代码,找到两处,一个一个看

第一处


这里直接将参数拼接到了sql语句里,然后执行db->query(),流程中没有涉及到参数过滤,尝试找一下注入。它是一个私有函数,需要去找调用点,全局搜索census()函数调用

可以看到,传入的参数并不受用户控制,无法注入

第二处

/seller/model/chat.php
/seller/controller/log.php

这个sql语句也是直接拼接,但语句构造过程很复杂,为了偷懒,这里选择直接去看数据库查询日志,看看拼接到最后是个什么查询语句。找到函数调用的接口,路由在/seller/log/getChatLogDetail,发起请求

查询数据库搜索日志

由于from_id和to_id都被用了两次,而且在构造时还有换行,不太好拼接注释,所以尝试在content位置尝试like型注入。发包

注入成功,查看查询日志,可以看到%' or 1=1#已经拼接上了没有被处理,造成了sql注入。

任意文件读取

/seller/controller/words.php
全局搜索file_put_contents和file_get_content,可以看到这里从项目根目录读取文件,路径由words参数传入

构造请求并查看数据库

可以看到,文件内容已经入库

可以通过注入或者进入该页面查看读取到的文件

插件和thinkphp历史漏洞

/public/static/common/js/ueditor
这里使用了ueditor插件,直接访问查看帮助,使用的版本是1.4.3(这个版本只有asp下有漏洞,php无法绕过后缀过滤)。另外thinkphp5.1有一个反序列化漏洞,但全局搜索后未调用unserialize()函数,因此并不能利用这个漏洞。至此,整个审计流程结束(流程本应包含对命令执行函数,文件包含等代码的审计,但由于过程中没有收获,这里就不放出来)。


文章来源: https://xz.aliyun.com/t/11838
如有侵权请联系:admin#unsafe.sh