Bootstrap

DVWA通关教程第⼋关:XSS(跨站脚本漏洞)

XSS DOM类型低难度

代码审计:

<?php
# No protections, anything goes
?>

⽆任何过滤,所以可以直接在参数后⾯加⼀个xss语句
在这里插入图片描述

在这里插入图片描述

XSS DOM中级难度(medium)

代码审计:

<?php

// Is there any input?
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {
    $default = $_GET['default'];
    
    # Do not allow script tags
    if (stripos ($default, "<script") !== false) {
        header ("location: ?default=English");
        exit;
    }
}

?>

这⾥可以看到,medium级别的代码先检查了default参数是否为空,如果不为空则将default等于获取到
的default值。这⾥还使⽤了stripos ⽤于检测default值中是否有 <script ,如果有的话,则将
default=English 。
很明显,这⾥过滤了 <script (不区分⼤⼩写),那么我们可以使⽤html中的oneerror构造payload
在这里插入图片描述

XSS DOM⾼级难度

代码审计

<?php

// Is there any input?
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {

    # White list the allowable languages
    switch ($_GET['default']) {
        case "French":
        case "English":
        case "German":
        case "Spanish":
            # ok
            break;
        default:
            header ("location: ?default=English");
            exit;
    }
}

?>

这段代码通过检查URL中的default参数,确保其值在允许的⽩名单(法语、英语、德语、⻄班⽛语)
内。
如果default参数的值不在⽩名单中,代码会将⽤户重定向到当前⻚⾯,并将default参数设置为默认值
English。
这种机制有助于防⽌恶意输⼊或错误的输⼊值,确保应⽤程序的安全性和稳定性。

可以看到我们在English之后添加了#,在url中#后边的内容不会发送到服务端,从⽽可以实现绕过
http://192.168.249.133/DVWA/vulnerabilities/xss_d/?default=#%3C/option%3E%3C/select%20%3E%3CBODY%20ONLOAD=alert(document.cookie)%3E
在这里插入图片描述

XSS(Reflected)反射型低级难度(low)

代码审计:

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

?>

这段PHP代码的主要功能是检查URL中是否存在名为满⾜,代码将输出⼀个包含该 name 的查询参数,并且该参数不为空。如果条件name 参数值的欢迎信息
漏洞利⽤:直接输⼊xsspayload
在这里插入图片描述

XSS(Reflected)反射型中级难度(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>";
}

?>

这⾥设置了把

在这里插入图片描述

XSS(Reflected)反射型⾼级难度(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>";
}

?>

这段PHP代码使⽤了preg_replace函数来对$_GET[‘name’]变量中的内容进⾏正则表达式替换。具体来
说,它试图移除任何包含“script”字样的字符串,以防⽌潜在的XSS(跨站脚本)攻击。
漏洞利⽤
使⽤ img 标签和其编码转换后的 XSS payload
在这里插入图片描述

XSS(Stored)存储型低级难度

存储型XSS,持久化,代码是存储在服务器中的,如在个⼈信息或发表⽂章等地⽅,加⼊代码,如果没
有过滤或过滤不严,那么这些代码将储存到服务器中,⽤户访问该⻚⾯的时候触发代码执⾏。这种XSS
⽐较危险,容易造成蠕⾍,盗窃cookie等。
代码审计:

<?php

if( isset( $_POST[ 'btnSign' ] ) ) {
    // Get input
    $message = trim( $_POST[ 'mtxMessage' ] );
    $name    = trim( $_POST[ 'txtName' ] );

    // Sanitize message input
    $message = stripslashes( $message );
    $message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

    // Sanitize name input
    $name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

    // Update database
    $query  = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
    $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

    //mysql_close();
}

?>

可以看出,low级别的代码对我们输⼊的message和name并没有进⾏XSS过滤,⽽且数据存储在数据库
中,存在⽐较明显的存储型XSS漏洞
我们输⼊ 1 和 ,可以看到,我们的js代码⽴即就执⾏了
在这里插入图片描述

在这里插入图片描述

XSS(Stored)存储型中级难度

代码审计:

<?php

if( isset( $_POST[ 'btnSign' ] ) ) {
    // Get input
    $message = trim( $_POST[ 'mtxMessage' ] );
    $name    = trim( $_POST[ 'txtName' ] );

    // Sanitize message input
    $message = strip_tags( addslashes( $message ) );
    $message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
    $message = htmlspecialchars( $message );

    // Sanitize name input
    $name = str_replace( '<script>', '', $name );
    $name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

    // Update database
    $query  = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
    $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

    //mysql_close();
}

?> 

addslashes(string) :函数返回在预定义字符之前添加反斜杠的字符串,预定义字符 ’ 、" 、\ 、NULL
strip_tags(string) :函数剥去string字符串中的 HTML、XML 以及 PHP 的标签
htmlspecialchars(string): 把预定义的字符 “<” (⼩于)、 “>” (⼤于)、& 、‘’、“” 转换为 HTML
实体,防⽌浏览器将其作为HTML元素
1.双写绕过
name参数输⼊为:<sc
先把输⼊⻓度改⼀下,然后使⽤写直接绕过,改⼀下输⼊⻓度maxlength改成100
在这里插入图片描述

2.⼤⼩写绕过

改⼀下输⼊⻓度maxlength改成100
在这里插入图片描述

3.使⽤⾮ script 标签的 xss payload:
改⼀下输⼊⻓度maxlength改成100
在这里插入图片描述

XSS(Stored)存储型⾼级难度

代码审计:

<?php

if( isset( $_POST[ 'btnSign' ] ) ) {
    // Get input
    $message = trim( $_POST[ 'mtxMessage' ] );
    $name    = trim( $_POST[ 'txtName' ] );

    // Sanitize message input
    $message = strip_tags( addslashes( $message ) );
    $message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
    $message = htmlspecialchars( $message );

    // Sanitize name input
    $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $name );
    $name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

    // Update database
    $query  = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
    $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

    //mysql_close();
}

?>

这⾥使⽤正则表达式过滤了

在这里插入图片描述

;