ThinkPHP远程代码执行隐患(需满足特定条件)

- AV AC AU C I A
发布: 2025-04-13
修订: 2025-04-13

### 简要描述: 其某处处理存在安全隐患,开发者一不小心就可能写出有漏洞的代码造成任意代码执行。 ### 详细说明: 这个问题之前看ThinkSNS就发现了: [WooYun: ThinkSNS getshell一枚](http://www.wooyun.org/bugs/wooyun-2013-043945) ThinkSNS由于使用ThinkPHP模板,造成任意代码执行。 下面分析下ThinkPHP实现细节 模板类是ThinkPHP中一个重要的类,主要实现了为模板变量赋值,模板解析和输出模板变量的逻辑,其中模板变量的赋值通过assign函数进行,模板变量的解析通过display函数,模板编译通过fetch函数,这一系列对模板的读写与编译操作导致了漏洞的产生。 先看编译,在ThinkPHP\Lib\Core\View.class.php的fetch函数中: ``` public function fetch($templateFile='',$content='',$prefix='') { … … … if('php' == strtolower(C('TMPL_ENGINE_TYPE'))) { // 使用PHP原生模板 // 模板阵列变量分解成为独立变量 extract($this->tVar, EXTR_OVERWRITE); // 直接载入PHP模板 empty($content)?include $templateFile:eval('?>'.$content); }else{ … … … } ``` 在ThinkPHP启用了原生模板的情况下,会调用extract把当前tVar导入到变量表里,然后会检测$content变量是否存在,如果存在就eval之,否则include $templateFile。 可以看到这里使用了extract函数,extract作用是从数组中把变量导入到当前的符号表中,而第二个参数表示如果有冲突,就覆盖已有变量。因此此处如果$this->tVar可控的话,那么就可以覆盖底下的$templateFile变量造成任意文件包含或覆盖$content造成任意代码执行。 漏洞的触发点就是上述的函数,而导致漏洞发生的参数可以通过模板变量赋值函数assign传入: ThinkPHP\Lib\Core\View.class.php...

0%
暂无可用Exp或PoC
当前有0条受影响产品信息