关于"Samy Worm"技术分析及源代码

本文详细介绍了2005年影响mySpace的Samy Worm蠕虫,它是首个XSS蠕虫,利用了XSS漏洞。文章分析了蠕虫如何绕过mySpace的安全防护,包括在CSS中注入JavaScript、编码技巧等,并探讨了防止XSS攻击的防御措施,如CSP和Http-Only策略。最后提供了Samy Worm的代码示例。
摘要由CSDN通过智能技术生成
 说到Web安全和XSS跨站脚本技术,几乎所有的书都会提到Samy Worm,这是在2005年感染了mySpace社交网络上百万用户的蠕虫。正如Morris蠕虫是互联网第一个蠕虫, Samy Worm则是第一个XSS的蠕虫。因此研究XSS技术最好了解一下这个只要浏览了profile就自动把对方加为好友并列为偶像的代码的实现技术。

以下是根据对Samy Worm分析的文章进行的大致翻译:

1)    Myspace阻塞了大量的tags,实际上他们仅允许<a>,<img>,<div>这些,或者还有少数其他标签如<embed>。<script>,<body>,onSomething,href等Javascript元素全都被禁用了。然而,有些浏览器如IE允许在CSS标签中插入javascript:
<div style= "background:url('javascript:alert(1)')">
2)    在div中不能使用引号,因为标签里面默认就有单引号和双引号了(<div id="variable">)。这使得编码JS有点困难,为了做到这一点,可以用一个表达式存储JS代码,然后通过变量引用使其执行
<div id="mycode" expr="alert('hah!')" style="background:url('javascript:eval(document.all.mycode.expr)')">
3) 以上两步后,现在可以在单引号里面放入javascript代码了,但是mySpace对javascript单词进行了严格的过滤,根本无法使用. 幸运的是,有些浏览器会将"java\nscript"解释为"javascript"(实际上javascript的语法说如果没有分号,解析引擎会判断是否有完整的语境,因此空格,TAB应该也可以)
<div id="mycode" expr="alert(hah!)" style="background:url('java
script:eval(document.all.mycode.expr)')">
4)现在单引号已经可以使用了,但是我们有时候可能会需要双引号.我们需要对引号进行转义,然而,mySpace去掉了所有的转义的引号,无论是单引号还是双引号.但我们还是有办法,我们可以将整数转为ASCII,这样就能生成引号了
<div id="mycode" expr="alert('double quote: ' + String.fromCharCode(34))" style="background:url('java 
script:eval(document.all.mycode.expr)')">
5)    为了将代码发到用正在看它的户空间中,还需要获得页面的source. 可以使用document.body.innerHTML获得页面到的source,但是mySpace这次又把"innerHTML"去掉了,只能通过把两个字符串拼接成一个字符串
alert(eval('document.body.inne' + 'rHTML'))
6)    是时候访问其他页面了,可以使用iframes,但是通常iframes并不是很有用,而且用户容易发现有其他的东西在执行
因此使用Ajax制造客户端的HTTP GETS和POSTS. 老样子,mySpace去掉了"onreadystatechange", 而这个单词对于XML-HTTP请求来说是必要的,还是使用上面的方法
eval('xmlhttp.onread' + 'ystatechange = callback');
7)    现在可以通过GET请求获得他们当前的偶像列表,这里我们不需要移除任何人,只需把自己添加到已经存在的偶像列表中. 如果可以获得其他人的profile,就可以抓取他们的偶像并存储以备后用. 上面的都搞定之后,接下来的就简单了,除了我们还必须获得正则浏览profile的用户的friend ID,就像上面已经说到的,可以通过抓取页面的source获得这个.因此现在要搜索整个页面查找某个单词.但是搜索时还有一个问题,有可能会因为搜到包含这个词的普通代码而结束查询,这个结果不是我们想看到的. 因此,还是要通过字符串的合并来解决这个问题
var index = html.indexOf('frien' + 'dID');
8)    到现在为止,我们已经获得了偶像列表. 首先,在addFriends页面通过XML-HTTP POST先把自己添加为好友. 但是不行,为什么呢?因为我们目前所处的是profile.myspace.com,而发送POST需要在www.myspace.com. 虽然XML-HTTP不允许GETs/POSTs给不同的域名,但这并不是问题. 我们可以访问www.myspace.com上的相同URL,在上面浏览profiles,重载这个域名上我们想发送POST的页面
if (location.hostname == 'profile.myspace.com') document.location &
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值