什么是反射型XSS攻击(Reflected XSS Attacks)?
先来解释一下反射型XSS攻击的过程:攻击者把恶意代码注入到正常的URL之中,然后把带有恶意代码的URL通过邮件或者其他网站链接形式发送给用户。当用户被诱骗点击恶意链接、提交精心设计的表单,甚至浏览恶意网站时,注入的代码会传到易受攻击的网站服务器。服务器端接收数据处理后,再把带有恶意代码的数据返回用户的浏览器。由于数据来自可信网站,用户浏览器会正常接收、解析,最终照成了XSS漏洞。
整个过程就像一次反射过程,称为反射型XSS。
反射型XSS的特点是非持久化(Non-Persistent),必须由用户点击带有特定参数的URL才能引起,也称为Type-II XSS。
反射型XSS需要经过后端服务器,但是不经过数据库。而DOM型XSS是通过URL传入参数触发,它是不经过服务器端的。
low
先来最简单的测试一下,输入abcd<>’/",结果显示如下
应该是什么都不过滤的。
看看源代码
<?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>';
}
?>
也确实如此,name参数没有任何过滤。
我们再输入<img src=1 alert(‘haha’)>
结果如下
Medium
直接看源码
<?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>";
}
?>
看见嘛,把< script >过滤了,还只是过滤了小写的。
这次输入< Script>alert(‘haha’)</ script>,看结果
只需要把script的s改为大写就行了。
类似的注入还可以包含:
- < script/>alert(‘haha’)</ script>
- <s< script>cript>alert(‘haha’)</ script>
- <img src=1 alert(‘haha’)>
- < body onload = alert(‘haha’)>
- < iframe alert(document.cookie)>
- < iframe src=“javascript:alert(‘haha’)”>
- <input onfocus=alert(‘haha’) autofocus>
High
直接看源码
<?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>";
}
?>
替换了正则表达式,网上随便找了一篇文章说明参考一下:
- 表达式最尾部的i,是修饰符,表示忽略大小写,匹配不考虑大小写。这可以防止< Script>。
- 正则表达式必须要使用定界符包围起来,在PHP中,比较常见的是用“/”定界,也可以用“#”定界,而且外面还需要用引号包围起来。就是这串‘/<(. * )s(.* )c(.* )r(.* )i(.* )p(.* )t/’
- . * 表示匹配除了“\n”之外任何单个字符0次到多次 。(. *) 表示匹配除了“\n”之外任何单个字符0次到多次,并且获取这一匹配。<s< script>cript>alert(‘haha’)</ script>,这种情况不行了。而< script/>alert(‘haha’)</ script>,结果只能输出">"。
以上的表达式,其实都是围绕script标签的处理。而medium中举例的其他标签依然有效。
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();
?>
首先,和sql注入的impossilbe一样,也需要Check Anti-CSRF token
其次,利用了php的函数htmlspecialchars(),作用就是把预定义的字符转换为 HTML 实体,比如:
- & (和号)成为 &
- " (双引号)成为 "
- ’ (单引号)成为 ’
- < (小于)成为 <
- > (大于)成为 >
随便尝试一个吧
附件
/var/www/html/vulnerabilities/xss_r/index.php源码如下,有form存在,先提交到服务器端,然后在各个级别的php中用 echo "< pre>Hello ${name}</ pre>"发送给用户。处理过程 浏览器 --> 服务器后端 --> 浏览器。体会一下与DOM型的区别。
<?php
define( 'DVWA_WEB_PAGE_TO_ROOT', '../../' );
require_once DVWA_WEB_PAGE_TO_ROOT . 'dvwa/includes/dvwaPage.inc.php';
dvwaPageStartup( array( 'authenticated', 'phpids' ) );
$page = dvwaPageNewGrab();
$page[ 'title' ] = 'Vulnerability: Reflected Cross Site Scripting (XSS)' . $page[ 'title_separator' ].$page[ 'title' ]
;
$page[ 'page_id' ] = 'xss_r';
$page[ 'help_button' ] = 'xss_r';
$page[ 'source_button' ] = 'xss_r';
dvwaDatabaseConnect();
$vulnerabilityFile = '';
switch( $_COOKIE[ 'security' ] ) {
case 'low':
$vulnerabilityFile = 'low.php';
break;
case 'medium':
$vulnerabilityFile = 'medium.php';
break;
case 'high':
$vulnerabilityFile = 'high.php';
break;
default:
$vulnerabilityFile = 'impossible.php';
break;
}
require_once DVWA_WEB_PAGE_TO_ROOT . "vulnerabilities/xss_r/source/{$vulnerabilityFile}";
$page[ 'body' ] .= "
<div class=\"body_padded\">
<h1>Vulnerability: Reflected Cross Site Scripting (XSS)</h1>
<div class=\"vulnerable_code_area\">
<form name=\"XSS\" action=\"#\" method=\"GET\">
<p>
What's your name?
<input type=\"text\" name=\"name\">
<input type=\"submit\" value=\"Submit\">
</p>\n";
if( $vulnerabilityFile == 'impossible.php' )
$page[ 'body' ] .= " " . tokenField();
$page[ 'body' ] .= "
</form>
{$html}
</div>
<h2>More Information</h2>
<ul>
<li>" . dvwaExternalLinkUrlGet( 'https://www.owasp.org/index.php/Cross-site_Scripting_(XSS)' ) . "</li>
<li>" . dvwaExternalLinkUrlGet( 'https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet' ) . "</
li>
<li>" . dvwaExternalLinkUrlGet( 'https://en.wikipedia.org/wiki/Cross-site_scripting' ) . "</li>
<li>" . dvwaExternalLinkUrlGet( 'http://www.cgisecurity.com/xss-faq.html' ) . "</li>
<li>" . dvwaExternalLinkUrlGet( 'http://www.scriptalert1.com/' ) . "</li>
</ul>
</div>\n";
dvwaHtmlEcho( $page );
?>