昨天传的沸沸扬扬的Thinkphp RCE,分析了一下看了看,其实是个相当鸡肋的漏洞,话不多说,咱们进入正题
补丁链接:
https://github.com/top-think/framework/commit/4c328dc99c575f61b58742a46b053f3e7c0b7a32
靶机环境搭建:
Composer安装存在漏洞版本的thinkphp,修改app/middleware.php 开启多语言
问题存在于thinkmiddlewareLoadLangPack
跟入vendor/topthink/framework/src/think/middleware/LoadLangPack.php
handle函数
![Thinkphp文件包含漏洞分析及复现 Thinkphp文件包含漏洞分析及复现]()
关键函数为detect,进入参数污染阶段
![Thinkphp文件包含漏洞分析及复现 Thinkphp文件包含漏洞分析及复现]()
可以在这三处污染$langSet
![Thinkphp文件包含漏洞分析及复现 Thinkphp文件包含漏洞分析及复现]()
当语言设置中allow_lang_list 为空时,成功污染参数,并将污染后的参数返回
![Thinkphp文件包含漏洞分析及复现 Thinkphp文件包含漏洞分析及复现]()
此时$langset 已经为经过我们污染的参数,跟入函数switchLangSet
vendor/topthink/framework/src/think/Lang.php
![Thinkphp文件包含漏洞分析及复现 Thinkphp文件包含漏洞分析及复现]()
此时参数污染至load 函数,跟入load函数
vendor/topthink/framework/src/think/Lang.php
![Thinkphp文件包含漏洞分析及复现 Thinkphp文件包含漏洞分析及复现]()
此时参数污染至parse函数
vendor/topthink/framework/src/think/Lang.php
![Thinkphp文件包含漏洞分析及复现 Thinkphp文件包含漏洞分析及复现]()
由于vendor/topthink/framework/src/think/Lang.php:switchLangSet将尾缀直接拼接,所以type为php,成功包含
简单写个poc,在根目录创建个1.php
打一下
![Thinkphp文件包含漏洞分析及复现 Thinkphp文件包含漏洞分析及复现]()
成功包含
看一下修复方案
![Thinkphp文件包含漏洞分析及复现 Thinkphp文件包含漏洞分析及复现]()
将污染后的值进行了正则匹配,过滤掉了../不再能跳目录,所以修复了
凌日实验室近期内可能会进行公众号迁移,望周知
原文始发于微信公众号(远洋的小船):Thinkphp文件包含漏洞分析及复现
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论