官网:http://securitytech.cc

在测试一个电商平台时,我发现了一个存储型 XSS 漏洞,攻击者通过自定义模板注入完全绕过了 Cloudflare WAF 的保护。更有趣的是,攻击载荷并没有在我注入的位置执行,而是悄无声息地渲染到了完全不同的其他地方。
问:什么是模板注入?
答:模板注入是指将用户输入嵌入到模板引擎中,并将其作为代码执行,而不是作为纯文本处理。根据引擎和上下文的不同,这可能导致信息泄露、跨站脚本攻击 (XSS),甚至远程代码执行。
——侦察——模糊处理一切
测试开始时一切如常。我正在测试一个电商网站应用——那种包含客服聊天、用户个人资料、好友列表和产品评论等功能的平台。我决定用一个经典的多语言有效载荷对应用中的每个输入字段进行模糊测试:
#^<&'"-大多数字段都没有返回任何有用的信息,只有一些普通的、经过处理的响应或通用错误。但当我输入地址字段时,却得到了意想不到的结果。
应用程序没有对我的输入进行清理或拒绝,而是泄露了一个原始模板渲染错误:
%% 错误 % % %% getCurrentAddress.billing_name % % %% getCurrentAddress.billing_address | decode_htmlentities % % %% getCurrentAddress.billing_country | decode_htmlentities % % + %% parseFloat(getVatRate(getCurrentCountryCode)) + '% ' %% 增值税%%
这下可有意思了。这个应用程序泄露了内部模板语法、变量名,甚至还有辅助函数。我立刻注意到了 %% … %% 分隔符——这肯定不是 Jinja2、Twig、Mako 或任何已知的模板引擎。这是一个自定义的专有模板引擎。
墙——Cloudflare WAF
我知道该应用程序位于 Cloudflare WAF 之后,因此我意识到标准的 SSTI 有效负载永远无法通过:
{{7*7}} ← 已屏蔽${7*7} ← 已屏蔽<%= 7*7 %> ← 已屏蔽
但问题在于——WAF(Web应用防火墙)只能检测已知的模板语法模式。它们不知道%%..%%是什么意思,因为它不在它们的规则手册中。所以我决定用应用程序自身的语法来测试它。
我在应用程序的每个输入字段(姓名、地址、个人简介、评论字段)中注入了 %%7*7%%,每个字段一个有效负载。
请求已发送。已检查响应。无响应。没有 49 号错误。没有执行。什么都没有。
我尝试了各种方法,不同的字段,不同的端点,但仍然不行。
啊……😤
我整整尝试了两天,但毫无进展。我确信模板引擎根本没有解析用户输入,我看到的错误只是一个调试漏洞,根本没有真正的利用途径。
我放弃了。
突破——它一直都在那里
两天后,我因为其他问题提交了一个支持工单。就在那时,我看到了它。
我的显示名称显示为 49。
按回车键或点击查看完整尺寸的图片

等等,什么?
我赶紧跑到设置页面查看——名称字段里仍然存储着 %%7*7%%。模板引擎执行了7*7=49。注入确实有效。只是它没有在我注入的地方渲染——而是在一个完全不同的上下文中渲染了。
名称字段在每次显示时(例如在支持工单、好友列表和用户个人资料中)都会通过模板引擎进行评估。我一直都在错误的地方寻找输出结果。
自定义的 %%..%% 语法完全绕过了 Cloudflare,因为 WAF 没有规则来检测它。
升级——从SSTI到XSS
现在我知道注射是真的了。是时候升级行动了。
我注射了:
%%自己%%输出结果:
[对象窗口]按回车键或点击查看完整尺寸的图片

这证实了我拥有对 JavaScript 全局作用域的访问权限。模板引擎在客户端执行表达式——这就是客户端模板注入 (CSTI),这意味着我有可能利用 XSS 漏洞。
最终有效载荷:
%% alert('XSS') %%
按回车键或点击查看完整尺寸的图片

轰隆隆!💥
JavaScript 执行成功。无论我的名字出现在何处,都会弹出 alert() 提示——而出现的地方非常多。
影响——存储型 XSS 无处不在
这不仅仅是一个自XSS攻击,而是一个影响多个高影响力表面的存储型XSS攻击:
- 用户个人资料页面——任何访问您个人资料页面的人都会触发恶意代码
——好友列表——添加好友会在其个人资料页面上执行恶意代码——支持工单——支持人员查看工单会触发恶意代码执行——产品页面评论——产品评论/评价部分也存在同样的漏洞
按回车键或点击查看完整尺寸的图片

为什么 Cloudflare 没能发现这个问题:
Cloudflare WAF 使用基于签名的检测方法来识别已知的模板语法({{, ${, <%))。自定义的 %%..%% 分隔符与任何现有的 WAF 规则都不匹配。这是一个典型的例子,说明了为什么专有实现往往会破坏标准化的安全控制。
公众号:安全狗的自我修养
vx:2207344074
http://gitee.com/haidragon
http://github.com/haidragon
bilibili:haidragonx


夜雨聆风