Web篇(6.3) 09. 跨站脚本 - 存储型XSS ❀ FortiWeb 攻防演练

  【简介】跨站脚本(Cross-site scripting,简称:XSS)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。从而使目标计算机收到危害。


Web篇(6.3) 09. 跨站脚本 - 存储型XSS ❀ FortiWeb 攻防演练  存储型XSS

  存储型XSS攻击是指注入的脚本永久存储在目标服务器上的攻击,例如在数据库、消息论坛、访问者日志、注释字段等中。受害者在请求存储时从服务器检索恶意脚本、信息。存储型XSS有时也称为持久性或Ⅰ型 XSS。

Web篇(6.3) 09. 跨站脚本 - 存储型XSS ❀ FortiWeb 攻防演练  安全等级 - Low

  将DVWA的安全等级切换到Low。

Web篇(6.3) 09. 跨站脚本 - 存储型XSS ❀ FortiWeb 攻防演练

    ① 选择【XSS (Stored)】,在Name和Message输入内容,点击【Sign Buestbook】,下面会显示刚才输入的内容。点击【View Source】,查看数据库源代码。

Web篇(6.3) 09. 跨站脚本 - 存储型XSS ❀ FortiWeb 攻防演练

    ② 分析源码,可以看到有使用三个函数: trim() 函数移除字符串两侧的空白字符或其他预定义字符,预定义字符包括\0、\t、\n、\x0B、\r以及空格,可选参数charlist支持添加额外需要删除的字符;stripslashes() 函数删除字符串中的反斜杠;mysql_real_escape_string() 函数会对字符串中的特殊符号(\x00,\n,\r,\,',",\x1a)进行转义。

  可以看到,对输入并没有做XSS方面的过滤与检查,且存储在数据库中,因此这里存在明显的存储型XSS漏洞。

Web篇(6.3) 09. 跨站脚本 - 存储型XSS ❀ FortiWeb 攻防演练

    ③ Name字段输入Test,Message字段输入 <script>alert(123456)</script> ,点击【Sign Guestbook】。

Web篇(6.3) 09. 跨站脚本 - 存储型XSS ❀ FortiWeb 攻防演练

    ④ 可以看到有弹出视窗,显示指定的内容。

Web篇(6.3) 09. 跨站脚本 - 存储型XSS ❀ FortiWeb 攻防演练  安全等级 - Medium

  将安全等级升级为中级。

Web篇(6.3) 09. 跨站脚本 - 存储型XSS ❀ FortiWeb 攻防演练

    ① 分析源码,可以看到有使用 strip_tags() 函数剥去字符串中的HTML、XML以及PHP的标签,但允许使用<b>标签; addslashes() 函数返回在预定义字符(单引号、双引号、反斜杠、NULL)之前添加反斜杠的字符串。

  可以看到,由于对 message 参数使用了 htmlspecialchars() 函数进行编码,因此无法再通过 message 参数注入XSS代码,但是对于name参数,只是简单过滤了<script>字符串,仍然存在存储型的XSS。

Web篇(6.3) 09. 跨站脚本 - 存储型XSS ❀ FortiWeb 攻防演练

    ② Name字段的输入长度限制为最多十个字符。

Web篇(6.3) 09. 跨站脚本 - 存储型XSS ❀ FortiWeb 攻防演练

    ③ Burpsuite抓包,改为 <script>alert(123456)</script>,点击【Forward】。 

Web篇(6.3) 09. 跨站脚本 - 存储型XSS ❀ FortiWeb 攻防演练

      ④ 一样会显示弹出框。

  还可以修改为

  双写绕过: <sc<script>ript>alert(123456)</script>

  大小写混淆绕过 <ScRipt>alert(123456);</ScRipt>

  使用非 script 标签:<img src=1 οnerrοr=alert(123456)>

  以上抓包修改数据Forward后,均能成功弹窗。

  通常有一些方式可以测试网站是否有正确处理特殊字符:

  ><script>alert(document.cookie)</script>
  ='><script>alert(document.cookie)</script>
  "><script>alert(document.cookie)</script>
  <script>alert(document.cookie)</script>
  <script>alert (vulnerable)</script>
  %3Cscript%3Ealert('XSS')%3C/script%3E
  <script>alert('XSS')</script>
   <img src="javascript:alert('XSS')">
  <img src="http://xxx.com/yyy.png" οnerrοr="alert('XSS')">

Web篇(6.3) 09. 跨站脚本 - 存储型XSS ❀ FortiWeb 攻防演练  安全等级 - High

  将安全等级升级为高级。

Web篇(6.3) 09. 跨站脚本 - 存储型XSS ❀ FortiWeb 攻防演练

    ① 分析源码,可以看到这里使用正则表达式过滤了<script>标签,但是却忽略了img、iframe等其它危险的标签,因此name参数依旧存在存储型XSS。

Web篇(6.3) 09. 跨站脚本 - 存储型XSS ❀ FortiWeb 攻防演练

    ② Burpsuite抓包,改为 <img src=1 οnerrοr=alert(12456)>,点击【Forward】。 

Web篇(6.3) 09. 跨站脚本 - 存储型XSS ❀ FortiWeb 攻防演练

      ③ 依然会显示弹出框。

Web篇(6.3) 09. 跨站脚本 - 存储型XSS ❀ FortiWeb 攻防演练  安全等级 - Impossible

  将安全等级升级为不可能。

Web篇(6.3) 09. 跨站脚本 - 存储型XSS ❀ FortiWeb 攻防演练

    ① 分析源码,可以看到,由于对 message 和 name 参数都使用了 htmlspecialchars() 函数进行编码,因此无法再通过 message 和 name 参数注入XSS代码。

Web篇(6.3) 09. 跨站脚本 - 存储型XSS ❀ FortiWeb 攻防演练  FortiWeb 防护

  FortiWeb可以阻止这一类的攻击。

Web篇(6.3) 09. 跨站脚本 - 存储型XSS ❀ FortiWeb 攻防演练

   ① 这次我们访问192.168.1.128,也就是经过FortiWeb保护的DVWA,安全选择Low,输入一段注入代码,看看会发生什么。

Web篇(6.3) 09. 跨站脚本 - 存储型XSS ❀ FortiWeb 攻防演练

    ② 访问被FortiWeb成功的阻止了。

Web篇(6.3) 09. 跨站脚本 - 存储型XSS ❀ FortiWeb 攻防演练

     ③ 登录FortiWeb,选择菜单【日志和报表】-【攻击】,点击【添加过滤器】。

Web篇(6.3) 09. 跨站脚本 - 存储型XSS ❀ FortiWeb 攻防演练

    ④ 选择【消息ID】。

Web篇(6.3) 09. 跨站脚本 - 存储型XSS ❀ FortiWeb 攻防演练

    ⑤  选择阻止页面上显示的消息ID。

Web篇(6.3) 09. 跨站脚本 - 存储型XSS ❀ FortiWeb 攻防演练

    ⑥ 显示XSS攻击被FortiWeb阻止了。如果有了FortiWeb,这样大部分因为代码产生的漏洞安全问题,就可以有效的解决了。

 


Web篇(6.3) 09. 跨站脚本 - 存储型XSS ❀ FortiWeb 攻防演练