码迷,mamicode.com
首页 > 其他好文 > 详细

DVWA篇之XSS存储型

时间:2018-05-17 19:15:21      阅读:373      评论:0      收藏:0      [点我收藏+]

标签:web   dvwa   

Low级别

  • 当我们在表格中输入名字和内容就会存储到数据库,并在页面显示出来
    技术分享图片
  • 同样的我们输入一个名字,然后在内容中输入我们的payload语句,分析是否能攻击成功。

技术分享图片
攻击成功。这时我们的语句被存储在数据库中。

  • 我们查看一下是否真的被存储在数据库中
    技术分享图片
    可以看到在第三行的记录就是我们的payload语句,没有被任何过滤,完完整整的存储在数据库中。
    因为是存储性的,当我们再次访问的时候肯定会直接出现弹框,这个可以刷新测试。

  • 接下来分析一下造成这个结果的原因,我们查看源代码。
    技术分享图片
    trim()函数,用于去除字符串左右两侧的空格
    stripslashes()函数,用于去除字符串中的反斜杠
    mysqli_real_escape_string()对sql语句中的特殊字符进行转义。
    从源码上看,此处,只是对输入的name,message做了防止sql注入的过滤,并没有对输入的字符串进行安全性过滤和处理。
    当字符串写入数据库的时候,如果存在特殊字符,也会被转义,但是在当我们从数据库中调出的时候,并不影响特殊字符的功能。

Medium级别

  • 在这个级别下我们还是用同样的方式测试一下结果。
    技术分享图片
    出现了弹框,但是弹出的是1,因为在数据库中我没有将low下存储的payload删除。但是可以看出,我们输入的内容变成了alert(2),<script>标签被过滤了。
  • 我们去数据库中查看一下我们将什么存储到了数据库
    技术分享图片
    可以看到第四行,明显过滤了<script>标签。

  • 查看一下源代码,分析过滤的过程。
    技术分享图片
    strip_tags()函数去除html标签
    htmlspecialchars()函数,将预定义字符转换成html实体
    str_replace()函数,转义函数,将指定的字符或字符串转换成别的字符,这里是将<script>转为空。缺点转义的时候区分大小写。

通过源码可以看出,对message的值进行了标签的过滤以及预定义符的转义。对name的值进行了转义。

  • 可能我们在message中很难实现攻击,但是我们可以尝试在name中进行攻击。因为在那里转义的时候只转义了小写,我们只需要将payload中的一个或多个字符大写即可成功攻击。
    技术分享图片

但是这时我们发现这里只能输入这几个字符,怎么办。

  • 审查元素,将maxlength改为100.
    技术分享图片

  • 这时我们再去输入payload,便可以弹框
    技术分享图片
  • 我们绕过了函数的过滤,再来查看一下数据库的存储。
    技术分享图片
    可以看到payload被存储到了name下。

High级别

  • 利用上面的两种级别的方法测试,发现都不会成功。我们查看源码分析。
    技术分享图片
    这个源码比中级别的多了一个过滤函数来过滤name的值,preg_replace()函数,进行正则表达式匹配防止大小写,多重输入字符绕过过滤函数。

  • 这个函数虽然不错,但是我们不用与低中级相似的payload,不就可以成功绕过这个函数了嘛!
    我们构造payload:
    <img src=1 omerror=alert(3)>
    测试我们的payload,如果name文本框不能输入全部,可以审查元素,修改maxlength的值
    技术分享图片
  • 成功进行弹框。我们再来看一下数据库中的存储数据
    技术分享图片

impossible级别

  • 直接看下源码吧,人家都说不可能的了,看看为什么不可能
    技术分享图片
    这个源码在high的基础上,给name的值加上了htmlspecialchars()函数进行转义,将预定义符号转换为html实体

DVWA篇之XSS存储型

标签:web   dvwa   

原文地址:http://blog.51cto.com/12332766/2117639

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!