XSS攻擊
XSS攻擊全稱跨站腳本攻擊,是為不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆切厘,故將跨站腳本攻擊縮寫為XSS,XSS是一種在web應用中的計算機安全漏洞懊缺,它允許惡意web用戶將代碼植入到提供給其它用戶使用的頁面中疫稿。
什么是XSS攻擊?
XSS是一種經(jīng)常出現(xiàn)在web應用中的計算機安全漏洞鹃两,它允許惡意web用戶將代碼植入到提供給其它用戶使用的頁面中遗座。比如這些代碼包括HTML代碼和客戶端腳本。攻擊者利用XSS漏洞旁路掉訪問控制——例如同源策略(same origin policy)俊扳。這種類型的漏洞由于被黑客用來編寫危害性更大的網(wǎng)絡釣魚(Phishing)攻擊而變得廣為人知途蒋。對于跨站腳本攻擊,黑客界共識是:跨站腳本攻擊是新型的“緩沖區(qū)溢出攻擊“馋记,而JavaScript是新型的“ShellCode”号坡。
它與SQL注入攻擊類似,SQL注入攻擊中以SQL語句作為用戶輸入梯醒,從而達到查詢/修改/刪除數(shù)據(jù)的目的宽堆,而在xss攻擊中,通過插入惡意腳本冤馏,實現(xiàn)對用戶游覽器的控制日麸,獲取用戶的一些信息寄啼。
XSS的原理:
1.攻擊者對含有漏洞的服務器發(fā)起XSS攻擊(注入JS代碼)逮光。
2.誘使受害者打開受到攻擊的服務器URL。
3.受害者在Web瀏覽器中打開URL墩划,惡意腳本執(zhí)行涕刚。
XSS攻擊的危害包括:
1、盜取各類用戶帳號乙帮,如機器登錄帳號杜漠、用戶網(wǎng)銀帳號、各類管理員帳號
2、控制企業(yè)數(shù)據(jù)驾茴,包括讀取盼樟、篡改、添加锈至、刪除企業(yè)敏感數(shù)據(jù)的能力
3晨缴、盜竊企業(yè)重要的具有商業(yè)價值的資料
4、非法轉(zhuǎn)賬
5峡捡、強制發(fā)送電子郵件
6击碗、網(wǎng)站掛馬
7、控制受害者機器向其它網(wǎng)站發(fā)起攻擊
XSS攻擊分類
(1)反射型: 又稱為非持久性跨站點腳本攻擊们拙,它是最常見的類型的XSS稍途。漏洞產(chǎn)生的原因是攻擊者注入的數(shù)據(jù)反映在響應中。一個典型的非持久性XSS包含一個帶XSS攻擊向量的鏈接(即每次攻擊需要用戶的點擊)砚婆。詳細說就是發(fā)出請求時械拍,XSS代碼出現(xiàn)在URL中,作為輸入提交到服務器端装盯,服務器端解析后響應殊者,XSS隨響應內(nèi)容一起返回給瀏覽器,最后瀏覽器解析執(zhí)行XSS代碼验夯,這個過程就像一次發(fā)射猖吴,所以叫反射型XSS。
簡單例子
正常發(fā)送消息:
http://www.test.com/message.php?send=Hello,World挥转!
接收者將會接收信息并顯示Hello,Word
非正常發(fā)送消息:
http://www.test.com/message.php?send=<script>alert(‘foolish!’)</script>海蔽!
接收者接收消息顯示的時候?qū)棾鼍娲翱?/p>
(2)存儲型: 存儲型XSS和反射型的XSS差別就在于,存儲型的XSS提交的代碼會存儲在服務器端(數(shù)據(jù)庫绑谣,內(nèi)存党窜,文件系統(tǒng)等),下次請求目標頁面時不用再提交XSS代碼借宵。又稱為持久型跨站點腳本幌衣,當一個頁面被用戶打開的時候執(zhí)行。每當用戶打開瀏覽器,腳本執(zhí)行壤玫。持久的XSS相比非持久性XSS攻擊危害性更大,因為每當用戶打開頁面豁护,查看內(nèi)容時腳本將自動執(zhí)行。谷歌的orkut曾經(jīng)就遭受到XSS欲间。
簡單例子:
從名字就可了解到存儲型XSS攻擊就是將攻擊代碼存入數(shù)據(jù)庫中楚里,然后客戶端打開時就執(zhí)行這些攻擊代碼。例如留言板
留言板表單中的表單域:<input type=“text” name=“content” value=“這里是用戶填寫的數(shù)據(jù)”>
正常操作:
用戶是提交相應留言信息猎贴;將數(shù)據(jù)存儲到數(shù)據(jù)庫班缎;其他用戶訪問留言板蝴光,應用去數(shù)據(jù)并顯示。
非正常操作:
攻擊者在value填寫<script>alert(‘foolish!’)</script>【或者html其他標簽(破壞樣式达址。蔑祟。。)沉唠、一段攻擊型代碼】做瞪;
將數(shù)據(jù)存儲到數(shù)據(jù)庫中;
其他用戶取出數(shù)據(jù)顯示的時候右冻,將會執(zhí)行這些攻擊性代碼
DOMBasedXSS(基于dom的跨站點腳本攻擊)
基于DOM的XSS有時也稱為type0XSS装蓬。當用戶能夠通過交互修改瀏覽器頁面中的DOM(DocumentObjectModel)并顯示在瀏覽器上時,就有可能產(chǎn)生這種漏洞纱扭,從效果上來說它也是反射型XSS牍帚。
通過修改頁面的DOM節(jié)點形成的XSS,稱之為DOMBasedXSS乳蛾。
前提是易受攻擊的網(wǎng)站有一個HTML頁面采用不安全的方式從document.location 或document.URL 或 document.referrer獲取數(shù)據(jù)(或者任何其他攻擊者可以修改的對象)暗赶。
例如:
<SCRIPT>
var pos=document.URL.indexOf("name=")+5;
document.write(document.URL.substring(pos,document.URL.length));
</SCRIPT>
name是截取URL中g(shù)et過來的name參數(shù)
正常操作:
http://www.vulnerable.site/welcome.html?name=Joe
非正常操作:
http://www.vulnerable.site/welcome.html?name=<script>alert(document.cookie)</script>
受害者的瀏覽器接收到這個鏈接,發(fā)送HTTP請求到www.vulnerable.site并且接受到上面的HTML頁肃叶。受害者的瀏覽器開始解析這個HTML為DOM蹂随,DOM包含一個對象叫document,document里面有個URL屬性因惭,這個屬性里填充著當前頁面的URL岳锁。當解析器到達javascript代碼,它會執(zhí)行它并且修改你的HTML頁面蹦魔。倘若代碼中引用了document.URL激率,那么,這部分字符串將會在解析時嵌入到HTML中勿决,然后立即解析乒躺,同時,javascript代碼會找到(alert(…))并且在同一個頁面執(zhí)行它低缩,這就產(chǎn)生了xss的條件嘉冒。
XSS攻擊實例
1.簡單XSS攻擊
留言類,簡單注入javascript
有個表單域:<input type=“text” name=“content” value=“這里是用戶填寫的數(shù)據(jù)”>
1咆繁、假若用戶填寫數(shù)據(jù)為:<script>alert('foolish!')</script>(或者<script type="text/javascript" src="./xss.js"></script>)
2讳推、提交后將會彈出一個foolish警告窗口,接著將數(shù)據(jù)存入數(shù)據(jù)庫
3么介、等到別的客戶端請求這個留言的時候娜遵,將數(shù)據(jù)取出顯示留言時將執(zhí)行攻擊代碼蜕衡,將會顯示一個foolish警告窗口壤短。
【將數(shù)據(jù)改成html標簽進行攻擊设拟,則會將原本的樣式打亂。久脯。纳胧。。帘撰。跑慕。。摧找『诵校】
2.盜取cookie
什么是Cookie?
Cookie蹬耘,有時也用其復數(shù)形式 Cookies芝雪,指某些網(wǎng)站為了辨別用戶身份、進行 session 跟蹤而儲存在用戶本地終端上的數(shù)據(jù)(通常經(jīng)過加密)综苔。定義于 RFC2109 和 2965 中的都已廢棄惩系,最新取代的規(guī)范是 RFC6265 [1] 。(可以叫做瀏覽器緩存)
這里如筛,我們只是直觀的感受一下Cookie堡牡。
在瀏覽器的地址欄輸入:javascript:alert(document.cookie),按下Enter鍵杨刨,即能看到當前Cookie值晤柄。
有人可能會疑惑:這么復雜的一段代碼,攻擊者難道真的能破解出明文妖胀,然后冒充我們的身份可免?
事實上,攻擊者并不需要知道這段代碼的含義做粤!
攻擊者只需要把這個Cookie信息提交給服務器并通過驗證浇借,那么攻擊者就可以冒充受害者的身份登陸網(wǎng)站。
這就是我們常說的Cookie欺騙/Cookie會話攻擊怕品。
Cookie竊取攻擊
最基本的XSS跨站攻擊方法就是竊取受害者Cookie信息妇垢。
其基本原理如下:
當攻擊者發(fā)現(xiàn)網(wǎng)站存在XSS漏洞時,攻擊者會先向存在XSS漏洞的網(wǎng)頁中注入惡意的腳本代碼肉康。
當受害者訪問到此含有惡意腳本代碼的網(wǎng)頁時闯估,惡意腳本代碼相應的執(zhí)行。
由于在受害者請求服務器的協(xié)議中含有Cookie信息吼和,網(wǎng)站相應的得到用戶Cookie信息涨薪。
用戶注入的惡意腳本代碼是經(jīng)過精心構(gòu)造的,同時在遠程服務器端或者攻擊者使用的XSS平臺上炫乓,有一個用戶接受和記錄Cookie信息的文本刚夺。
攻擊者訪問此記錄Cookie信息的文本献丑,得到受害者的Cookie信息。
-
攻擊者利用受害者Cookie信息侠姑,通過桂林老兵创橄、firecookie等工具,以受害者的身份信息訪問網(wǎng)站莽红。
Cookie竊取攻擊的步驟:步驟一 判斷網(wǎng)站是否存在反射型XSS/存儲型XSS漏洞
步驟二 注入Cookie信息竊取的惡意代碼
一般情況下妥畏,我們都是利用XSS平臺的代碼進行注入。這樣安吁,我們能夠在XSS平臺的對應項目中找到受害人Cookie醉蚁。
步驟三 冒充被害人身份登陸網(wǎng)站。
可以使用的工具有很多鬼店,例如桂林老兵馍管,firefox瀏覽器插件firecookie等。
XSS的防御措施:
XSS漏洞的起因就是沒有對用戶提交的數(shù)據(jù)進行嚴格的過濾處理薪韩。因此在思考解決XSS漏洞的時候确沸,我們應該重點把握如何才能更好的將用戶提交的數(shù)據(jù)進行安全過濾。
什么是html實體俘陷?
在html中有些字符罗捎,像(<)這類的,對HTML(標準通用標記語言下的一個應用)來說是有特殊意義的拉盾,所以這些字符是不允許在文本中使用的桨菜。要在HTML中顯示(<)這個字符,我們就必須使用實體字符捉偏。
html實體的存在是導致XSS漏洞的主要原因之一倒得。
因此我們需要將這些實體全部轉(zhuǎn)換為相應的實體編號。
編碼:對用戶輸入的數(shù)據(jù)進行HTML Entity編碼
用戶將數(shù)據(jù)提交上來的時候進行HTML編碼夭禽,將相應的符號轉(zhuǎn)換為實體名稱再進行下一步的處理霞掺。
在PHP中已經(jīng)存在這樣子功能的函數(shù),即是htmlentities($str)函數(shù)讹躯。
與之相反的就是html_entity_decode($str)函數(shù)菩彬,它將實體名稱轉(zhuǎn)換為相應的符號。
過濾:移除用戶上傳的DOM屬性潮梯,如onerror等骗灶,移除用戶上傳的style節(jié)點,script節(jié)點秉馏,iframe節(jié)點等耙旦。
1、將重要的cookie標記為http only, 這樣的話Javascript 中的document.cookie語句就不能獲取到cookie了.
2萝究、表單數(shù)據(jù)規(guī)定值的類型免都,例如:年齡應為只能為int锉罐、name只能為字母數(shù)字組合。琴昆。氓鄙。馆揉。
4业舍、對數(shù)據(jù)進行Html Encode 處理
5、過濾或移除特殊的Html標簽升酣, 例如: <script>, <iframe> , < for <, > for >, " for
6舷暮、過濾JavaScript 事件的標簽。例如 "onclick=", "onfocus" 等等噩茄。
【特別注意:】
在有些應用中是允許html標簽出現(xiàn)的下面,甚至是javascript代碼出現(xiàn)。因此我們在過濾數(shù)據(jù)的時候需要仔細分析哪些數(shù)據(jù)是有特殊要求(例如輸出需要html代碼绩聘、javascript代碼拼接沥割、或者此表單直接允許使用等等),然后區(qū)別處理凿菩!
校正:避免直接對HTML Entity編碼机杜,使用DOM Prase轉(zhuǎn)換,校正不配對的DOM標簽衅谷。