Thinkphp5 文件包含
前言
最近在复现tp漏洞,sql注入略显鸡肋,但更主要是学习框架漏洞挖掘的思路和方法。跟一跟框架方法实现流程,也算是一种漏洞学习吧。
参考文章:ThinkPHP5漏洞分析之文件包含(七)
七月火师傅…介绍比较完全,该篇漏洞算是简单的了,跟一跟变量就可以知道原因,但还是想学习下框架模板解析流程。
环境搭建
tp版本:5.0.18
文件内容
- 视图目录下写入index.html模板文件
- 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;
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!