DVWA-XSS(Reflected)

发布时间 2023-03-22 21:11:47作者: yaolingyu1

漏洞详解:

Reflected型XSS攻击是由于某些应用程序在处理输入时没有对输入进行过滤和验证,导致攻击者可以通过构造包含XSS攻击载荷的URL,从而向应用程序中注入恶意脚本代码。当用户单击包含恶意URL的链接时,恶意脚本代码就会被浏览器执行。

Reflected型XSS攻击通常通过以下三种方式实现:

  1. 直接URL注入:攻击者将恶意脚本作为URL参数发送给应用程序。当用户通过单击链接或在浏览器中手动复制并粘贴URL时,恶意脚本就会被浏览器执行。

  2. 表单输入注入:攻击者将恶意脚本代码作为表单输入发送给应用程序。当用户提交表单并浏览器显示处理结果时,恶意脚本就会被浏览器执行。

  3. HTTP头注入:攻击者将恶意脚本代码作为HTTP头发送给应用程序。当应用程序响应请求时,恶意脚本就会被浏览器执行。

Reflected型XSS攻击的主要危害是可以窃取用户的敏感信息、窃取用户的会话Cookie,或者执行任意恶意代码,例如在受害者的账号下发布恶意内容等。

Low:

代码审计:

Reflected XSS Source
vulnerabilities/xss_r/source/low.php
<?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>';
}

?>

我们可以看到

上述代码并没有对我们传入的参数进行任何的检查,那么该漏洞便可直接利用。

漏洞利用:

直接在输入框中输入:

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

Medium:

代码审计;

Reflected XSS Source
vulnerabilities/xss_r/source/medium.php
<?php

header ("X-XSS-Protection: 0");

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Get input
//这里利用str_repclace函数将<script>标签替换为空白
/*

str_replace 是 PHP 中的一个字符串函数,用于查找和替换字符串中的文本。它接受三个参数:


  1. 要查找的字符串或字符串数组
  2. 要进行替换的文本或文本数组
  3. 输入字符串或字符串数组

它会在输入字符串中查找第一个参数,并将其替换为第二个参数。

*/
$name = str_replace( '<script>', '', $_GET[ 'name' ] ); // Feedback for end user echo "<pre>Hello ${name}</pre>"; } ?>

我们可以看到这里的思想就是黑名单的思想,将<script>标签过滤。

漏洞利用:

(1)双写绕过

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

(2)大小写绕过

<ScRipt>alert(/xss/)</script>

(3)使用其他标签

<img src=x onerror=alert(1)>

关于更多的标签请参考前一篇文章。

High:

代码审计:

Reflected XSS Source
vulnerabilities/xss_r/source/high.php
<?php

header ("X-XSS-Protection: 0");

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Get input
//采用正则表达式的方式来过滤<script>标签
/*

preg_replace 是 PHP 中的一个正则表达式函数,用于检索和替换字符串中的文本。它的语法如下:


mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

该函数使用一个正则表达式模式(字符串或数组)来匹配输入字符串,并用另一个字符串或数组替换它(可选)。如果未提供替换字符串,则 preg_replace 将匹配的文本从输入字符串中删除。

*/
$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] ); // Feedback for end user echo "<pre>Hello ${name}</pre>"; } ?>

可以看到这里还是采用了黑名单的思想,我们在上一级别提到的三种绕过方法的前两种由于正则表达式的存在将无法继续使用,但第三种并不受影响。所以这里不多做演示。

Impossible:

代码审计:

Reflected XSS Source
vulnerabilities/xss_r/source/impossible.php
<?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();

?>

当用户在 URL 中输入一个 "name" 参数(使用 GET 方法发送)时,代码将检查是否存在与用户会话关联的 Anti-CSRF 令牌,并使用 htmlspecialchars 函数对输入值进行转义,以确保输入的任何 HTML 标签或其他特殊字符均不会被执行。然后,代码在 HTML 页面上显示 "Hello [name]" 的欢迎消息。

如果未找到 Anti-CSRF 令牌或令牌不匹配,代码将显示错误消息并不执行代码。

此外,generateSessionToken 函数被调用来生成一个 Anti-CSRF 令牌,并将其存储在用户会话中,以便在后续请求中使用。