Thinkphp5 文件包含

前言

最近在复现tp漏洞,sql注入略显鸡肋,但更主要是学习框架漏洞挖掘的思路和方法。跟一跟框架方法实现流程,也算是一种漏洞学习吧。

参考文章:ThinkPHP5漏洞分析之文件包含(七)
七月火师傅…介绍比较完全,该篇漏洞算是简单的了,跟一跟变量就可以知道原因,但还是想学习下框架模板解析流程。

环境搭建

tp版本:5.0.18

文件内容

  1. 视图目录下写入index.html模板文件
  2. index控制器写入当前漏洞测试语句

漏洞复现

模拟上传功能,public目录下创建shell.jpg

payload:http://127.0.0.1:8899/?cacheFile=shell.jpg

漏洞原理

extract变量覆盖、inlucde文件包含不当且可控.

漏洞分析

分析思路很明确只要跟踪传入的变量即可.但我还是走一遍流程,仔细阅读了tp模板解析时候的操作。

assgin方法执行流程

assign操作为接收requests->get()对象,并提取其中的变量,为后续渲染模板提供参数值。

assign方法将接收到的参数值存入$this->data值中,并返回$this对象

data= $name => {cacheFIle => "shell.jpg"}[1]

至此$this对象囊括了如下变量信息

fetch执行流程

/think/view.php fetch()方法用于解析和获取模板内容。重点关注模板变量$var

$var值为$this->data值传入[assign方法的返回值]。跟进第163行中的$method,调用/library/think/Template.php fetch方法

代码2-25行执行目的是判断是否存在缓存文件,不存在则编译创建缓存文件。

第29行read()读取缓存文件.查看具体代码

extract将第二个参数值设置为EXTR_OVERWRITE导致变量覆盖

$vars={cacheFIle=>'shell.jpg'}注册为变量 => $cacheFile='shell.jpg';

include之解析shell.jpg中的php代码

漏洞修复

include $cacheFile; => include $this->cacheFile;