命令执行漏洞概述
字数 1713 2025-08-15 21:32:05

命令执行漏洞深度解析与防御指南

一、命令执行漏洞概述

命令执行漏洞属于高危漏洞,指攻击者可以随意执行系统命令。它不仅存在于B/S架构中,也存在于C/S架构中。

漏洞分类

  1. OS命令执行:Web应用程序底层调用系统操作命令时,未过滤用户输入数据
  2. 脚本命令执行:通过脚本语言调用操作系统命令

二、操作系统管道符利用

Windows系统管道符

  • |:直接执行后面的语句
    ping www.baidu.com|whoami
  • ||:前面语句执行出错则执行后面的语句
    png www.baidu.com||whoami
  • &:无论前面语句真假都执行后面的语句
    ping www.baidu.com&whoami
  • &&:前面语句为真才执行后面的语句
    ping www.baidu.com&&whoami

Linux系统管道符

  • ;:执行完前面命令后执行后面的
    ping www.baidu.com;whoami
  • |:显示后面语句的执行结果
  • ||:前面语句出错时执行后面的语句
  • &:无论前面语句真假都执行后面的语句
  • &&:前面语句为真才执行后面的语句

三、DVWA命令注入示例分析

Low级别漏洞代码

$target = $_REQUEST['ip'];
if(stristr(php_uname('s'), 'Windows NT')) {
    $cmd = shell_exec('ping '.$target);
} else {
    $cmd = shell_exec('ping -c 4 '.$target);
}
echo "<pre>{$cmd}</pre>";

漏洞点:直接拼接用户输入执行命令,无任何过滤

Medium级别漏洞代码

$substitutions = array('&&' => '', ';' => '');
$target = str_replace(array_keys($substitutions), $substitutions, $target);
// 其余同Low级别

漏洞点:仅过滤了&&;,仍可利用&|||

High级别漏洞代码

$substitutions = array(
    '&' => '', ';' => '', '| ' => '',
    '-' => '', '$' => '', '(' => '',
    ')' => '', '`' => '', '||' => ''
);
$target = str_replace(array_keys($substitutions), $substitutions, $target);
// 其余同Low级别

漏洞点| (带空格)过滤不彻底,仍可利用|(无空格)

四、PHP命令执行漏洞

1. 直接命令执行函数

  • system():执行外部程序并显示输出
  • shell_exec():通过shell执行命令
  • exec():执行外部程序
  • passthru():执行外部程序并显示原始输出

示例

$host = $argv[1];
system("ping ".$host); // 可被注入:php.exe ceshi.php "www.baidu.com|whoami"

2. 代码执行函数

  • eval():将字符串作为PHP代码执行
    eval($_REQUEST['code']); // 典型一句话木马
    

3. 动态函数调用漏洞

function A(){ return "A()函数.."; }
function B(){ return "B()函数.."; }
$fun = $_REQUEST['fun'];
echo $fun(); // 可被利用:?fun=phpinfo

带参数版本更危险

$fun = $_GET['fun'];
$par = $_GET['par'];
$fun($par); // 可被利用:?fun=system&par=whoami

4. 其他危险函数

  • preg_replace():使用/e修饰符时可执行代码
  • ob_start():回调函数可能执行代码
  • array_map():第一个参数可控时可执行函数
    $arr = $_GET['arr'];
    $array = array(1,2,3,4,5);
    $new_array = array_map($arr, $array); // 可被利用:?arr=phpinfo
    

五、Java命令执行漏洞

Runtime类执行命令

String command = args[0];
Runtime run = Runtime.getRuntime();
Process pro = run.exec(command); // 执行系统命令

Struts2框架漏洞

  1. 早期漏洞:通过OGNL表达式注入
    ?(#_memberAccess['allowStaticMethodAccess'])(meh)=true&(aaa)((#context['xwork.MethodAccessor.denyMethodExecution']=#foo)(#foo=new%20java.lang.Boolean("false")))&(asdf)((#rt.exit(1))(#rt=@java.lang.Runtime@getRuntime()))=1

  2. DefaultActionMapper漏洞
    http://host/struts2-showcase/employee/save.action?redirect:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{'command','goes','here'})).start()}

六、防御措施

  1. 基本原则

    • 尽量避免使用系统执行命令
    • 确保输入完全可控
  2. 具体措施

    • 严格过滤所有用户输入,转义敏感字符
    • 使用白名单限制可执行命令
    • 对动态函数调用进行严格检查
    • 禁用或限制危险函数的使用
    • 及时更新框架和组件补丁
  3. PHP专项防御

    • 禁用eval()system()等危险函数
    • 使用escapeshellarg()escapeshellcmd()处理命令参数
    • 对回调函数进行严格校验
  4. Java专项防御

    • 避免直接使用Runtime.exec()执行用户输入
    • 及时更新Struts2等框架版本
    • 使用SecurityManager限制权限

七、总结

命令执行漏洞危害极大,可导致服务器完全沦陷。开发者应:

  1. 充分认识漏洞危害性
  2. 掌握各种语言中的危险函数
  3. 实施严格的输入过滤机制
  4. 保持框架和组件的及时更新
  5. 遵循最小权限原则运行应用
命令执行漏洞深度解析与防御指南 一、命令执行漏洞概述 命令执行漏洞属于高危漏洞,指攻击者可以随意执行系统命令。它不仅存在于B/S架构中,也存在于C/S架构中。 漏洞分类 OS命令执行 :Web应用程序底层调用系统操作命令时,未过滤用户输入数据 脚本命令执行 :通过脚本语言调用操作系统命令 二、操作系统管道符利用 Windows系统管道符 | :直接执行后面的语句 ping www.baidu.com|whoami || :前面语句执行出错则执行后面的语句 png www.baidu.com||whoami & :无论前面语句真假都执行后面的语句 ping www.baidu.com&whoami && :前面语句为真才执行后面的语句 ping www.baidu.com&&whoami Linux系统管道符 ; :执行完前面命令后执行后面的 ping www.baidu.com;whoami | :显示后面语句的执行结果 || :前面语句出错时执行后面的语句 & :无论前面语句真假都执行后面的语句 && :前面语句为真才执行后面的语句 三、DVWA命令注入示例分析 Low级别漏洞代码 漏洞点 :直接拼接用户输入执行命令,无任何过滤 Medium级别漏洞代码 漏洞点 :仅过滤了 && 和 ; ,仍可利用 & 、 | 和 || High级别漏洞代码 漏洞点 : | (带空格)过滤不彻底,仍可利用 | (无空格) 四、PHP命令执行漏洞 1. 直接命令执行函数 system() :执行外部程序并显示输出 shell_exec() :通过shell执行命令 exec() :执行外部程序 passthru() :执行外部程序并显示原始输出 示例 : 2. 代码执行函数 eval() :将字符串作为PHP代码执行 3. 动态函数调用漏洞 带参数版本更危险 : 4. 其他危险函数 preg_replace() :使用 /e 修饰符时可执行代码 ob_start() :回调函数可能执行代码 array_map() :第一个参数可控时可执行函数 五、Java命令执行漏洞 Runtime类执行命令 Struts2框架漏洞 早期漏洞 :通过OGNL表达式注入 ?(#_memberAccess['allowStaticMethodAccess'])(meh)=true&(aaa)((#context['xwork.MethodAccessor.denyMethodExecution']=#foo)(#foo=new%20java.lang.Boolean("false")))&(asdf)((#rt.exit(1))(#rt=@java.lang.Runtime@getRuntime()))=1 DefaultActionMapper漏洞 : http://host/struts2-showcase/employee/save.action?redirect:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{'command','goes','here'})).start()} 六、防御措施 基本原则 : 尽量避免使用系统执行命令 确保输入完全可控 具体措施 : 严格过滤所有用户输入,转义敏感字符 使用白名单限制可执行命令 对动态函数调用进行严格检查 禁用或限制危险函数的使用 及时更新框架和组件补丁 PHP专项防御 : 禁用 eval() 、 system() 等危险函数 使用 escapeshellarg() 和 escapeshellcmd() 处理命令参数 对回调函数进行严格校验 Java专项防御 : 避免直接使用Runtime.exec()执行用户输入 及时更新Struts2等框架版本 使用SecurityManager限制权限 七、总结 命令执行漏洞危害极大,可导致服务器完全沦陷。开发者应: 充分认识漏洞危害性 掌握各种语言中的危险函数 实施严格的输入过滤机制 保持框架和组件的及时更新 遵循最小权限原则运行应用