CISCN 2026 Web MediaDrive
a. 漏洞概述
在 preview.php 这个文件中,通过特定文件名的拼接,利用函数 iconv() 的转码漏洞,实现文件读取,最终获得 flag。
b. 代码审计
将 user 这个对象序列化,存到 cookie 中,使用的时候再将它反序列化,赋值给变量 $user。
采用 GET 方式获取 f 的值,之后将它和 user 对象里面的 basePath 拼接,赋值给变量 $rawPath。其中 basePath 是 user 对象里面的一个属性,是我们构造特定文件名的利用点。
将拼接好的变量 $rawPath 和特定字符串进行比较,之后利用函数 iconv 进行转码,之后再通过文件读取获得内容。以下是根据 PHP 手册对 iconv 函数的描述:

c. payload 构建
既然代码最后是通过文件读取来获得内容,那我们就构建一个特殊的名称,在网页的根目录之下读取 flag 这个文件,也就是 /flag——这是我们期望得到的。但是 preview.php 添加了正则匹配校验(preg_match 函数),并不能直接读取 f 为 flag。
但是我们可以:
- 修改 user 里面的
basePath,改为/ - 将原有编码格式修改为
UTF-7 - 把预览界面的 f 赋值为
f%c2lag
这里详细说一下原理:当变量 $rawPath 被拼接成 /f%c2lag 的时候,通过正则校验的时候,虽然 preg_match() 函数只认 UTF-8 的编码,但是单独出现的 %c2 是脏字符,它之后的内容会被忽略,也就是存在一个截断效果,最终函数识别出来的内容就只有 /f,所以可以绕过正则校验。之后的编码转换 iconv(UTF-7, "UTF-8//IGNORE", $rawPath),这种情况下编码转换时遇到无法识别的内容就自动忽略,然后转换后面的内容,最后得到 /flag,然后通过文件读取,获得 flag。
Tip:关于脏字符截断
| 场景 | 遇到 %c2 的行为 | 结果 |
|---|---|---|
preg_match 正则(UTF-8) | 截断,后面内容全部不读 | 输入 /f%c2lag,正则看到 /f |
iconv(UTF-7 → UTF-8) | 只删掉脏字节,后面内容保留 | 输入 /f%c2lag,输出 /flag |
d. Burp Suite 实操
修改 user 对象里面的 $basePath 和原编码体系。EXP(将结果替换到原 cookie 的位置):
之后打开 Burp Suite,进入预览界面,将 f 改为 f%c2lag,然后发包,得到 flag:








