当前位置: 首页 > news >正文

BugKu实战:从备份文件泄露到PHP弱类型漏洞的完整利用链

1. 从备份文件泄露开始的信息收集

做CTF题目时,信息收集永远是第一步。很多运维人员为了方便,会在服务器上留下备份文件,比如.bak.swp.git等。这些文件往往包含了源代码、配置文件等敏感信息。我在实战中遇到过不少因为备份文件泄露导致的安全问题,这次我们就从备份文件泄露开始,一步步拿到flag。

首先,我们需要使用工具对目标网站进行目录扫描。这里推荐使用dirsearch,它是一个基于Python的目录扫描工具,速度快、效果好。安装也很简单,直接克隆GitHub仓库即可:

git clone https://github.com/maurosoria/dirsearch.git cd dirsearch

运行dirsearch扫描目标网站:

python3 dirsearch.py -u http://example.com -e php,bak,swp

参数说明:

  • -u:指定目标URL
  • -e:指定要扫描的文件扩展名,这里我们重点关注php、bak和swp文件

扫描完成后,如果运气好,可能会发现类似index.php.bak这样的备份文件。这就是我们的突破口。

2. 分析泄露的PHP源码

假设我们通过dirsearch扫描发现了index.php.bak文件,下载下来分析它的内容。通常备份文件就是源代码的副本,我们可以直接查看其中的逻辑。

从题目给出的源码来看,关键部分是这样的:

$str = strstr($_SERVER['REQUEST_URI'], '?'); $str = substr($str,1); $str = str_replace('key','',$str); parse_str($str); echo md5($key1); echo md5($key2); if(md5($key1) == md5($key2) && $key1 !== $key2){ echo $flag."取得flag"; }

这段代码的逻辑很清晰:

  1. 从URL中获取查询字符串
  2. 去掉所有的'key'字符串(这是个干扰项)
  3. 解析查询字符串为变量
  4. 比较$key1和$key2的md5值,如果相等且$key1不等于$key2,就输出flag

这就是典型的PHP弱类型比较漏洞。PHP在比较时会进行类型转换,导致一些特殊的值在比较时会出现意想不到的结果。

3. PHP弱类型比较漏洞详解

PHP的弱类型比较是个老生常谈的问题了,但在CTF中依然经常出现。理解这个漏洞的原理,对安全测试很有帮助。

PHP中有两种比较运算符:

  • ==:松散比较,会进行类型转换
  • ===:严格比较,不会进行类型转换

在本题中,使用的是==比较,这就给了我们可乘之机。具体来说,当比较两个值的md5时,有以下几种绕过方式:

3.1 使用数组绕过

md5函数无法处理数组,如果传入数组,md5会返回NULL。因此,可以构造两个不同的数组,它们的md5值都是NULL,在松散比较时会被认为相等。

payload示例:

http://example.com/?kekeyy1[]=a&kekeyy2[]=b

3.2 使用科学计数法绕过

PHP在处理以"0e"开头的字符串时,会将其解释为科学计数法(0乘以10的n次方),结果就是0。因此,如果两个不同的字符串经过md5后都变成"0e"开头的形式,它们的松散比较就会相等。

已知的一些md5后为"0e"开头的字符串:

  • 240610708 → 0e462097431906509019562988736854
  • QNKCDZO → 0e830400451993494058024219903391
  • s878926199a → 0e545993274517709034328855841020

payload示例:

http://example.com/?kekeyy1=240610708&kekeyy2=QNKCDZO

4. 构造payload获取flag

根据上面的分析,我们可以构造两种不同的payload来获取flag。

4.1 数组绕过法

这种方法简单直接,适用于大多数PHP弱类型比较的场景。构造URL如下:

http://example.com/?kekeyy1[]=a&kekeyy2[]=b

注意观察题目源码中的str_replace('key','',$str),它会去掉所有的'key'字符串。所以我们在参数名中使用'kekeyy',经过替换后变成'keyy',这样就能保留我们需要的变量名。

4.2 科学计数法绕过法

这种方法需要找到特定的字符串,但更加隐蔽。使用已知的md5碰撞字符串:

http://example.com/?kekeyy1=240610708&kekeyy2=QNKCDZO

这两种方法都能满足md5($key1) == md5($key2) && $key1 !== $key2的条件,从而获取到flag。

5. 防御措施

作为开发者,如何避免这类安全问题呢?我有几点建议:

  1. 不要使用松散比较:在安全相关的代码中,始终使用===进行严格比较。
  2. 妥善处理备份文件:不要在web目录下存放备份文件,如果必须存放,确保配置服务器不解析这些文件。
  3. 使用hash_equals函数:PHP提供了hash_equals函数来安全地比较哈希值,它能防止时序攻击。
  4. 定期安全审计:使用自动化工具扫描网站,检查是否存在备份文件泄露等常见问题。

6. 实战中的思考

在实际渗透测试中,备份文件泄露是个很常见的入口点。我遇到过不少案例,都是通过扫描发现了备份文件,进而分析出更严重的漏洞。比如有一次,通过.git目录泄露,我拿到了完整的源代码,进而发现了数据库配置信息,最终获取了整个系统的控制权。

对于CTF选手来说,掌握这些基础漏洞的原理和利用方法非常重要。它们往往是更复杂攻击链的第一步。建议新手多练习这类基础题目,理解其中的原理,而不仅仅是记住payload。

http://www.cnnetsun.cn/news/1951258.html

相关文章:

  • APK加固效果验证指南:如何判断防破解方案靠不靠谱?
  • BlenderCompat:Windows 7用户运行最新版Blender的终极兼容方案
  • 快速在Windows上安装APK的终极指南:告别安卓模拟器
  • AI教材生成全流程,使用低查重AI写教材,质量有保障!
  • AI教材编写秘籍:低查重技巧大揭秘,让教材生成更高效!
  • 别再瞎写SystemVerilog约束了!这5个dist/inside/->的实战坑你踩过几个?
  • Qwen3-ForcedAligner-0.6B部署教程:Ubuntu 22.04 + NVIDIA驱动适配指南
  • 你的SSD1306 OLED屏闪烁、花屏?可能是初始化时序和命令顺序没搞对
  • 3分钟掌握Windows窗口置顶技巧:AlwaysOnTop提升多任务效率200%
  • 从模块整合到数据持久化:第九届蓝桥杯单片机省赛核心功能实现剖析
  • 别再手动拔跳线帽了!STM32串口下载的“一键下载”电路原理与实战(附FlyMcu配置)
  • ESP32-S3 + Air780E 4G模块实战:手把手教你实现图片HTTP上传(附完整代码)
  • 手把手教你用Wireshark抓包分析CPRI/eCPRI协议:从光模块信号到IQ数据映射实战
  • 2025届毕业生推荐的六大AI辅助写作平台实测分析
  • 014、损失函数与优化器:针对大模型微调的调参策略
  • ESP32+LVGL8.1实战:用陀螺仪模拟编码器输入(附完整代码)
  • SEK2 (MKK4/MAP2K4) 最全深度解析:从信号通路、分子机制到疾病研究与实验应用
  • 第11天:转化策略:从首购到复购的平滑路径
  • 用Python+Selenium爬取高德地图充电桩数据,自动存Excel保姆级教程
  • ESP32-WROVER-E/IE模组硬件选型与外围电路设计实战
  • 区间动态规划精解
  • 失业了可以死磕的网站
  • 软件市场的需求分析与竞争策略
  • GitHub Pages博客免费上HTTPS,我用腾讯云SSL证书3小时搞定(附DNS验证避坑点)
  • 别再到处找下载链接了!Linux系统压力测试工具stress和stress-ng最新稳定版安装包获取指南
  • 别只盯着内核!RT-Thread v5.2.2里这些开发工具和测试框架的更新,同样能提升你的效率
  • MySQL 查询缓存机制详解
  • STM32用JLink OB死活连不上?别急,试试串口先救个场(附详细接线图)
  • 缠论可视化插件ChanlunX:让复杂技术分析变得一目了然
  • 扩散模型 vs GAN:哪个更适合你的图像生成任务?(含对比实验)