浅谈XSS漏洞攻击与防御

  跨站脚本简称xss(cross-site scripting),利用方式主要是借助网站本身设计不严谨,导致执行用户提交的恶意js脚本,对网站自身造成危害。xss漏洞是web渗透测试中最常见而又使用最灵活的一个漏洞。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了HTML以及用户端脚本语言。

XSS分类

XSS大致分为:反射型、存储型、DOM型(这三种为主流)

反射型xss

  只是简单地把用户输入的数据”反射”给浏览器,攻击时需要用户配合点击,也叫”非持久型xss”。

存储型xss

  会把用户输入的数据”存储”在服务器端,也叫”持久性xss”,常见留言板等可以提交展示用户输入内容的功能点。

DOM型xss

  从是否存储可划分成反射型,可通过修改页面的DOM节点形成的xss漏洞。

注意:无论反射型还是存储型,都是需要与服务端交互的,即服务端将提交的内容反馈到了html源码内,导致触发xss,也就是说返回到html源码中可以看到触发xss的代码;而DOM型xss是不与服务端交互的,只与客户端上的js交互,也就是说提交的恶意代码,被放到了js中执行,然后显示出来。那么这种形式有一个问题,就是html源码里面不存在触发xss的代码,因为服务端返回的源码都是一样的,只不过源码里面包含了一段js,这段js再执行后生成了一段xss代码,可以在审查元素中查看到。

XSS危害

  xss漏洞是发生在客户端,目的是让浏览器执行一段用户提交的恶意js代码,从而达到某种目的。从表面上看,xss漏洞的危害止步于客户端,且主要就是用来执行js获取用户信息(比如浏览器版本等等)。然而由于xss漏洞可能发生的地方很多,因此被利用的情况也不统一,以下列举了xss漏洞能够造成的一些危害(xss漏洞危害包含但不仅限于以下几种)。

  • cookie劫持(窃取cookie)
  • 后台增删改文章等操作(类似于csrf骗取用户点击,利用js模拟浏览器发包,借助xmlhttprequest类)
  • 钓鱼,利用xss构造出一个登录框,骗取用户账户密码。
  • Xss蠕虫(利用xss漏洞进行传播)
  • 修改网页代码
  • 利用网站重定向

利用XSS窃取cookie

  因为cookie能够代表用户的身份,所以盗取了cookie之后,就可以伪造用户去做一些事情了,这个产生的危害是非常可怕的。

cookie介绍

cookie分为内存cookie和硬盘cookie,内存cookie储存在浏览器内存中,关闭浏览器则消失。cookie由变量名与值组成,其属性里有标准的cookie变量,也有用户自定义的属性。

1
cookie格式:Set-Cookie:=[;=][;expiress=][;domain=][;path=][;secure][;httponly]

cookie各个参数详细内容:

  • Set-cookie:http响应头,向客户端发送cookie。
  • Name=value:每个cookie必须包含的内容。
  • Expires=date:EXpires确定了cookie的有效终止日期,可选。如果缺省,则cookie不保存在硬盘中,只保存在浏览器内存中。
  • Domain=domain-name:确定了哪些inernet域中的web服务器可读取浏览器储存的cookie,缺省为该web服务器域名。
  • Path=path:定义了web服务器哪些路径下的页面可获取服务器发送的cookie。
  • Secure:在cookie中标记该变量,表明只有为https通信协议时,浏览器才向服务器提交cookie。
  • Httponly:禁止javascript读取,如果cookie中的一个参数带有httponly,则这个参数将不能被javascript获取;httponly可以防止xss会话劫持攻击。

防御 XSS

为防御 XSS,我们首先要知道 XSS 攻击的本质是不安全的
HTML 注入,可通过在 HTML、CSS、JS 或 HTTP 协议层次上进行防范。下面提供一些常用的防御策略:

输入检查

用户名、邮箱等表单验证(前台/服务器二次验证)
富文本使用白名单机制等

输出检查

HTML-Encoder
js-Encoder

HTTP 头部:HttpOnly

设置 cookie 时加入 HttpOnly 可使 js 脚本无法获取 cookie

HTTP 头部:CSP(Content Security Policy)

定义允许的资源加载地址,比如图片 / 视频 / JS 脚本等

HTTPS加密访问

有效防止 DOM XSS 攻击