DVWA XSS (Reflected)

前言

反射型XSS,通过web站点漏洞,向客户端交付恶意脚本代码,这些代码可以被浏览器成功的执行,从而实现对客户端的攻击;

反射型XSS一般可以盗取客户端cookie,将客户端重定向到第三方网站;

LOW

源代码

1
2
3
4
5
6
7
8
 <?php
header ("X-XSS-Protection: 0");
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Feedback for end user
echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}
?>

分析:GET后的参数直接打印到HTML页面中,未对输入的内容进行过滤,导致页面中可以执行JS脚本;

XSS攻击测试

  1. 判断是否存在XSS漏洞

    输入框中输入<Script>alert(123)</ScrIpt>,弹出弹框,表明存在XSS注入漏洞;

    此时已经向页面中写入JS代码;

  2. 输入<scRIpT>window.location="https://www.baidu.com/"</ScRipT>,重定向页面到百度首页;

  3. 输入<sCript>alert(document.cookie)</scRipt>,弹出cookie数据;

MEDIUM

源代码

1
2
3
4
5
6
7
8
9
10
<?php
header ("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
echo "<pre>Hello ${name}</pre>";
}
?>

分析:GET后的参数直接打印到HTML页面中,只使用str_replace函数过滤了<script>参数,可以进行大小写转换,插入JS脚本;

XSS攻击测试

攻击过程与LOW级别相同;

只删除<script>标签的情况是很容易绕过:

  1. 使用双写绕过,输入<scr<script>ipt>alert(document.cookie)</script>
  2. 使用大小写绕过,输入<sCript>alert(document.cookie)</script>
  3. 输入其他标签,输入<IMG src=1 onerror=alert(document.cookie)>

HIGH

源代码

1
2
3
4
5
6
7
8
9
10
<?php
header ("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
echo "<pre>Hello ${name}</pre>";
}
?>

分析:采用preg_replace函数执行一个正则表达式的搜索和替换,其中/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i是正则表达式,(.*)表示贪婪匹配,/i表示不区分大小写,所有关于<script>标签均被过滤;

XSS攻击测试

可以使用IMG标签进行注入,输入<IMG src=1 onerror=alert(document.cookie)>,成功获得cookie值;

IMPOSSIBLE

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
<?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 实体,防止浏览器将其作为HTML元素。还加入了Anti-CSRF token,防止结合csrf攻击;

使用IMG标签进行注入后显示的源码中的预定义字符已经被转换为HTML实体;