XSS(Reflected) 反射型XSS
XSS攻擊需要具備兩個條件:
- 需要向web頁面注入惡意代碼;
- 這些惡意代碼能夠被瀏覽器成功的執行
XSS反射型漏洞
反射型XSS,顧名思義在於“反射”這個一來一回的過程。反射型XSS的觸發有后端的參與,而之所以觸發XSS是因為后端解析用戶在前端輸入的帶有XSS性質的腳本或者腳本的data URI編碼,后端解析用戶輸入處理后返回給前端,由瀏覽器解析這段XSS腳本,觸發XSS漏洞。因此如果要避免反射性XSS,則必須需要后端的協調,在后端解析前端的數據時首先做相關的字串檢測和轉義處理;同時前端同樣也許針對用戶的數據做excape轉義,保證數據源的可靠性
基本原理就是通過給別人發送帶有惡意腳本代碼參數的URL,當URL地址被打開時,特定的代碼參數會被HTML解析,執行,如此就可以獲取用戶的COOIKE,進而盜號登陸。
特點是:非持久化 必須用戶點擊帶有特定參數的鏈接才能引起。
XSS反射型攻擊,惡意代碼並沒有保存在目標網站,通過引誘用戶點擊一個鏈接到目標網站的惡意鏈接來實施攻擊的。
XSS(Reflected)主題:
Low
源碼解析
<?php header ("X-XSS-Protection: 0"); // Is there any input? // arrary_key_exists()函數:判斷$_GET的值中是否存在“name”鍵名。並且$_GET[‘name’]的值是否不為空,滿足這些條件,直接輸出下面的輸出語句。 if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) { // Feedback for end user echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>'; } ?>
漏洞復現
服務器只是判斷了 name 參數是否為空,如果不為空的話就直接打印出來。服務器並沒有對 name 參數做任何的過濾和檢查。
(1)直接使用 <script>alert(1)</script> 進行嘗試
Medium
源碼解析
<?php header ("X-XSS-Protection: 0"); // Is there any input? if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) { // Get input //將輸入中的<script>轉化為空 $name = str_replace( '<script>', '', $_GET[ 'name' ] ); // Feedback for end user echo "<pre>Hello ${name}</pre>"; } ?>
漏洞復現
(1)會檢查 name 參數中是否有 “< script >”,如果有則替換為空,也就是說過濾掉了“<script>”這個標簽。還有在這里使用了str_replace函數,它是區分大小寫的,因此可以使用大小寫繞過。
<sCript>alert(1)</ScRipt>
(2)除了使用大小寫繞過,還可以使用雙寫繞過
<sc<script>ript>alert(/xss/)</script>
High
源碼解析
<?php header ("X-XSS-Protection: 0"); // Is there any input? if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) { // Get input //使用通配符,完全匹配script*N,所以有關script的標簽全被過濾 $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] ); // Feedback for end user echo "<pre>Hello ${name}</pre>"; } ?>
漏洞復現
preg_replace() 函數執行一個正則表達式的搜索和替換,“*” 代表一個或多個任意字符,“i” 代表不區分大小寫。也就是說 “< script >” 標簽在這里被完全過濾了,但是我們可以通過其他的標簽例如 img、body 等標簽的事件或者iframe 等標簽的 src 注入 JS 攻擊腳本。
<img src = 1 onerror = alert(1)>
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(); ?>
漏洞解析
htmlspecialchars() 函數用於把預定義的字符 "<" 和 ">" 轉換為 HTML 實體,防止了我們注入 HTML 標簽。例如我們注入 “”,htmlspecialchars 函數會將 < 和 > 轉換成 html 實體而不是當做標簽,所以我們插入的語句並不會被執行。同時加入 Anti-CSRF token 防護 CSRF 攻擊,進一步提高安全性。