一次任意文件下载之代码审计
字数 1376 2025-08-15 21:31:21

任意文件下载漏洞代码审计与利用实战教学

漏洞概述

任意文件下载漏洞(Arbitrary File Download)是一种常见的Web安全漏洞,允许攻击者通过构造特殊参数下载服务器上的任意文件,可能导致敏感信息泄露、系统沦陷等严重后果。

漏洞发现过程

1. 初始发现

  • 发现文档下载链接,形式可能为:http://example.com/download.php?file=example.pdf
  • 通过修改file参数尝试下载其他文件,如:/index.php

2. 信息收集

  • 成功下载首页文件index.php后,尝试从中提取敏感信息:
    • 数据库连接配置(用户名、密码、主机等)
    • 系统路径信息
    • 其他包含文件线索

3. 源码获取

  • 通过index.php中的注释信息或特定代码片段:
    • 使用搜索引擎(Baidu/Google)搜索相关关键词
    • 在GitHub等代码托管平台搜索特定代码片段
  • 成功找到并下载相关源码进行审计

漏洞利用链

1. 任意文件下载 → 信息泄露

  • 直接下载关键系统文件获取敏感信息
  • 分析系统架构和配置

2. 发现文件包含漏洞

  • 审计发现系统存在文件包含漏洞
  • 利用条件:
    • PHP版本 < 5.3.4
    • magic_quotes_gpc设置为OFF
  • 利用%00截断技术:
    http://localhost/index.php?a=../xxx.php%00

3. 寻找上传点

  • 在源码中发现Kindeditor编辑器组件
  • 定位到上传接口:upload_json.php

4. 构造图片上传

  • 通过编辑器上传功能构造图片上传
  • 上传路径示例:/uploadfile/image/20190410/20190410211839_24249.jpg

5. 文件包含Getshell

  • 结合文件包含漏洞和上传的图片文件:
    http://localhost/index.php?a=../uploadfile/image/20190410/20190410211839_24249.jpg%00
  • 通过图片中包含的恶意代码获取Webshell

漏洞代码分析

任意文件下载漏洞代码

典型的有缺陷下载代码:

$file = $_GET['file'];
header('Content-type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . basename($file) . '"');
readfile($file);

问题点:

  1. 直接使用用户输入的file参数
  2. 未对文件路径进行校验和限制
  3. 使用basename()不足以防止目录遍历

文件包含漏洞代码

$page = $_GET['a'];
include($page . '.php');

问题点:

  1. 未过滤用户输入
  2. 在PHP旧版本中可利用%00截断

防御措施

1. 任意文件下载防御

  • 白名单限制可下载文件
  • 校验文件路径是否在允许目录内
  • 使用文件ID而非直接路径
  • 示例修复代码:
$allowed = ['file1.pdf', 'file2.doc'];
$file = $_GET['file'];
if(in_array($file, $allowed)) {
    $path = '/safe/directory/' . $file;
    // 其他下载逻辑
} else {
    die('Invalid file request');
}

2. 文件包含防御

  • 避免动态包含用户可控文件
  • 使用白名单机制
  • 更新PHP版本(>=5.3.4)
  • 示例修复代码:
$pages = ['home', 'about', 'contact'];
$page = $_GET['a'];
if(in_array($page, $pages)) {
    include($page . '.php');
} else {
    include('404.php');
}

3. 文件上传防御

  • 校验文件类型(内容而非扩展名)
  • 重命名上传文件
  • 设置上传目录不可执行
  • 限制上传文件大小

渗透测试方法论

  1. 信息收集:通过下载文件获取系统信息
  2. 源码审计:分析下载的源代码寻找其他漏洞
  3. 漏洞链构造:结合多个漏洞实现更高危攻击
  4. 权限提升:从文件下载到获取系统控制权

总结

本案例展示了如何通过任意文件下载漏洞获取系统信息,结合源码审计发现文件包含漏洞,最终通过文件上传功能实现Getshell的完整过程。这种漏洞链利用方式在实际渗透测试中非常常见,防御时需要采取多层次的安全措施。

任意文件下载漏洞代码审计与利用实战教学 漏洞概述 任意文件下载漏洞(Arbitrary File Download)是一种常见的Web安全漏洞,允许攻击者通过构造特殊参数下载服务器上的任意文件,可能导致敏感信息泄露、系统沦陷等严重后果。 漏洞发现过程 1. 初始发现 发现文档下载链接,形式可能为: http://example.com/download.php?file=example.pdf 通过修改 file 参数尝试下载其他文件,如: /index.php 2. 信息收集 成功下载首页文件 index.php 后,尝试从中提取敏感信息: 数据库连接配置(用户名、密码、主机等) 系统路径信息 其他包含文件线索 3. 源码获取 通过 index.php 中的注释信息或特定代码片段: 使用搜索引擎(Baidu/Google)搜索相关关键词 在GitHub等代码托管平台搜索特定代码片段 成功找到并下载相关源码进行审计 漏洞利用链 1. 任意文件下载 → 信息泄露 直接下载关键系统文件获取敏感信息 分析系统架构和配置 2. 发现文件包含漏洞 审计发现系统存在文件包含漏洞 利用条件: PHP版本 < 5.3.4 magic_quotes_gpc 设置为OFF 利用%00截断技术: http://localhost/index.php?a=../xxx.php%00 3. 寻找上传点 在源码中发现Kindeditor编辑器组件 定位到上传接口: upload_json.php 4. 构造图片上传 通过编辑器上传功能构造图片上传 上传路径示例: /uploadfile/image/20190410/20190410211839_24249.jpg 5. 文件包含Getshell 结合文件包含漏洞和上传的图片文件: http://localhost/index.php?a=../uploadfile/image/20190410/20190410211839_24249.jpg%00 通过图片中包含的恶意代码获取Webshell 漏洞代码分析 任意文件下载漏洞代码 典型的有缺陷下载代码: 问题点: 直接使用用户输入的 file 参数 未对文件路径进行校验和限制 使用 basename() 不足以防止目录遍历 文件包含漏洞代码 问题点: 未过滤用户输入 在PHP旧版本中可利用%00截断 防御措施 1. 任意文件下载防御 白名单限制可下载文件 校验文件路径是否在允许目录内 使用文件ID而非直接路径 示例修复代码: 2. 文件包含防御 避免动态包含用户可控文件 使用白名单机制 更新PHP版本(>=5.3.4) 示例修复代码: 3. 文件上传防御 校验文件类型(内容而非扩展名) 重命名上传文件 设置上传目录不可执行 限制上传文件大小 渗透测试方法论 信息收集 :通过下载文件获取系统信息 源码审计 :分析下载的源代码寻找其他漏洞 漏洞链构造 :结合多个漏洞实现更高危攻击 权限提升 :从文件下载到获取系统控制权 总结 本案例展示了如何通过任意文件下载漏洞获取系统信息,结合源码审计发现文件包含漏洞,最终通过文件上传功能实现Getshell的完整过程。这种漏洞链利用方式在实际渗透测试中非常常见,防御时需要采取多层次的安全措施。