文章目錄
- XSS實戰
-
- 說明
- level1
- level2
- level3
- level4
- level5
- level6
-
- strtolower()函數
-
- 說明
- 參數
- 範例
- level7
- level8
-
-
- HTML實體轉碼
-
- level9
-
- PHP strpos()函數
-
- 定義和用法
- 相關函數:
- 文法
- 技術細節
- level10
- 總結:
XSS實戰
說明
環境
Metasploitable2-Linux
步驟:
1. 判斷是否存在XSS攻擊的可能(送出的内容,頁面會顯示出來)
2. 判斷可輸入内容在标簽内(屬性)還是值
3. 判斷閉合(在标簽内部的話就需要提前閉合,使XSS的攻擊代碼生效)
4. 判斷是否過濾某些字元(對于<>script這種特殊字元,一旦被過濾,就需要通過大小寫,替換,轉義等方式來改變)
常用XSS攻擊代碼
<script>alert("xss")</script>
<img src=1 onerror=alert(1)>
<img src="#" onerror=alert('xss')>
onmousemove=javascript:alert(1)
onclick=alert(1)
level1
可見,name送出的内容就是頁面顯示的内容,及存在XSS攻擊的可能性
<script>alert("xss")</script>
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL1sGRPVTVU9EeRpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL2ADOxIDMyMjM1ETNwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
level2
1.通過位址欄可以看出,此關卡的送出資料的變量名使keyword,且輸入的内容會直接顯示在頁面上個,說明可能存在XSS漏洞,送出XSS的彈窗代碼後,并沒有直接彈窗
2.判斷送出的内容是否在标簽内,一般在輸入框内的,肯定在标簽内
3.判斷閉合,使其input标簽提前閉合
"><script>alert('xss')</script>
"用于将value的閉合,>用于對input标簽的閉合
檢視背景源代碼,可見與預期相符
level3
1.與之前相同,先判斷有無XSS攻擊的可能,這裡就不做示範了
2.判斷輸入的内容是否在标簽内(直接在浏覽器檢查元素,看下頁面的HTML标簽即可,可見是在input标簽内)
3.輸入大小寫,内嵌,都沒有用,即并沒有過濾特殊字元;猜下可能是用了實體轉換,并沒有執行彈窗代碼
4.使用事件标簽,此時就要判斷input标簽中的value使用的是何種閉合方式,經兩次嘗試,發現使用的是單引号閉合
為什麼要使用事件來觸發XSS漏洞?
因為使用正常的标簽會被.htmlspecialchars().轉換為字元,不會起作用,而事件則不會出現此類問題
'onclick='alert(1)
第一個單引号用于閉合value,即使得onclick值生效;第二個單引号用于對value後的第二個單引号閉合,即使alert(1)生效
這是一個滑鼠點選時間,即送出完成後,需要點選輸入框
檢視網頁源代碼,可見value的閉合方式與預期相符
level4
1.輸入以下代碼後,輸入框中并沒有<>,這種情況屬于特殊字元的過濾,測試,發現大小寫,内嵌,替換為标簽都是沒有用的
<scrip>alert(1)</script>
2.嘗試事件标簽,嘗試兩次,發現value的閉合方式為雙引号,參考level2的閉合方式的解釋
檢視網頁源代碼,可見對< >進行了過濾,且value的閉合方式為雙引号
level5
1.可見,其頁面是對出現script、on、的特殊字元中添加下劃線且能夠識别大小寫,使其不能生效,即不能執行XSS的攻擊代碼
2.首先莫慌,始終牢記,沒有絕對的安全;然後試試a标簽,即超連結,思路是使用a标簽來建立一個超連結,超連結的内容是一個僞代碼,即XSS的彈窗,這樣就能輕而易舉的執行彈窗代碼了
"><a href=javascript:alert(1)>XSS</a>
相信看到這裡,你一定能了解前面的">是什麼意思吧,還是老套路,即為了閉合value屬性,input标簽
HTML的a标簽小試牛刀
<html>
<body>
<a href="https://blog.csdn.net/qq_41959899">Eichi-Blog</a>
</body>
</html>
檢視網頁源代碼,可見與分析一緻
level6
1.此關增加了對超連結的href屬性的下劃線添加,使其不能生效
2.解決辦法就是大小寫的替換,如下代碼
"ONclick="alert(1)
檢視網頁源碼,可見與預期相符
那level5為什麼不對事件進行大小寫的替換,要使用a标簽來建立連結呢?
仔細觀察level5的源碼就會發現,他是先将輸入的内容進行小寫的轉換了,題外話:一定要注重細節
strtolower()函數
(PHP 4, PHP 5, PHP 7)
strtolower — 将字元串轉化為小寫
說明
strtolower ( string
$string
) : string
将
string
中所有的字母字元轉換為小寫并傳回。
注意 “字母” 與目前所在區域有關。例如,在預設的 “C” 區域,字元 umlaut-A(ä)就不會被轉換。
參數
-
輸入字元串。string
傳回值
傳回轉換後的小寫字元串。
範例
Example #1 strtolower() 範例
<?php
$str = "Mary Had A Little Lamb and She LOVED It So";
$str = strtolower($str);echo $str; // 列印 mary had a little lamb and she loved it so
?>
level7
本關的script、on、href、均被過濾,且大寫輸入後被轉換為小寫,但是可以采用内嵌的方式,是其生效,即讓頁面過濾調内嵌的即可,有很多方法,以下列舉出兩個
"oonnclick="javascript=alert(1) onclick是一個屬性,其還是在标簽内的,第一個雙引号用于閉合value的"
"><scscriptript>alert(1)</scscriptript> <script>是一個标簽 ">用于閉合input
檢視網頁源碼,可見于預期相符,老套路,這裡不多贅述
level8
本關是将輸入框的内容建立到超連結上,大小寫,關鍵字元都被添加了下劃線,這屬于對關鍵字元的形變;
解決:
采用特殊字元的轉義,即不直接執行特殊字元,而是先轉義,這樣就繞過了背景的形變,過濾等,有以下這幾種常用的字元轉義
1.url轉碼
2.hex轉碼
3.HTML實體轉碼
HTML實體轉碼
字元實體是用一個編号寫入HTML代碼中來代替一個字元,在使用浏覽器通路網頁時會将這個編号解析還原為字元以供閱讀。
這麼做的目的主要有兩個:
1、解決HTML代碼編寫中的一些問題。例如需要在網頁上顯示小于号(<)和大于号(>),由于它們是HTML的預留标簽,可能會被誤解析。這時就需要将小于号和大于号寫成字元實體:
小于号這樣寫:< 或 <
大于号這樣寫:> 或 >
前面的寫法稱為實體名稱,後面的寫法則是實體編号。ISO-8859-1字元集(西歐語言)中兩百多個字元設定了實體名稱,而對于其它所有字元都可以用實體編号來代替。
2、網頁編碼采用了特定語言的編碼,卻需要顯示來自其它語言的字元。例如,網頁編碼采用了西歐語言ISO-8859-1,卻要在網頁中顯示中文,這時必須将中文字元以實體形式寫入HTML代碼中。
将sc字元轉換為HTML實體為
sc
頁面的輸入框内輸入javascript:alert(1),結果如下圖
檢視網頁的後端源碼
level9
頁面分析:
無論輸入什麼,友情連結都是固定的内容,可以初步推斷出,a标簽是寫死的内容,檢查前端元素可以看出來,與預期相符
注意:
這裡的檢視前端的内容隻是簡單的猜測,有可能背景使用了一些函數,前台是完全看不到的,當然此關卡的背景代碼确實是使用了一些函數的
繼續分析:
如果這裡的連接配接是寫死的,那麼邏輯上将會出現問題,是以,背景應該是對輸入的資訊進行了某些字元的篩選導緻驗證出來不是正常的連接配接才會顯示連結不合法的資訊;猜測,一般的連結肯定存在http://的,是以可能是這段字元串背景有某種甄别機制,經測試,确實是要輸入http://的,可見下圖的展示
既然這裡是将輸入的内容建立為友情連接配接下,那麼可以使用僞代碼的方式來構造XSS攻擊,但是存在字元的修改過濾手段,則沿用上一關中的HTML實體的轉碼這種繞過手段,代碼如下
javascript:alert('http://')
檢視網頁背景代碼,可見大緻與預期相符
PHP strpos()函數
定義和用法
strpos() 函數查找字元串在另一字元串中第一次出現的位置。
注釋:strpos() 函數對大小寫敏感。
注釋:該函數是二進制安全的。
相關函數:
- stripos() - 查找字元串在另一字元串中第一次出現的位置(不區分大小寫)
- strripos() - 查找字元串在另一字元串中最後一次出現的位置(不區分大小寫)
- strrpos() - 查找字元串在另一字元串中最後一次出現的位置(區分大小寫)
文法
strpos(string,find,start)
參數 | 描述 |
---|---|
string | 必需。規定要搜尋的字元串。 |
find | 必需。規定要查找的字元串。 |
start | 可選。規定在何處開始搜尋。 |
技術細節
傳回值: | 傳回字元串在另一字元串中第一次出現的位置,如果沒有找到字元串則傳回 FALSE。 注釋:字元串位置從 0 開始,不是從 1 開始。 |
---|---|
PHP 版本: | 4+ |
level10
此關的界面就比較清奇,沒有輸入的位置,檢視頁面元素,可以發現三個input标簽被隐藏了,将其取消隐藏就可以看到三個輸入框,但是頁面讀取的是哪個對話框,并不能知道,那就直接在位址欄對input标簽的name屬性進行輸入測試即可
經測試,發現隻有t_sort這個屬性才能被指派,即可以進行XSS的攻擊,由于這裡采用的是滑鼠點選的事件,那麼需要去掉這個輸入框的隐藏屬性,就可以進行滑鼠的點選
代碼如下,在level10.php後寫入如下指令即可
?t_sort="onclick="alert(1)
檢視頁面的背景代碼
總結:
攻擊思路分為以下這幾點,注意,以下這幾點是層層遞進
1.判斷能否攻擊,即輸入的内容會被執行并顯示在頁面上
2.判斷輸入的内容是在标簽内還是需要成為一個屬性,若需要成為獨立的标簽或屬性,就要打破閉合
3.判斷頁面的過濾方式,常見的有以下這幾種過濾手段,大小寫過濾、常用标簽修改過濾、對特殊字元的替換過濾(使用replace函數将常用的字元替換為空)
4.頁面有XSS了,判斷出來過濾方式了,那就進行XSS的攻擊吧,首先要對過濾手段進行繞過,常用的繞過有,字元大小寫、内嵌繞過、a标簽的超連結繞過、事件繞過(滑鼠的移動,點選等)、url hex HTML實體轉碼繞過