深度剖析任意文件读取删除漏洞,将漏洞危害扩至最大
字数 2289 2025-10-01 14:05:44
任意文件读取/删除漏洞深度剖析与利用教学文档
一、 漏洞定义与原理
-
漏洞定义:
- 任意文件读取漏洞:存在于文件查看功能处,由于程序未对用户传入的文件路径参数进行严格的过滤与限制,攻击者可以通过构造特殊路径(如目录遍历
../)读取服务器上的任意敏感文件。 - 任意文件删除漏洞:存在于文件删除功能处,同样由于路径过滤不严,攻击者可以删除服务器上的关键文件,导致服务中断、权限提升或为后续攻击铺平道路。
- 任意文件读取漏洞:存在于文件查看功能处,由于程序未对用户传入的文件路径参数进行严格的过滤与限制,攻击者可以通过构造特殊路径(如目录遍历
-
漏洞原理:
- 根本原因在于未对用户输入进行安全校验。程序直接将用户可控的参数(如
fileName)拼接在基础路径后,形成最终的操作路径。 - 攻击者利用路径遍历序列(
../) 跳出程序预期的目录限制,访问或操作预期之外的文件系统区域。
- 根本原因在于未对用户输入进行安全校验。程序直接将用户可控的参数(如
-
常见触发点:
- 文件查看、下载、预览的接口。
- 文件删除、备份文件恢复、数据库恢复的接口。
- 图片、附件等资源加载的接口。
二、 漏洞危害(最大化利用思路)
该漏洞绝不仅仅是“中危”,通过精心利用,其危害可被扩至最大,直接导致服务器沦陷。
-
信息收集与后续攻击基础:
- 读取数据库配置文件:获取
MySQL、MSSQL、Redis等数据库的连接账号、密码。这可以直接导致:- 直接Getshell:通过数据库功能写入Webshell(需具备写权限和已知路径)。文中推荐了图形化工具
MDUT和Syla来简化此过程。 - 窃取敏感数据:直接导出数据库中的用户信息、业务数据等。
- 直接Getshell:通过数据库功能写入Webshell(需具备写权限和已知路径)。文中推荐了图形化工具
- 读取网站源码:通过读取
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服务配置,含路径和密码)。
- Linux:
- 删除关键系统文件:删除
/.ssh/authorized_keys、/etc/passwd等,破坏系统正常登录或运行,造成拒绝服务。
- 读取系统敏感文件:
-
应用配置与凭证泄露:
- 读取Web服务器配置文件(如
httpd.conf、nginx.conf),获取虚拟主机路径、反向代理规则等敏感配置。 - 读取应用框架配置文件(如
php.ini、resin.conf),了解环境设置。 - 读取其他服务的配置文件,如
/etc/vsftpd/vsftpd.conf。
- 读取Web服务器配置文件(如
-
社会工程学与横向移动:
- 读取社交软件图片与缓存:如果服务器上安装了社交软件(如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接口。 - 漏洞代码分析:
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); // 执行删除操作 } - 漏洞复现:
- 正常请求:
name=backup_20250926.sql - 恶意请求:将
name参数修改为/../1.txt。 - 结果:程序最终操作的路径变为
[WebRoot]/[BACK_PATH]/../1.txt,即跳出了备份目录,删除了Web根目录下的1.txt文件,验证了任意文件删除漏洞。
- 正常请求:
五、 修复建议
-
输入验证与过滤:
- 对用户输入的文件名进行严格的白名单校验,只允许特定的字符集(如字母、数字、下划线)和文件类型。
- 如果必须包含路径,则禁止出现
../、..\、:等特殊字符。
-
路径规范化与校验:
- 使用
getCanonicalPath()或类似函数获取文件的绝对路径,并检查该路径是否在程序允许的预期目录范围内。 - 示例代码(Java):
File file = new File(BASE_DIR, userInput); String canonicalPath = file.getCanonicalPath(); if (!canonicalPath.startsWith(BASE_DIR_CANONICAL)) { // 抛出错误,路径非法 }
- 使用
-
最小权限原则:运行Web服务的操作系统账户应具有最小权限,仅能读写必要的目录,从而即使漏洞存在,也能极大限制其危害范围。
总结:
任意文件读取/删除漏洞是一个“宝藏”漏洞,是通往服务器核心权限的捷径。其危害远不止信息泄露,通过读取配置、源码、密钥,并结合其他漏洞(如数据库弱口令、SSH弱口令),可以轻松实现从外网到内网的完整突破。在代码审计和渗透测试中,应对所有文件操作参数保持高度敏感。
希望这份详细的文档能对您有所帮助!