思维导图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PRQXubax-1650602498323)(image53/0.png)]
漏洞关键字:
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 等
代码执行:
eval assert preg_replace call_user_func call_user_func_array 等
命令执行:
system exec shell_exec `` passthru pcntl_exec popen proc_open
变量覆盖:
extract() parse_str() importrequestvariables() $$等
反序列化:
serialize() unserialize() __construct __destruct 等
其他漏洞:
unlink() file_get_contents() show_source() file() fopen()等
通用关键字:
$_GET,$_POST,$_REQUEST,$_FILES,$_SERVER 等
功能点或关键字分析可能存在漏洞
抓包或搜索关键字找到代码出处及对应文件
追踪过滤或接受的数据函数,寻找触发此函数或代码的地方进行触发测试
演示案例:
Metinfo-无框架-变量覆盖-自动审计或搜索
#变量覆盖配合文件包含实现任意文件包含
自动审计或搜索关键字找到文件及代码段,全局配置文件
搜索或访问触发全局配置文件配合手写代码测试变量覆盖
配合文件包含漏洞覆盖指定文件实现文件包含攻击获取权限
追踪$module 变量出处文件,然后分析如何覆盖它达到目的
Payload:/about/index.php?fmodule=7&module=1.txt
变量覆盖
文件导入Seay后可以用“自动审计”对程序进行一个简单的分析,其他工具也有该功能
自动审计提示“/include/common.inc.php”中有“$$”可能存在变量覆盖漏洞,从目录和文件名推断该文件应该是配置文件
变量覆盖漏洞一般先看配置型文件,因为配置型文件会被其他文件包含、使用,有利于排查漏洞
在“/include/common.inc.php”的一处遍历中,将数组“array(‘_COOKIE’,’_POST’,’_GET’)”的键值依次赋给“$_request”,比如“$_request”等于“_COOKIE”,那么“$$_request”也就等于“$_COOKIE”
上述函数可以接收参数的键值,使变量名等于参数名,导致变量覆盖,换言之,该函数可以接收对任意变量的赋值
所有包含该代码的页面都存在变量覆盖漏洞,只需再找到可控变量就可以利用漏洞
这里选择配合文件包含漏洞进行利用,查找关键字“include_once”,发现文件“/about/index.php”存在可控变量“$module”
查看代码发现“/about/index.php”包含“/include/module.php”,该文件又包含/include/common.inc.php”,漏洞存在
搜索可控变量“$module”,了解到控制该变量需要fmodule=7,构建Payload“192.168.0.101.9009/about/index.php?fmodule=7&module=1.txt”
后续只需要上传一个任意格式的后门文件代替“1.txt”即可
phpmydmin-无框架-反序列化-自动审计或搜索
#反序列化
自动审计或搜索关键字找到文件及代码段
__wakeup() //使用 unserialize 时触发
__sleep() //使用 serialize 时触发
__destruct() //对象被销毁时触发
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用 isset()或 empty()触发
__unset() //在不可访问的属性上使用 unset()时触发
__toString() //把类当作字符串使用时触发
__invoke() //当脚本尝试将对象调用为函数时触发
找到__wakeup()代码段,代码段调用函数中存在 eval 等函数操作,可调式 load
构造 getSource()利用 Payload,实现 file_get_contents 函数配合 eval 执行
Payload:action=test&configuration=O:10:"PMA_Config":1:{s:6:"source",s:11:"d:/test.txt";}
搜索关键字“unserialize”,发现“set.php”使用了该函数,使用unserialize()时会自动触发对象的__wakeup()
查看代码发现“set.php”创建了一个“$PMA_Config”对象,找到对象的声明,再找到对象的“__wakeup()”方法
读代码发现“__wakeup()”下的“load()”函数使用了“eval()”“file_get_contents()”函数,存在文件读取操作
为了触发反序列化漏洞需要访问set.php,并POST“configuration”“action”两个参数,其中“action”不等于“clear”,“configuration”则等于序列化的“$PMA_Config”对象,对象的值为“test.txt”
构建Payload:“127.0.0.1:8081/phpmyadmin2/scripts/setup.php”Post“action=test&configuration=O:10:"PMA_Config":1:{s:6:"source",s:11:"d:/test.txt";}”
将test.txt替换为需要的文件,可以配合其他漏洞利用该漏洞
Thinkphp5-有框架-搭建使用入口访问调试 SQL 等
#Thinkphp5 简要知识点
入口文件,调试模式,访问路由,访问对应,内置安全等
测试访问不同方法名,不同文件不同方法名
测试常规写法 SQL 注入,TP5 规定写法 SQL 注入
现在TP5最为常见,以前则是3.23
使用PHPstudy搭建TP5时,网站目录指向public文件夹
搭建好TP5打开网页会显示“:) ThinkPHP V5”
入口文件位于“public/index.php”,默认为“APPlication”,可以修改,通过修改“APP_PATH”的值实现
URL访问格式“http://domainName/index.php/模块/控制器/操作”,其中“模块”指目录名,“控制器”指PHP文件名,“操作”指函数名
地址中的“index.php”可加可不加
“APPlication/ index/controller”目录下,有默认自带测试页面“Index.php”,访问地址为“http://domainName/index.php/index/index/index”,“controller”未体现在地址中
通过GET传参x=1,可以是“地址/x/1”,也可以是“地址?x=1”
访问数据库除了一般的写法外,还有一种写法“db(‘users’)->where(‘id’,$id)->select();”,其效果等于“$sql=”select * from injection.users where id=$id”;”,但是Seay无法监控其SQL语句,该写法也可以避免一部分SQL注入
调试模式开启:打开“APPlication/config.php”,将“应用调试模式”和“应用Trace”都改为“true”,再次打开网站,右下角会有调试模式开关,可以监控SQL语句
TP漏洞的两点方向
Thinkphp的写法:查找这个版本有无漏洞
自定义的写法:常规的漏洞挖掘