首页 > 其他分享 >DVWA-XSS(Stored)

DVWA-XSS(Stored)

时间:2023-03-21 19:36:08浏览次数:40  
标签:XSS name DVWA ston Stored mysqli ___ GLOBALS

存储型 XSS(Cross-Site Scripting)攻击是一种常见的 Web 应用程序安全漏洞,攻击者在一个网站上注入恶意代码,并将该代码存储在服务器端的数据库中,当其他用户访问该网站的页面时,恶意代码将被执行,从而达到攻击的目的。

攻击者通常会在一个输入框中输入恶意脚本,例如 JavaScript 代码,并将其提交到目标网站上。网站把这个恶意代码保存到它的数据库中,当其他用户在浏览这个网站时,这个恶意代码会被加载到页面上,并在用户浏览器中执行。由于这种攻击是跨站点的,因此攻击者可以使用这种方法窃取用户的敏感信息,例如用户名、密码、银行账户信息等。

Low:

代码审计:

Stored XSS Source
vulnerabilities/xss_s/source/low.php
<?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();
}

?>

trim(string,charlist)
函数移除字符串两侧的空白字符或其他预定义字符,
预定义字符包括、\t、\n、\x0B、\r以及空格,可选参数charlist支持添加额外需要删除的字符。

mysql_real_escape_string(string,connection)
函数会对字符串中的特殊符号(\x00,\n,\r,\,',",\x1a)进行转义。

stripslashes(string)
函数删除字符串中的反斜杠。

可以看到,对输入并没有做XSS方面的过滤与检查,且存储在数据库中,因此这里存在明显的存储型XSS漏洞。

漏洞利用:

在message框内直接输入:

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

注意,因为stored类型xss存储在数据库,每次访问页面都会被重新加载一次。

Medium:

代码审计:

Stored XSS Source
vulnerabilities/xss_s/source/medium.php
<?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();
}

?>
strip_tags() 
函数剥去字符串中的 HTML、XML 以及 PHP 的标签,但允许使用<b>标签。 

addslashes() 
函数返回在预定义字符(单引号、双引号、反斜杠、NULL)之前添加反斜杠的字符串。 

可以看到,由于对message参数使用了htmlspecialchars函数进行编码,因此无法再通过message参数注入XSS代码,但是对于name参数,只是简单过滤了<script>字符串,仍然存在存储型的XSS。

漏洞利用:

绕过方法参考上篇文章提到的三种方法,并且因为name参数在输入时有长度限制,必须通过抓包修改name参数。

High:

代码审计:

Stored XSS Source
vulnerabilities/xss_s/source/high.php
<?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();
}

?>

和reflect xss漏洞中high级别的防护措施是相同的,都是通过正则表达式来过滤标签<script>,那么绕过方法也是相同的,使用其他标签就好,这里不多做讲解,看一下之前的文章就好。

Impossible:

代码审计:

Stored XSS Source
vulnerabilities/xss_s/source/impossible.php
<?php

if( isset( $_POST[ 'btnSign' ] ) ) {
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

    // 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)) ? "" : ""));
    $message = htmlspecialchars( $message );

    // Sanitize name input
    $name = stripslashes( $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)) ? "" : ""));
    $name = htmlspecialchars( $name );

    // Update database
    $data = $db->prepare( 'INSERT INTO guestbook ( comment, name ) VALUES ( :message, :name );' );
    $data->bindParam( ':message', $message, PDO::PARAM_STR );
    $data->bindParam( ':name', $name, PDO::PARAM_STR );
    $data->execute();
}

// Generate Anti-CSRF token
generateSessionToken();

?>

在用户提交评论之前,它首先检查是否存在正确的反跨站请求伪造(Anti-CSRF)令牌。如果存在,则将输入数据中的消息和姓名进行处理,以便剥离反斜杠和转义字符,并使用 htmlspecialchars() 转义 HTML 特殊字符。然后,它使用 mysqli_real_escape_string() 函数对输入数据中的任何敏感字符进行转义,以防止 SQL 注入攻击。

最后,它将这些数据插入到数据库表中,以便在网站上显示。

生成了一个新的 Anti-CSRF 令牌,以防止多个提交时的CSRF攻击。

 

标签:XSS,name,DVWA,ston,Stored,mysqli,___,GLOBALS
From: https://www.cnblogs.com/yaolingyu/p/17241152.html

相关文章

  • XSS
    XSS漏洞描述​ XSS攻击全称跨站脚本攻击,是为不和层叠样式表(CascadingStyleSheets,CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全......
  • DVWA-XSS(DOM)
    漏洞详解。DOMXSS(Cross-sitescripting)是一种Web安全漏洞,它利用了浏览器的DOM(文档对象模型)解析机制,通过注入恶意代码来攻击用户。DOMXSS与传统的反射型或存储型XSS有所......
  • springboot防止XSS攻击和sql注入
     文章目录1.XSS跨站脚本攻击①:XSS漏洞介绍②:XSS漏洞分类③:防护建议2.SQL注入攻击①:SQL注入漏洞介绍②:防护建议3.SpringBoot中如何防止XSS攻击和......
  • Spring Boot 如果防护 XSS + SQL 注入攻击 ?一文带你搞定!
    1.XSS跨站脚本攻击①:XSS漏洞介绍跨站脚本攻击XSS是指攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被解析执行,从而达到恶意攻......
  • XSS和CSRF漏洞
    XSS和CSRF漏洞目录XSS和CSRF漏洞XSS漏洞介绍XSS分类利用XSS漏洞如何实行攻击利用XSS盗取用户的Cookie利用XSS实行钓鱼利用XSS进行键盘监控CSRF漏洞介绍CSRF漏洞攻击条件CS......
  • XSS和CSRF漏洞
    XSS和CSRF漏洞XSS漏洞介绍XSS(Cross-Site-Scripting),即跨站脚本攻击,是指攻击者利用Web服务器中的代码漏洞,在页面中嵌入客户端脚本(通常是一段由JavaScript编写的恶意代码),当......
  • DVWA-SQL Injection(SQL注入)
      SQLInjection,是指攻击者通过注入恶意的SQL命令,破坏SQL查询语句的。结构,从而达到执行恶意SQL语句的目的。LOW:代码审计:SQLInjectionSourcevulnerabilities/s......
  • pikachu -Xss
    跨站脚本漏洞常见类型危害:存储型>反射型>DOM型1.反射型交互的数据一般不会被存在在数据库里面,一次性,所见即所得,一般出现在查询类页面等。2.存储型交互的数据会被......
  • Web漏洞-XSS跨站之代码及httponly绕过
    进入后台获得后台权限:cookie权限进入后台;直接账号密码登录Str-replace   关键字过滤什么是httponly如果在cookie中设置了httponly属性,那么通过js脚本将无法读取到co......
  • SpringCloud微服务实战——搭建企业级开发框架(五十一):微服务安全加固—自定义Gateway拦
      SQL注入是常见的系统安全问题之一,用户通过特定方式向系统发送SQL脚本,可直接自定义操作系统数据库,如果系统没有对SQL注入进行拦截,那么用户甚至可以直接对数据库进行增删......