ThinkPHP非强制路由漏洞

ThinkPHP非强制路由漏洞

通过unserialize触发

通过phar触发

与文件操作相关的函数执行 phar://xxx 时,会自动进行反序列化操作,而再构造phar文件时,我们可以自行添加想要进行序列化的内容

一、理解ThinkPHP路由原理

1、路由规则

在默认的 /tpdemo/route/route.php 文件中,定义了默认路由:

// 定义了匿名控制器,访问 /public/route.php 时,直接返回结果
Route::get('think', function () {
    return 'hello,ThinkPHP5!';
});


// 访问地址 /public/hello/woniu 对应控制器为:Index,对应方法:hello,对应参数名:name,对应参数值:woniu
Route::get('hello/:name', 'index/hello');

// 自定义以下路由,那么控制器代码应该如何写?
Route::get("test$","Test/index");  // 以 $ 结尾表示 URL以test 结尾
Route::get("test/demo/:a/:b","Test/demo");  //:a :b  分别表示参数a和b

2、控制器

以下代码位于: /tpdemo/application/index/controller/Test.php

<?php

namespace app\index\controller;

class Test {
    public function index() {
        echo "Test -- Index";
    }

    public function demo($a,$b) {
        echo $a + $b;
    }
}

?>

3、访问路径

上述控制器Test由于定义了路由规则,所以按照正常的路由规则访问即可:

http://192.168.230.188/tpdemo/public/test

image-20240905224429632

http://192.168.230.188/tpdemo/public/test/demo/100/200

image-20240905224506010

事实上,ThinkPHP为了考虑与早期八本的兼容性,默认保留了兼容模式,只要定义了类文件,即使不定义路由规则,也可以直接访问,这类参数再 /tpdemo/config/app.php 的全局配置文件中可以看到

image-20240905230407453

所以,基于兼容模式和非强制路由的情况下,我们可以直接不在定义路由规则的情况下,直接使用兼容模式访问控制并传参

http://192.168.230.188/tpdemo/public/index.php?s=index/test/index

http://192.168.230.188/tpdemo/public/index.php?s=index/test

http://192.168.230.188/tpdemo/public?s=index/test

以上三种情况的访问结果均是 Test – Index

image-20240905230823676

传参的URL不同模式

http://192.168.230.188/tpdemo/public/index.php?s=index/test/demo/a/100/b/100

http://192.168.230.188/tpdemo/public?s=index/test/demo/a/100/b/100

image-20240905231016522

http://192.168.230.188/tpdemo/public/index.php?s=index/test/demo&a=100&b=100

image-20240905231100965

4、自动加载机制

image-20240905231749313

二、搜索潜在漏洞

image-20240905231819907

三、漏洞调用分析

URL地址访问时,注意路径使用斜杠(/),类的路径使用反斜杠(\),此时,基本上就可以通过这样的方法调用任意类中的任意方法,然后传参

image-20240905231836737

比如这里的第一个URL地址

image-20240905233032370

调用的是 下图这个方法think控制器下的Request类的input方法

image-20240905233401749

然后

image-20240905233458360

image-20240905233637845

### ThinkPHP5 RCE漏洞详细分析 #### 漏洞概述 ThinkPHP是一款广泛使用的PHP开发框架,在多个版本中存在远程代码执行(RCE)漏洞。这些漏洞主要由变量覆盖引起,特别是在`thinkphp/library/think/Request.php`文件中的`method`方法允许攻击者通过特定参数覆盖类的核心属性`filter`,进而触发RCE[^1]。 #### 影响范围 受影响的主要版本包括但不限于5.0.23之前的版本。具体来说,获取HTTP请求方法的方式存在问题,未正确过滤输入数据,使得攻击者能够调用`Request`类内的任意公共函数并构建恶意利用链路,最终实现远程代码执行[^2]。 #### 攻击向量 当应用程序未启用强制路由模式时,如果开发者未能充分验证传入的控制器名称,则可能导致未经授权访问内部功能接口的情况发生。这种情况下,攻击者只需构造特制URL即可绕过正常的安全机制来执行任意PHP代码片段或操作系统指令[^3]。 ```bash http://example.com/index.php?s=/Home/Index/index&method=call_user_func_array&function=var_dump¶ms[][a]=b ``` 上述示例展示了如何利用此漏洞发起一次简单的测试性质的探测尝试(实际环境中应遵循合法授权流程)。请注意,这里仅用于说明目的,并不鼓励任何形式法行为。 #### 修复建议 为了防止此类安全风险的发生: - **升级至最新稳定版**:官方已经发布补丁解决了已知的安全隐患,请及时更新到最新的ThinkPHP发行版本。 - **严格控制外部输入**:对于所有来自客户端的数据都应当实施严格的校验措施,特别是涉及到路径解析、查询字符串解析等场景下的敏感操作。 - **禁用不必要的特性**:关闭那些容易被滥用的功能选项,比如动态加载模块支持或是自定义路由规则等功能;同时考虑设置更严格的权限策略限制某些API端点只响应内网流量。 - **增强日志审计能力**:部署完善的监控体系以便于第一时间发现异常活动迹象,并定期审查服务器上的各类记录文档寻找潜在威胁信号。 ```diff // 修改配置文件 application/config.php 中的相关项如下所示: 'route_check_cache' => false, 'disable_functions' => 'exec,passthru,shell_exec,system', 'app_debug' => true, 'url_route_on' => false, ``` 以上修改旨在减少可能存在的安全隐患,提高系统的整体安全性水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值