zoukankan      html  css  js  c++  java
  • XSS原理及代码分析

    前言

    XSS又叫跨站脚本攻击,是一种对网站应用程序的安全漏洞攻击技术。它允许恶意用户将代码注入网页,其他用户在浏览网页时就会受到影响。XSS分为三种:反射型,存储型,和DOM型。下面我会构造有缺陷的代码,从代码分析这三种类型。
    如果想要了解XSS基础的可以看我的这篇文章:XSS(跨站脚本攻击)简单讲解
    如果想要了解SQL注入原理的可以看我的这两篇文章:SQL注入原理及代码分析(一)
    SQL注入原理及代码分析(二)
    参考文献:《Web安全攻防》

    反射型XSS

    反射型XSS又叫非持久型XSS,这种攻击方式往往具有一次性。
    先看代码

    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
        <title>xss利用输出的环境构造代码</title>
    </head>
    <body>
    <center>
        <h6>把输入的字符串输出</h6>
        <form action="#" method="get">
            <h6>请输入</h6>
            <input type="text" name="xss" value="请输入"><br />
            <input type="submit" value="确定">
        </form>
        <hr>
        <?php
            if (isset($_GET['xss'])) {
                  echo '<input type="text" value="'.$_GET['xss'].'">';
            }else{
                echo '<input type="text" value="输出">';
            }
        ?>
    </center>
    </body>
    </html>
    

    在代码中,通过GET获取参数xss的值,然后通过echo输出一个input标签,并将xss的值放入input标签的value中。
    接下来我们看一下页面,例如我们输入123,会在下面的输出框中输出123。

    那么下面,我们当我们输入"><script>alert(1)</script>时,输出到页面的HTML代码变为<input type="text" value=""><script>alert(1)</script>">我们发现,输入的双引号闭合了value属性的双引号,输入的>闭合了input的标签<,导致我们后面输入的恶意代码成为另一个HTML标签。

    当浏览器渲染时执行了,JS函数alert()导致浏览器弹窗。

    存储型XSS

    先看代码,参考dvwa的核心代码。

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

    在上面代码中,获取POST参数mtxMessage和txtName,然后将将参数插入到数据库的表中,并显示到页面上。
    页面的功能是获取用户名字和内容并插入到数据库中,如果我们输入恶意代码,那么也会插入到数据库中,只有用户访问这个页面,那么恶意代码就会执行。

    打开数据库发现插入了我们构造的恶意代码。

    DOM型XSS

    先看代码

    <html>
    <head>
        <meta http-equiv="content-type" content="text/html;charset=utf-8" />;
        <title>测试</title>
        <script type="text/javascript">
                function tihuan() {
                        document.getElementById("id1").innerHTML =document.getElementById("dom_input").value;
                }
        </script>
    </head>
    <body>
    <center>
        <h6 id="id1">这里显示输入的内容</h6>
        <form action="#" method="post">
               <input type="text" id="dom_input" value="输入"><br />
               <input type="button" value="替换" onclick="tihuan()">
        </form>
        <hr>
    
    </center>
    </body>
    </html>
    

    DOM型XSS程序只有HTML代码,并不存在服务端代码,所以此程序并没有与服务端进行交互。程序存在JS函数tihuan(),该函数得作用是通过DOM操作将元素id1得内容修改为元素dom_input的内容。
    这个页面得功能是输入框中输入什么,上面得文字就会被替换成什么。

    如果我们输入恶意代码,比如,单击替换按钮,页面弹出消息框,由于隐式输出,所以查看源代码时是看不到XSS代码的。

    XSS修复建议

    1. 过滤输入的数据包括但不限于单引号,双引号,“<,>”等。
    2. 对输出到页面的数据进行相应的编码转换,包括HTML实体编码,JavaScript编码等。
  • 相关阅读:
    自定义组件要加@click方法
    绑定样式
    647. Palindromic Substrings
    215. Kth Largest Element in an Array
    448. Find All Numbers Disappeared in an Array
    287. Find the Duplicate Number
    283. Move Zeroes
    234. Palindrome Linked List
    202. Happy Number
    217. Contains Duplicate
  • 原文地址:https://www.cnblogs.com/lxfweb/p/13286271.html
Copyright © 2011-2022 走看看