thinkphp日志泄漏漏洞_Thinkphp5-x远程代码执行漏洞分析

本文详细分析了ThinkPHP5.x版本中的一个安全漏洞,该漏洞源于路由处理中的缺陷,允许攻击者通过注入恶意代码利用反射类调用命名空间内的任意内置类,从而实现远程代码执行。影响范围包括多个版本。漏洞利用条件包括存在特定模块且未开启强制路由。文章深入剖析了漏洞的成因,涉及的关键函数及路由检查过程,并展示了漏洞如何被触发和利用。
摘要由CSDN通过智能技术生成

漏洞介绍

Thinkphp5.x版本(5.0.20)中没有对路由中的控制器进行严格过滤,在存在admin、index模块、没有开启强制路由的条件下(默认不开启),导致可以注入恶意代码利用反射类调用命名空间其他任意内置类,完成远程代码执行。

影响版本

THINKPHP 5.0.5-5.0.22

THINKPHP 5.1.0-5.1.30

漏洞分析

这里选择对5.0.20版本进行分析,关键函数开头

/thinkphp/library/think/App.php:120

$dispatch = self::$dispatch;

// 未设置调度信息则进行 URL 路由检测

if (empty($dispatch)) {

$dispatch = self::routeCheck($request, $config);

}

// 记录当前调度信息

$request->dispatch($dispatch);

// 记录路由和请求信息

if (self::$debug) {

Log::record('[ ROUTE ] ' . var_export($dispatch, true), 'info');

Log::record('[ HEADER ] ' . var_export($request->header(), true), 'info');

Log::record('[ PARAM ] ' . var_export($request->param(), true), 'info');

}

// 监听 app_begin

Hook::listen('app_begin', $dispatch);

// 请求缓存检查

$request->cache(

$config['request_cache'],

$config['request_cache_expire'],

$config['request_cache_except']

);

$data = self::exec($dispatch, $config);

进入self::routeCheck函数,进行路由检查

/thinkphp/library/think/App.php:120

public static function routeCheck($request, array $config)

{

$path = $request->path();

........................

}

进入$request->path()函数

/thinkphp/library/think/Request.php:416行

public function path()

{

if (is_null($this->path)) {

$suffix   = Config::get('url_html_suffix');

$pathinfo = $this->pathinfo();

if (false === $suffix) {

// 禁止伪静态访问

$this->path = $pathinfo;

} elseif ($suffix) {

// 去除正常的URL后缀

$this->path = preg_replace('/\.(' . ltrim($suffix, '.') . ')$/i', '', $pathinfo);

} else {

// 允许任何后缀访问

$this->path = preg_replace('/\.' . $this->ext() . '$/i', '', $pathinfo);

}

}

return $this->path;

}

进入$this->pathinfo()函数

/thinkphp/library/think/Request.php:384行

public function pathinfo()

{

if (is_null($this->pathinfo)) {

if (isset($_GET[Config::get('var_pathinfo')])) {

// 判断URL里面是否有兼容模式参数

$_SERVER['PATH_INFO'] = $_GET[Config::get('var_pathinfo')];

unset($_GET[Config::get('var_pathinfo')]);

} elseif (IS_CLI) {

// CLI模式下 index.php module/controller/action/params/...

$_SERVER['PATH_INFO'] = isset($_SERVER['argv'][1]) ? $_SERVER['argv'][1] : '';

}

// 分析PATHINFO信息

if (!isset($_SERVER['

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值