跨站腳本×××(XSS)

跨站腳本×××(XSS)是客戶端腳本安全中的頭號大敵。OWASP TOP 10 威脅屢次把 XSS 列在榜首。php

1.XSS 簡介
html

  跨站腳本×××(Cross Site Script),原本縮寫是CSS,可是爲了和層疊樣式表(Cascading Style Sheet,CSS)有所區別,因此在安全領域叫作 「 XSS 」。前端

  XSS ×××,一般指×××經過 「HTML 注入」 篡改了網頁,插入了惡意的腳本,從而在用戶瀏覽網頁時,控制用戶瀏覽器的一種×××。在一開始,這種×××的演示案例是跨域的,因此叫作 「 跨站腳本 」。現今,因爲 Javascript 的強大功能以及網站前端用的複雜化,是否跨域已經再也不重要。可是因爲歷史緣由,XSS 這個名字卻一直保留下來。正則表達式


2. 本身搭建個 DVWA   (因爲個別緣由,此次就寫反射型 XSS)跨域

 反射型 XSS瀏覽器

 面對四種級別的代碼進行分析。安全


 LOW服務器

 服務器端核心代碼
session

     

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

能夠看到,代碼直接引用了name參數,並無任何的過濾與檢查,存在明顯的XSS漏洞。
xss

漏洞利用

輸入<script>alert(/XSS/)</script>,成功彈框:


Medium

服務器端核心代碼

<?php // 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>"; 
} 
?>

能夠看到,這裏對輸入進行了過濾,基於黑名單的思想,使用str_replace函數將輸入中的<script>刪除,這種防禦機制是能夠被輕鬆繞過的。

漏洞利用

1.雙寫繞過

輸入 <sc<script>ript>alert(/xss/)</script>,成功彈框:

2.大小寫混淆繞過

輸入<ScRipt>alert(/xss/)</script>,成功彈框:


High

服務器端核心代碼


<?php // 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級別的代碼一樣使用黑名單過濾輸入,preg_replace()函數用於正則表達式的搜索和替換,這使得雙寫繞過、大小寫混淆繞過(正則表達式中i表示不區分大小寫)再也不有效。

漏洞利用

雖然沒法使用<script>標籤注入XSS代碼,可是能夠經過imgbody等標籤的事件或者iframe等標籤的src注入惡意的js代碼。

輸入<img src=1 onerror=alert(/xss/)>,成功彈框:


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級別的代碼使用htmlspecialchars函數把預約義的字符& <>轉換爲HTML實體,防止瀏覽器將其做爲HTML元素。

相關文章
相關標籤/搜索