代码审计篇——文件操作

admin 2026-05-16 04:25:10 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文系统阐述代码审计中的文件操作漏洞,涵盖文件包含、任意文件读取、文件写入/上传等高危类型。详细列出PHP/Java/Python的敏感函数库,提供漏洞定位方法、参数追踪技巧及常见绕过手段。强调审计核心在于确认用户输入可控性、过滤机制有效性,并通过实战案例展示如何结合路径遍历、编码绕过实现漏洞利用。 综合评分: 88 文章分类: 代码审计,WEB安全,漏洞分析,红队,渗透测试


cover_image

代码审计篇——文件操作

原创

这小子嘴硬 这小子嘴硬

一己之见安全团队

2026年5月15日 08:18 广西

在小说阅读器读本章

去阅读

一、文件操作漏洞

文件操作类漏洞,在代码审计中属于:

高危害:任意文件读取可导致敏感信息泄露(配置文件、数据库连接信息、源码);任意文件写入可导致GetShell;文件包含可导致远程代码执行。

易触发:开发者对文件路径的校验往往不够严格,或者根本不做校验。

难防御:黑名单过滤可以被绕过,白名单校验需要开发者有足够的安全意识。

常见的文件操作漏洞包括:文件包含、任意文件读取、任意文件写入/上传、文件删除。

二、审计前的准备:了解目标语言的函数特征

在开始审计之前,需要先了解目标语言中涉及文件操作的函数。以下是各语言的主流文件操作函数,建议先过一遍,做到“看到函数能反应过来这是干什么的”。

PHP常见文件操作函数:

| 类别 | 函数 | | — | — | | 文件包含 | includeinclude_oncerequirerequire_once | | 文件读取 | file_get_contentsfreadreadfilefile | | 文件写入 | file_put_contentsfwritefputs | | 文件上传 | move_uploaded_file | | 文件删除 | unlink | | 目录操作 | scandiropendirreaddir |

Java常见文件操作类/方法:

| 类别 | 类/方法 | | — | — | | 文件读写 | FileInputStreamFileOutputStreamFiles.readAllBytesFiles.write | | 文件上传 | MultipartFiletransferTo | | 文件下载 | FileDownloadResponseEntity |

Python常见文件操作函数:

| 类别 | 函数/方法 | | — | — | | 文件读写 | open()read()write()readlines() | | 路径操作 | os.path.joinos.path.abspath |

三、文件包含漏洞审计

3.1 漏洞原理

文件包含漏洞通常出现在PHP中。当开发者使用动态包含(参数作为文件路径的一部分)时,攻击者可以控制包含的文件路径,从而包含恶意文件。

3.2 审计要点

正则搜索关键词:

regex

include|include_once|require|require_once

审计步骤:

第一步:定位文件包含函数

搜索所有includerequire及其_once变体。

第二步:检查参数来源

追踪包含函数的参数,判断是否为动态值。

第三步:判断是否有过滤

检查是否有路径限制(如只能包含某个目录下的文件)、后缀拼接(如强制加.php)、危险字符过滤(如过滤../)。

第四步:确认可利用性

如果没有过滤,或过滤可绕过,则可尝试文件包含漏洞利用。

3.3 示例代码与追踪过程

php

<?php// 不良示例:参数直接来自用户输入$page=$_GET['page'];include($page.".php");

追踪过程:

  1. 搜索到include($page . ".php")
  2. $page在上一行定义:$page = $_GET['page']
  3. 来源是$_GET,用户可控
  4. 没有对$page做任何过滤
  5. 虽然有.php后缀拼接,但攻击者可以利用路径截断(PHP 5.3以下)或使用伪协议绕过

结论:存在文件包含漏洞。

3.4 常见绕过方式

| 防护方式 | 绕过方式 | | — | — | | 强制加后缀.php | 使用路径截断(%00)或长路径截断(Windows 256字节、Linux 4096字节),以及伪协议(php://filter) | | 过滤../ | 双写绕过:....//,或编码绕过:%2e%2e%2f | | 限制目录 | 目录遍历:../../../../etc/passwd |

四、任意文件读取漏洞审计

4.1 漏洞原理

应用程序读取文件时没有对用户输入的文件路径做校验,导致攻击者可以读取系统上的任意文件(如配置文件、密码文件、源码文件)。

4.2 审计要点

正则搜索关键词:

regex

file_get_contents|fread|readfile|file|fopen

审计步骤:

第一步:定位文件读取函数

搜索上述函数。

第二步:检查参数是否可控

追踪文件路径参数,判断是否来自用户输入。

第三步:判断路径处理方式

检查是否有路径过滤(.././)、根目录限制(chrootopen_basedir)、后缀拼接。

4.3 示例代码与追踪过程

php

<?php// 不良示例:参数来自用户输入,无过滤$file=$_GET['file'];echofile_get_contents($file);

追踪过程:

  1. 搜索到file_get_contents($file)
  2. $file在上一行定义:$file = $_GET['file']
  3. 用户可控,无任何过滤
  4. 攻击者可传入../../../../etc/passwd

结论:存在任意文件读取漏洞。

4.4 常见过滤与绕过

| 防护方式 | 绕过方式 | | — | — | | 过滤../ | 双写....//、URL编码%2e%2e%2f、二次解码 | | 限制目录 | 目录遍历跳出限制目录 | | 检查后缀 | 空字节截断(PHP 5.3以下) |

五、文件写入/上传漏洞审计

5.1 漏洞原理

应用程序允许用户上传文件或写入内容时,没有对文件类型、路径、内容做有效校验,导致攻击者可以上传恶意文件(如Webshell)。

5.2 审计要点

正则搜索关键词:

regex

file_put_contents|fwrite|fputs|move_uploaded_file

审计步骤:

第一步:定位文件写入/上传函数

搜索上述函数。

第二步:检查路径是否可控

追踪目标路径参数,判断是否可被用户影响。

第三步:检查文件类型校验

是否有MIME类型校验、后缀名校验、内容校验。

第四步:检查校验是否可绕过

后缀名是黑名单还是白名单?MIME类型是否可伪造?内容校验是否完备?

5.3 示例代码与追踪过程

php

<?php// 不良示例:路径可控,无后缀校验$upload_dir=$_GET['dir'];move_uploaded_file($_FILES['file']['tmp_name'],$upload_dir.'/'.$_FILES['file']['name']);

追踪过程:

  1. 搜索到move_uploaded_file
  2. $upload_dir来自$_GET['dir'],用户可控
  3. 文件名来自$_FILES['file']['name'],用户可控
  4. 无后缀校验、无内容校验
  5. 攻击者可上传任意文件到任意目录

结论:存在任意文件上传漏洞。

5.4 常见防护与绕过

| 防护方式 | 绕过方式 | | — | — | | 黑名单后缀 | 利用未包含的后缀(如.php5.phtml.inc),或利用解析漏洞 | | MIME校验 | 伪造Content-Type | | 内容校验 | 在图片文件末尾插入PHP代码(图片马) |

六、变量追踪在文件操作审计中的应用

变量追踪在文件操作审计中至关重要。以下是一个完整的追踪示例:

php

<?phpfunctiongetFileName($input){return$input.'.txt';}$user_input=$_GET['file'];$filename=getFileName($user_input);include($filename);

追踪过程:

  1. 定位危险函数:include($filename)
  2. 向上追溯$filename$filename = getFileName($user_input)
  3. 进入getFileName函数:返回值是$input . '.txt'
  4. 追溯$input$input是函数参数,来自调用时的$user_input
  5. 追溯$user_input$user_input = $_GET['file']
  6. 来源确认:用户可控
  7. 路径处理:强制加了.txt后缀,但目录可控
  8. 结论:存在文件包含风险,但受限于后缀

如果配合路径遍历,仍有风险。 攻击者传入../../../../etc/passwd%00,截断后可能绕过后缀限制。

七、实战案例思路

案例1:CMS文件包含漏洞

某CMS模板加载功能:

php

$template=$_GET['tpl'];include('templates/'.$template.'.php');

审计结果: $template可控,虽然有templates/前缀和.php后缀,但攻击者可以利用路径遍历读取任意PHP文件,或配合文件上传实现远程代码执行。

案例2:文件管理系统任意读取

某文件管理功能:

php

$file=base64_decode($_GET['file']);echofile_get_contents($file);

审计结果: 参数经过base64编码后解码,但解码后的路径没有任何过滤,攻击者可构造Li4vLi4vLi4vLi4vZXRjL3Bhc3N3ZA==读取/etc/passwd

八、总结

文件操作审计的核心思路:

  1. 先搜后追:正则搜索危险函数,变量追踪参数来源
  2. 关注可控点:文件路径是否来自用户输入
  3. 检查过滤:有过滤看能否绕过,无过滤直接高危
  4. 后缀不是绝对安全:路径遍历、空字节截断、解析漏洞,多种方式可绕过

免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:一己之见安全团队 这小子嘴硬 这小子嘴硬《代码审计篇——文件操作》

评论:0   参与:  0