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编码等。
  • 相关阅读:
    7.ps相关选项
    6.ps的大U和小u区别
    5.进程优先级
    4.状态间的六种转换情况
    3.进程的不同状态
    2.进程与程序的关系
    1.进程概念
    不换行
    for引用变量
    脚本进阶
  • 原文地址:https://www.cnblogs.com/lxfweb/p/13286271.html
Copyright © 2011-2022 走看看