** 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实体