XSS(DOM)

​ XSS攻击全称跨站脚本攻击。是指用户在Web页面中提交恶意脚本,从而使浏览包含恶意脚本的页面的用户在不知情的情况下执行该脚本,导致被攻击的行为。

​ 与SQL注入类似,XSS也是利用提交恶意信息来实现攻击效果的攻击行为。但是XSS一般提交的是Javascript脚本,运行在Web前端,也就是用户的浏览器;而SQL注入提交的SQL指令是在后台数据库服务器执行。所以两者攻击的对象是不一样的。

​ XSS按照攻击的手法,一般可以分为反射型XSS(Reflected)、存储型XSS(Strored)、DOM型XSS(DOM)。

​ 反射型XSS是指恶意的攻击脚本包含在URL中,只有当用户访问了包含恶意脚本的URL,才会被害。反射型的攻击,攻击脚本不会写入网站的数据库,是一次性的攻击,所以黑客一般需要诱骗用户点击包含攻击脚本的URL,才能攻击成功。

​ 存储型XSS则是把攻击脚本提交到网站后台数据库,只要有人访问了显示该数据内容的页面,就会被攻击。比较常见的场景就是黑客发表了一篇包含攻击脚本的帖子,那么只要有人访问该帖子内容的用户,就会自动在他们的浏览器上执行攻击脚本。相对于反射型,存储型的XSS成功率更高。

​ DOM型XSS是指基于DOM文档对象模型的XSS攻击。编写网页时,经常会用到各种DOM对象,如document.referer、document.write等等。DOM型XSS攻击的输出点就位于DOM对象上。严格来说,DOM型XSS即有可能是反射型,也有可能是存储型

Low级别 DOM型 XSS攻击实战

  1. 设置安全级别为Low,点击XSS(DOM)按钮,进入DOM型XSS攻击页面。发现是个选择框,随便选择一个选项,提交发现选择的参数会携带在URL中,说明页面提交方式为GET。

    1

  2. 在选择框附近点击右键选择查看网页源代码,发现选择框中的内容使用了document.write的方式来输出,说明页面的XSS方式为DOM型,

    2

  3. 在URL后直接加入攻击脚本<script>alert(document.cookie)</script>,发现可以直接弹窗。

    3

Medium级别 DOM型 XSS攻击实战

  1. 设置安全级别为Medium,进入DOM型XSS攻击页面。查看页面源码,发现存在代码,如果发现提交的内容中含有<script则替换为 English,所以<script>标签无法使用。我们的思路与前面一样,使用<img>标签来进行攻击,在URL后加入<img src=1 onerror=alert(document.cookie)>,发现仍无法弹窗。

    1

2

  1. 使用浏览器的开发者工具查看前端源码,发现脚本内容被输出到了<option>标签的value值中,导致无法执行。

    3

  2. 根据上一步的发现,我们需要构造</option>标签和</select>标签来闭合语法,使脚本能够被执行,在URL后加入></option></select><img src=1 onerror=alert(document.cookie)>,可以弹窗。

    4

High级别 DOM型 XSS攻击实战

  1. 设置安全级别为High,进入DOM型XSS攻击页面,查看页面源码,发现做了白名单过滤机制,提交的变量必须是FrenchEnglishGermanSpanish中的一个,才允许提交,否则就会转换为空值。

    1

  2. 考虑到JS是前端脚本,我们只需要在正常提交的值后用#把后面的攻击脚本注释掉,脚本内容就不会提交至服务器,也就可以通过白名单验证。但脚本仍然会在本地浏览器执行。在URL后加入如下脚本内容#<script>alert(document.cookie)</script>,注意#前有一个空格,可以弹窗

    2

Impossible级别 DOM型 攻击实战

  1. 查看Impossible级别源码,发现只有一句话:Don’t need to do anything, protction handled on the client side,。意思是不在服务端做任何措施,只在客户端浏览器实现防御。在浏览器开发者工具中查看源码,发现输出的变量值直接使用了lang,而没有用decodeurl(lang)。也就是说页面本身不会对特殊字符的URL编码进行反编码还原,而是直接把特殊字符以URL编码的方式交由浏览器处理,所以就不存在XSS攻击的可能性了。

    1

2

  1. 尝试提交脚本,发现果然把特殊符号直接输出了URL编码,

3