入门—简单篇 | CTF Web 写题笔记
★ 考点偏基础和语言特性,适合开胃菜,跟着复现就行
暨南大学 · 一流网络Web挑战赛

一、Sensitive_information_leakage — 敏感信息泄露
▶ 先聊点知识
信息泄露看似小问题,但在CTF里几乎是突破的第一步。想想看,能直接拿到源码或配置,后面的漏洞利用就是照本宣科。常见的3种泄露形式:
① 备份文件:.bak、.txt、~、.swp — 编辑器或版控自动生成的备份,直接访问就下载源码
② 版控残留:.git、.svn目录 — 最经典,用GitHacker等工具能完整恢复仓库
③ 查源代码:最简单也最实用,开发者经常在HTML注释里留调试信息、隐藏表单、内部接口
④ 扫描工具:dirsearch、gobuster、征战子 — 自动扫常见备份名和隐藏路径,效率起飞
▶ 复现过程
页面提示“你不应该做点什么吗”,大意就是让你去翻隐藏信息。先看源代码:
view-source:http://139.199.162.176/Sensitive_information_leakage/
一看源码,发现有index.php.txt,访问一下源码就泄露了:

逻辑超简单:$_GET['name'] === 'GDJNU_TOWERE_3_CTF' 就输出flag。直接拼URL就拿到了。这题重点不是“解”,而是“找”——源码泄露让一切变得透明。
⭐ 本题小结
考点:敏感信息泄露(源码备份文件)
思路:查源代码 → 发现index.php.txt → 获取源码 → 直接构造请求
防御:删备份、禁访问备份后缀、关调试模式
二、为你写诗 — MD5弱比较 + strcmp数组绕过
▶ 先聊点知识
PHP松散比较==和严格比较===的区别,松散比较会自动转类型,这个“特性”在安全场景下就是个坑。两个典型的绕过手法:
MD5的0e绕过:当MD5值以"0e"开头且后面全是数字时,PHP会当成科学计数法(0e123 = 0)。所有0e开头的MD5在松散比较下都等于0,彼此相等!
240610708 → md5 = 0e462097431906509019562988996676
QNKCDZO → md5 = 0e830400451993494058024219903391
两个值不一样,但MD5都是0e开头,==比较下都是0,所以相等。PHP 8.0+已修复,但CTF的PHP一般还是5.x/7.x,绕过依然有效。
strcmp数组绕过:strcmp()传入数组时返回null,而!null = true。只要把参数改成数组传入(如v3[]=1),就能绕过基于strcmp的所有校验。
这个思路很通用:任何期望字符串的函数(strcasecmp、md5等)传数组都会返回null,配合取反就变true。PHP弱类型的坑不止这一个,像"admin" == 0也很常见,因为PHP把非数字字符串转成0。
▶ 复现过程
源码里两个考点组合:

考点一:$v1 != $v2 && md5($v1) == md5($v2),用经典的0e绕过字符串v1=240610708, v2=QNKCDZO。
考点二:!strcmp($v3, $flag),直接传数组v3[]=1,strcmp返回null,!null = true。
http://139.199.162.176/Code_Php/index.php?v1=240610708&v2=QNKCDZO&v3[]=1
⭐ 本题小结
考点:MD5弱比较0e绕过 + strcmp数组绕过
思路:0e开头的MD5值在松散比较下都等于0;数组传参让strcmp返回null
注意:PHP 8.0+已修复0e绕过,但CTF环境一般还是旧版
三、the page is empty — 文件包含 + 多阶过滤绕过
▶ 先聊点知识
LFI(本地文件包含)是PHP题的常客。当代码里有include($_GET['file']),而file参数我们可控,那就能读服务器上任意文件。关键是怎么读源码?因为直接包含PHP文件会被执行,看不到源码。
答案是php://filter伪协议:
php://filter/convert.base64-encode/resource=目标文件
输出的是Base64编码后的源码,解码就看到原文件。PHP还有其他伪协议:php://input(可执行POST进来的代码)、data://(直接注入代码)、phar://(配合反序列化)。不同过滤条件下选不同协议是解题关键。
本题精华在于多阶过滤。两层过滤规则不一样:include1过滤了flag但没过滤base,include2过滤了base但没过滤flag。利用这个差异就能突破。核心思路:不要想一步绕过所有过滤,而是找不同层的差异。
▶ 复现过程
页面空白,但源码里有include1.php,URL也已经是文件包含形式?file=index。第一步用filter读include1源码:
http://1.12.230.190/include1.php?file=php://filter/convert.base64-encode/resource=include1
解码发现:过滤了http/data/ftp/input/%00/flag、禁止..、长度限100、自动加.php。Cookie提示了include2.php。第二步读include2源码:
http://1.12.230.190/include1.php?file=php://filter/convert.base64-encode/resource=include2
include2过滤了base但没过滤flag!直接读flag:
http://1.12.230.190/include1.php?file=php://filter/convert.base64-encode/resource=flag

▶ 补充:LFI过滤绕过套路
截断后缀:%00空字节截断(PHP<5.3.4)或超长路径截断
目录穿越:..被过滤时试双编码(..%2f、%2e%2e/、..%252f)
伪协议:php://input、data://等不包含被过滤关键字,可绕过关键字过滤
日志/会话包含:写恶意代码到Session或日志,再包含执行
⭐ 本题小结
考点:LFI漏洞 + php://filter读源码 + 多阶过滤差异绕过
思路:逐层读源码 → 发现两层过滤规则差异 → 利用差异绕过
核心:过滤规则的“差异”永远是最大的漏洞

455

被折叠的 条评论
为什么被折叠?



