2019-3-4 dvwa学习(6)--反射型XSS攻击

什么是反射型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 );

?>

猜你喜欢

转载自blog.csdn.net/weixin_42555985/article/details/88126453