0x001 开发方式
在审计源码时根据不同的开发方式对应不同的审计方法。
- 自写:有的站点虽然使用了thinkphp但并没有按照官方给的开发文档进行开发,没有引入内置的过滤机制导致出现安全问题。 (正常审计流程。)
- 不安全写法:未全部引用内置过滤。(寻找没有引用内置过滤的地方。)
- 规则写法:这种开发方式是相对安全的,因为框架的过滤机制比较完善。审计方式一般分为两种,寻找对应的版本漏洞或自己挖掘框架内置的安全问题(通杀)。
0x002 审计流程
1)启用调试开关
- 查看index.php入口文件
- config.php
- app_debug=“true”
- app_trace-“true”
配置好后打开网站
访问url对应所执行的文件
查看执行的sql语句
debug模式可能会监控不到sql语句的输出,这种情况可以使用开源工具进行监控:
MySQL监控:https://github.com/cw1997/MySQL-Monitor
2)版本查看
- /thinkphp/base.php
- /ThinkPHP/ThinkPHP.php
- /thinkphp/library/think/App.php
3)定位函数
定位相关函数:
- 查看路由匹配规则 --> 可以直接定位到函数
- 通过调试debug模式 --> 只能定位到文件
我们访问的网页为:http://192.168.8.130/hsycms/news/146.html
则如何定位所对应的执行函数?
查看路由匹配规则,全局搜索use think\Route
我们访问的url对应的路由匹配规则为Route::rule($v['entitle'].'/:id','index/Show/index');
程序入口文件为app
,即如下图所示:
4)测试是否存在漏洞
这里我们监控http://192.168.8.130/hsycms/news/150.html
页面所执行的sql语句,
可以看到我们传入的id被直接带入到sql语句执行,接下来就是测试input
函数是否有过滤
对比ThinkPHP5.0完全开发手册
发现这里并没有按照官方文档进行编写,这种自写的方式可能没有调用框架内置的过滤机制,从而导致安全问题,剩下就是测试自写的方式是否存在漏洞就可以了,我就不测试了。
5)版本自身漏洞
如何完全按照官方开发文档进行开发的,那么我们就考虑当前版本安全问题。
ThinkPHP各版本漏洞:https://github.com/Mochazz/ThinkPHP-Vuln
使用搜索引擎查看当前版本是否存在安全漏洞。