本地文件包含怎么验证
当参数的取值被拼进包含类调用(PHP 的 include/require、模板引擎的模板名、语言包加载路径)时,攻击者可以用路径穿越或绝对路径去包含服务器上的文件,从而读取源码、配置与凭据。验证的关键是「参数语义」而非盲目试路径:先找一个疑似文件名的参数,替换为一个已知存在的无害文件路径,对比页面输出与报错信息的变化,就能判断包含是否成立。
基本信息
| 典型入口 | 模板名、语言包、页面路由、文件下载与预览参数 |
|---|---|
| 信号 | 页面内容随参数变化、报错暴露包含路径 |
| 历史分布 | PHP 等动态语言的历史系统中最常见 |
| 验证边界 | 只读验证,不写入文件,不做日志投毒 |
| 修复方向 | 禁止用户输入直接控制包含路径,改用白名单映射的模板标识 |
典型使用场景
- 老系统评估中的常规项,尤其是自研模板与路由机制
- 文件下载与预览接口的参数分析
- 排查「传入不同参数页面结构不同」这类现象
- 评估修复方案:白名单映射是否覆盖全部入口
- 与目录穿越类问题合并评估,判断读取范围
验证步骤
验证步骤
# 1. 找疑似文件名参数:page=、lang=、tpl=、file=、view=
curl -s 'https://example.com/index.php?page=home'
# 2. 替换为一个已知存在的无害文件路径(如系统自带的说明文件),对比输出变化
curl -s 'https://example.com/index.php?page=../../etc/hostname'
# 3. 观察报错信息中出现的包含路径与文件名
# 4. 记录参数、现象与影响(不保存目标文件内容)
# 不使用日志投毒方式验证:写入的内容难以清理,且会改变目标环境现象与判断
| 现象 | 含义 | 处置 |
|---|---|---|
| 页面内容随参数变化且返回文件内容 | 包含成立,可读取文件 | 列缺陷并按读取范围定级 |
| 返回文件内容但被截断 | 部分读取或存在过滤 | 记录过滤规则,评估绕过可能性 |
| 报错暴露包含路径 | 存在包含行为但被限制 | 作为独立信息泄露问题记录 |
| 页面无任何变化 | 参数未进入包含或已白名单化 | 记录为已核查 |
修复视角:把用户输入映射为固定的模板标识(如数字 ID 到文件的映射表),而不是直接拼路径;需要动态加载时用白名单枚举。
不要用日志投毒方式验证:写入的内容会留在目标环境,清理困难且影响业务,属于高风险验证手段。