最近想加强各种web的审计,刚好有朋友抛出了一套基于thinkphp5.1开发的代码,就借此机会看一次。下载源码按照教程安装,瞎点点看看功能,开始审计。
thinkphp的系统代码结构一般大同小异,这里需要去看thinkphp的开发文档,这里重点关注application(主程序),puiblic(公开)文件夹,这是一个多应用系统,托thinkphp的福,代码很容易就能看懂理清楚。
/index/controller/upload.php
这是图片上传代码片段,很明显是一个白名单的拦截,文件上传也同样使用了白名单
还有一个音频上传接口,这里直接把文件重命名了,没有中间件解析漏洞配合的话,文件上传漏洞因该是没有的
全局搜索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参数传入
构造请求并查看数据库
可以看到,文件内容已经入库
可以通过注入或者进入该页面查看读取到的文件
/public/static/common/js/ueditor
这里使用了ueditor插件,直接访问查看帮助,使用的版本是1.4.3(这个版本只有asp下有漏洞,php无法绕过后缀过滤)。另外thinkphp5.1有一个反序列化漏洞,但全局搜索后未调用unserialize()函数,因此并不能利用这个漏洞。至此,整个审计流程结束(流程本应包含对命令执行函数,文件包含等代码的审计,但由于过程中没有收获,这里就不放出来)。