Web安全·信息泄露与PHP特性绕过

入门—简单篇 | 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松散比较==和严格比较===的区别,松散比较会自动转类型,这个“特性”在安全场景下就是个坑。两个典型的绕过手法:

MD50e绕过:当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读源码 + 多阶过滤差异绕过

思路:逐层读源码发现两层过滤规则差异利用差异绕过

核心:过滤规则的差异永远是最大的漏洞

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

0xBADCODE

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值