深度剖析任意文件读取删除漏洞,将漏洞危害扩至最大
字数 2289 2025-10-01 14:05:44

任意文件读取/删除漏洞深度剖析与利用教学文档

一、 漏洞定义与原理

  1. 漏洞定义

    • 任意文件读取漏洞:存在于文件查看功能处,由于程序未对用户传入的文件路径参数进行严格的过滤与限制,攻击者可以通过构造特殊路径(如目录遍历../)读取服务器上的任意敏感文件。
    • 任意文件删除漏洞:存在于文件删除功能处,同样由于路径过滤不严,攻击者可以删除服务器上的关键文件,导致服务中断、权限提升或为后续攻击铺平道路。
  2. 漏洞原理

    • 根本原因在于未对用户输入进行安全校验。程序直接将用户可控的参数(如fileName)拼接在基础路径后,形成最终的操作路径。
    • 攻击者利用路径遍历序列(../ 跳出程序预期的目录限制,访问或操作预期之外的文件系统区域。
  3. 常见触发点

    • 文件查看、下载、预览的接口。
    • 文件删除、备份文件恢复、数据库恢复的接口。
    • 图片、附件等资源加载的接口。

二、 漏洞危害(最大化利用思路)

该漏洞绝不仅仅是“中危”,通过精心利用,其危害可被扩至最大,直接导致服务器沦陷。

  1. 信息收集与后续攻击基础

    • 读取数据库配置文件:获取MySQLMSSQLRedis等数据库的连接账号、密码。这可以直接导致:
      • 直接Getshell:通过数据库功能写入Webshell(需具备写权限和已知路径)。文中推荐了图形化工具MDUTSyla来简化此过程。
      • 窃取敏感数据:直接导出数据库中的用户信息、业务数据等。
    • 读取网站源码:通过读取WEB-INF/web.xml*.jsp*.class等文件,进行白盒代码审计,发现更多深层次的安全漏洞。
  2. 系统权限突破与持久化

    • 读取系统敏感文件
      • Linux/etc/passwd(系统用户信息,可用于爆破)、/etc/shadow(用户密码哈希,可尝试破解)、/home/用户名/.bash_history(用户历史命令,或包含密码、敏感操作等信息)、~/.ssh/id_rsa(SSH私钥,用于直接登录服务器)。
      • Windowsc:/windows/repair/sam(系统初次安装的密码哈希)、C:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini(FTP服务配置,含路径和密码)。
    • 删除关键系统文件:删除/.ssh/authorized_keys/etc/passwd等,破坏系统正常登录或运行,造成拒绝服务。
  3. 应用配置与凭证泄露

    • 读取Web服务器配置文件(如httpd.confnginx.conf),获取虚拟主机路径、反向代理规则等敏感配置。
    • 读取应用框架配置文件(如php.iniresin.conf),了解环境设置。
    • 读取其他服务的配置文件,如/etc/vsftpd/vsftpd.conf
  4. 社会工程学与横向移动

    • 读取社交软件图片与缓存:如果服务器上安装了社交软件(如Telegram、QQ),可能读取到用户的聊天图片、缓存文件,获取更多敏感信息用于社工其他系统。
    • 读取DNS配置/etc/hosts):了解内网域名映射,为内网横向移动做准备。

三、 漏洞检测与利用方法

  1. 手工检测

    • 拦截文件操作功能的HTTP请求(使用Burp Suite)。
    • 修改文件参数(如fileNamenamepath),尝试使用../进行目录遍历。
    • Payload示例
      • ../../../../../../etc/passwd
      • ....//....//....//....//windows/win.ini(双重编码或特殊绕过)
      • C:\Program Files\MySQL\my.ini
  2. 自动化工具

    • 使用Burp SuiteIntruder模块对参数进行Fuzz,加载目录遍历字典。
    • 使用专门的扫描器或漏洞POC脚本。

四、 代码审计案例(JFinal框架)

文章提供了一个完美的代码审计实例:

  1. 漏洞位置/admin/database/delete 接口。
  2. 漏洞代码分析
    public void delete() {
        String name = getPara("name"); // 直接获取用户输入的"name"参数
        BackupUtils.delete(name); // 将参数传入删除函数
        renderJson(Feedback.success(new HashMap<>()));
    }
    
    // 在BackupUtils.delete函数中:
    public static void delete(String backupName){
        // 直接将用户输入的backupName拼接到Web根路径下
        File backupFile = new File(PathKit.getWebRootPath() + "/" + CommonAttribute.BACK_PATH + "/" + backupName);
        ...
        FileUtils.deleteQuietly(backupFile); // 执行删除操作
    }
    
  3. 漏洞复现
    • 正常请求:name=backup_20250926.sql
    • 恶意请求:将name参数修改为/../1.txt
    • 结果:程序最终操作的路径变为 [WebRoot]/[BACK_PATH]/../1.txt,即跳出了备份目录,删除了Web根目录下的1.txt文件,验证了任意文件删除漏洞。

五、 修复建议

  1. 输入验证与过滤

    • 对用户输入的文件名进行严格的白名单校验,只允许特定的字符集(如字母、数字、下划线)和文件类型。
    • 如果必须包含路径,则禁止出现../..\:等特殊字符。
  2. 路径规范化与校验

    • 使用getCanonicalPath()或类似函数获取文件的绝对路径,并检查该路径是否在程序允许的预期目录范围内。
    • 示例代码(Java)
      File file = new File(BASE_DIR, userInput);
      String canonicalPath = file.getCanonicalPath();
      if (!canonicalPath.startsWith(BASE_DIR_CANONICAL)) {
          // 抛出错误,路径非法
      }
      
  3. 最小权限原则:运行Web服务的操作系统账户应具有最小权限,仅能读写必要的目录,从而即使漏洞存在,也能极大限制其危害范围。


总结
任意文件读取/删除漏洞是一个“宝藏”漏洞,是通往服务器核心权限的捷径。其危害远不止信息泄露,通过读取配置、源码、密钥,并结合其他漏洞(如数据库弱口令、SSH弱口令),可以轻松实现从外网到内网的完整突破。在代码审计和渗透测试中,应对所有文件操作参数保持高度敏感。

希望这份详细的文档能对您有所帮助!

任意文件读取/删除漏洞深度剖析与利用教学文档 一、 漏洞定义与原理 漏洞定义 : 任意文件读取漏洞 :存在于文件查看功能处,由于程序未对用户传入的文件路径参数进行严格的过滤与限制,攻击者可以通过构造特殊路径(如目录遍历 ../ )读取服务器上的任意敏感文件。 任意文件删除漏洞 :存在于文件删除功能处,同样由于路径过滤不严,攻击者可以删除服务器上的关键文件,导致服务中断、权限提升或为后续攻击铺平道路。 漏洞原理 : 根本原因在于 未对用户输入进行安全校验 。程序直接将用户可控的参数(如 fileName )拼接在基础路径后,形成最终的操作路径。 攻击者利用 路径遍历序列( ../ ) 跳出程序预期的目录限制,访问或操作预期之外的文件系统区域。 常见触发点 : 文件查看、下载、预览的接口。 文件删除、备份文件恢复、数据库恢复的接口。 图片、附件等资源加载的接口。 二、 漏洞危害(最大化利用思路) 该漏洞绝不仅仅是“中危”,通过精心利用,其危害可被扩至最大,直接导致服务器沦陷。 信息收集与后续攻击基础 : 读取数据库配置文件 :获取 MySQL 、 MSSQL 、 Redis 等数据库的连接账号、密码。这可以直接导致: 直接Getshell :通过数据库功能写入Webshell(需具备写权限和已知路径)。文中推荐了图形化工具 MDUT 和 Syla 来简化此过程。 窃取敏感数据 :直接导出数据库中的用户信息、业务数据等。 读取网站源码 :通过读取 WEB-INF/web.xml 、 *.jsp 、 *.class 等文件,进行白盒代码审计,发现更多深层次的安全漏洞。 系统权限突破与持久化 : 读取系统敏感文件 : Linux : /etc/passwd (系统用户信息,可用于爆破)、 /etc/shadow (用户密码哈希,可尝试破解)、 /home/用户名/.bash_history (用户历史命令,或包含密码、敏感操作等信息)、 ~/.ssh/id_rsa (SSH私钥,用于直接登录服务器)。 Windows : c:/windows/repair/sam (系统初次安装的密码哈希)、 C:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini (FTP服务配置,含路径和密码)。 删除关键系统文件 :删除 /.ssh/authorized_keys 、 /etc/passwd 等,破坏系统正常登录或运行,造成拒绝服务。 应用配置与凭证泄露 : 读取Web服务器配置文件(如 httpd.conf 、 nginx.conf ),获取虚拟主机路径、反向代理规则等敏感配置。 读取应用框架配置文件(如 php.ini 、 resin.conf ),了解环境设置。 读取其他服务的配置文件,如 /etc/vsftpd/vsftpd.conf 。 社会工程学与横向移动 : 读取社交软件图片与缓存 :如果服务器上安装了社交软件(如Telegram、QQ),可能读取到用户的聊天图片、缓存文件,获取更多敏感信息用于社工其他系统。 读取DNS配置 ( /etc/hosts ):了解内网域名映射,为内网横向移动做准备。 三、 漏洞检测与利用方法 手工检测 : 拦截文件操作功能的HTTP请求(使用Burp Suite)。 修改文件参数(如 fileName 、 name 、 path ),尝试使用 ../ 进行目录遍历。 Payload示例 : ../../../../../../etc/passwd ....//....//....//....//windows/win.ini (双重编码或特殊绕过) C:\Program Files\MySQL\my.ini 自动化工具 : 使用 Burp Suite 的 Intruder 模块对参数进行Fuzz,加载目录遍历字典。 使用专门的扫描器或漏洞POC脚本。 四、 代码审计案例(JFinal框架) 文章提供了一个完美的代码审计实例: 漏洞位置 : /admin/database/delete 接口。 漏洞代码分析 : 漏洞复现 : 正常请求: name=backup_20250926.sql 恶意请求:将 name 参数修改为 /../1.txt 。 结果 :程序最终操作的路径变为 [WebRoot]/[BACK_PATH]/../1.txt ,即跳出了备份目录,删除了Web根目录下的 1.txt 文件,验证了任意文件删除漏洞。 五、 修复建议 输入验证与过滤 : 对用户输入的文件名进行严格的 白名单 校验,只允许特定的字符集(如字母、数字、下划线)和文件类型。 如果必须包含路径,则禁止出现 ../ 、 ..\ 、 : 等特殊字符。 路径规范化与校验 : 使用 getCanonicalPath() 或类似函数获取文件的绝对路径,并检查该路径是否在程序允许的预期目录范围内。 示例代码(Java) : 最小权限原则 :运行Web服务的操作系统账户应具有最小权限,仅能读写必要的目录,从而即使漏洞存在,也能极大限制其危害范围。 总结 : 任意文件读取/删除漏洞是一个“宝藏”漏洞,是通往服务器核心权限的捷径。其危害远不止信息泄露,通过读取配置、源码、密钥,并结合其他漏洞(如数据库弱口令、SSH弱口令),可以轻松实现从外网到内网的完整突破。在代码审计和渗透测试中,应对所有文件操作参数保持高度敏感。 希望这份详细的文档能对您有所帮助!