文章总结: 本文系统阐述代码审计中的文件操作漏洞,涵盖文件包含、任意文件读取、文件写入/上传等高危类型。详细列出PHP/Java/Python的敏感函数库,提供漏洞定位方法、参数追踪技巧及常见绕过手段。强调审计核心在于确认用户输入可控性、过滤机制有效性,并通过实战案例展示如何结合路径遍历、编码绕过实现漏洞利用。 综合评分: 88 文章分类: 代码审计,WEB安全,漏洞分析,红队,渗透测试
代码审计篇——文件操作
原创
这小子嘴硬 这小子嘴硬
一己之见安全团队
2026年5月15日 08:18 广西
在小说阅读器读本章
去阅读
一、文件操作漏洞
文件操作类漏洞,在代码审计中属于:
高危害:任意文件读取可导致敏感信息泄露(配置文件、数据库连接信息、源码);任意文件写入可导致GetShell;文件包含可导致远程代码执行。
易触发:开发者对文件路径的校验往往不够严格,或者根本不做校验。
难防御:黑名单过滤可以被绕过,白名单校验需要开发者有足够的安全意识。
常见的文件操作漏洞包括:文件包含、任意文件读取、任意文件写入/上传、文件删除。
二、审计前的准备:了解目标语言的函数特征
在开始审计之前,需要先了解目标语言中涉及文件操作的函数。以下是各语言的主流文件操作函数,建议先过一遍,做到“看到函数能反应过来这是干什么的”。
PHP常见文件操作函数:
| 类别 | 函数 |
| — | — |
| 文件包含 | include 、include_once、require、require_once |
| 文件读取 | file_get_contents 、fread、readfile、file |
| 文件写入 | file_put_contents 、fwrite、fputs |
| 文件上传 | move_uploaded_file |
| 文件删除 | unlink |
| 目录操作 | scandir 、opendir、readdir |
Java常见文件操作类/方法:
| 类别 | 类/方法 |
| — | — |
| 文件读写 | FileInputStream 、FileOutputStream、Files.readAllBytes、Files.write |
| 文件上传 | MultipartFile 、transferTo |
| 文件下载 | FileDownload 、ResponseEntity |
Python常见文件操作函数:
| 类别 | 函数/方法 |
| — | — |
| 文件读写 | open() 、read()、write()、readlines() |
| 路径操作 | os.path.join 、os.path.abspath |
三、文件包含漏洞审计
3.1 漏洞原理
文件包含漏洞通常出现在PHP中。当开发者使用动态包含(参数作为文件路径的一部分)时,攻击者可以控制包含的文件路径,从而包含恶意文件。
3.2 审计要点
正则搜索关键词:
regex
include|include_once|require|require_once
审计步骤:
第一步:定位文件包含函数
搜索所有include、require及其_once变体。
第二步:检查参数来源
追踪包含函数的参数,判断是否为动态值。
第三步:判断是否有过滤
检查是否有路径限制(如只能包含某个目录下的文件)、后缀拼接(如强制加.php)、危险字符过滤(如过滤../)。
第四步:确认可利用性
如果没有过滤,或过滤可绕过,则可尝试文件包含漏洞利用。
3.3 示例代码与追踪过程
php
<?php// 不良示例:参数直接来自用户输入$page=$_GET['page'];include($page.".php");
追踪过程:
- 搜索到
include($page . ".php") $page在上一行定义:$page = $_GET['page']- 来源是
$_GET,用户可控 - 没有对
$page做任何过滤 - 虽然有
.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
审计步骤:
第一步:定位文件读取函数
搜索上述函数。
第二步:检查参数是否可控
追踪文件路径参数,判断是否来自用户输入。
第三步:判断路径处理方式
检查是否有路径过滤(../、./)、根目录限制(chroot、open_basedir)、后缀拼接。
4.3 示例代码与追踪过程
php
<?php// 不良示例:参数来自用户输入,无过滤$file=$_GET['file'];echofile_get_contents($file);
追踪过程:
- 搜索到
file_get_contents($file) $file在上一行定义:$file = $_GET['file']- 用户可控,无任何过滤
- 攻击者可传入
../../../../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']);
追踪过程:
- 搜索到
move_uploaded_file $upload_dir来自$_GET['dir'],用户可控- 文件名来自
$_FILES['file']['name'],用户可控 - 无后缀校验、无内容校验
- 攻击者可上传任意文件到任意目录
结论:存在任意文件上传漏洞。
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);
追踪过程:
- 定位危险函数:
include($filename) - 向上追溯
$filename:$filename = getFileName($user_input) - 进入
getFileName函数:返回值是$input . '.txt' - 追溯
$input:$input是函数参数,来自调用时的$user_input - 追溯
$user_input:$user_input = $_GET['file'] - 来源确认:用户可控
- 路径处理:强制加了
.txt后缀,但目录可控 - 结论:存在文件包含风险,但受限于后缀
如果配合路径遍历,仍有风险。 攻击者传入../../../../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。
八、总结
文件操作审计的核心思路:
- 先搜后追:正则搜索危险函数,变量追踪参数来源
- 关注可控点:文件路径是否来自用户输入
- 检查过滤:有过滤看能否绕过,无过滤直接高危
- 后缀不是绝对安全:路径遍历、空字节截断、解析漏洞,多种方式可绕过
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:一己之见安全团队 这小子嘴硬 这小子嘴硬《代码审计篇——文件操作》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论