DVWA篇之XSS存储型
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DVWA篇之XSS存储型相关的知识,希望对你有一定的参考价值。
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存储型的主要内容,如果未能解决你的问题,请参考以下文章