了解XSS攻击

191 阅读5分钟

1.  什么是XSS

Cross Site Scripting(跨站脚本攻击),是一种代码注入攻击。攻击者在目标网站注入恶意脚本,使之在用户的浏览器运行。利用这些恶意脚本,盗取用户的敏感信息如cookie等,进而危害数据安全。

2.  分类

分类:反射型(非持久型)XSS、存储型(持久型)XSS、DOM型XSS。

2.1 反射型(非持久型)XSS

反射型xss只是简单的把用户输入的数据从服务器反射给用户浏览器,要利用这个漏洞,攻击者必须以某种方式诱导用户访问一个精心设计的URL(恶意链接),才能实施攻击。比如:如果未做防范XSS,用户名设为,则会执行预设好的JavaScript代码。

2.1.1 漏洞成因

当用户的输入或者一些用户可控参数未经处理地输出到页面上,就容易产生XSS漏洞。主要场景有以下几种:

● 将不可信数据插入到HTML标签之间时;// 例如div, p, td;

● 将不可信数据插入到HTML属性里时;// 例如:<div width=$INPUT>

● 将不可信数据插入到SCRIPT里时;// 例如:

● 还有插入到Style属性里的情况,同样具有一定的危害性;// 例如<span style=” property : $INPUT ”>

● 将不可信数据插入到HTML URL里时,// 例如:<a href=”www.abcd.com?param= $INPUT ”>

● 使用富文本时,没有使用XSS规则引擎进行编码过滤。

若服务端或者前端没有做好防范措施,就会出现漏洞隐患。

2.1.2 攻击流程

反射型XSS通常出现在搜索等功能中,需要被攻击者点击对应的链接才能触发,且受到XSS Auditor(chrome内置的XSS保护)、NoScript等防御手段的影响较大,所以它的危害性较存储型要小。

image.png

2.2 存储型(持久型)XSS

  存储型(或 HTML 注入型/持久型)XSS 攻击最常发生在由社区内容驱动的网站或 Web 邮件网站,不需要特制的链接来执行。黑客仅仅需要提交 XSS 漏洞利用代码(反射型XSS通常只在url中)到一个网站上其他用户可能访问的地方。这些地区可能是博客评论,用户评论,留言板,聊天室,HTML 电子邮件,wikis,和其他的许多地方。一旦用户访问受感染的页,执行是自动的。

2.2.1 漏洞成因

存储型XSS漏洞的成因与反射型的根源类似,不同的是恶意代码会被保存在服务器中,导致其它用户(前端)和管理员(前后端)在访问资源时执行了恶意代码,用户访问服务器-跨站链接-返回跨站代码。

2.2.2 攻击流程

image.png

2.3  DOM型XSS

通过修改页面的DOM节点形成的XSS,称之为DOM Based XSS。

2.3.1 漏洞成因

DOM型XSS是基于DOM文档对象模型的。对于浏览器来说,DOM文档就是一份XML文档,当有了这个标准的技术之后,通过JavaScript就可以轻松的访问DOM。当确认客户端代码中有DOM型XSS漏洞时,诱使(钓鱼)一名用户访问自己构造的URL,利用步骤和反射型很类似,但是唯一的区别就是,构造的URL参数不用发送到服务器端,可以达到绕过WAF、躲避服务端的检测效果。

2.3.2 攻击示例
<html>
    <head>
        <title>DOM Based XSS Demo</title>
        <script>
        function xsstest()
        {
        var str = document.getElementById("input").value;
        document.getElementById("output").innerHTML = "<img
        src='"+str+"'></img>";
        }
        </script>
    </head>
    <body>
    <div id="output"></div>
    <input type="text" id="input" size=50 value="" />
    <input type="button" value="submit" onclick="xsstest()" />
    </body>
</html>

在这段代码中,submit按钮的onclick事件调用了xsstest()函数。而在xsstest()中,修改了页面的DOM节点,通过innerHTML把一段用户数据当作HTML写入到页面中,造成了DOM Based XSS。

参考链接:juejin.cn/post/691203…

3.  防止XSS攻击

1、输入过滤:包括用户输入、url参数、post请求参数、Ajax

2、输出转义:比如<:‘<’ >:‘&gt’,转成特殊字符的实体

3、cookie设置为http-only(在服务端设置),那么页面的js将无法读取到cookie信息

4.  什么是CRSF攻击

Cross Site Request Forgery(跨站请求伪造),CSRF或XSRF。

CSRF通过伪装已登录用户身份,向网站发送恶意请求。

4.1  攻击流程

用户登录受信任网站A,在本地生成cookie 2、在不登出A的情况下,访问危险网站B,B含有需要用户身份的恶意请求,用户浏览器携带cookie发送请求,从而在用户不知情的情况下完成了一次请求。

image.png

参考链接:juejin.cn/post/691203…

4.2  防止CRSF攻击

1、验证码:强制用户与应用进行交互,才能完成最终请求。这种方式能很好的抑制csrf,但是用户体验较差

2、Referer Header:根据HTTP协议,在HTTP头中有一个字段叫Referer,记录了该HTTP请求的来源地址。 服务器判断请求头的referer。这种方法并非万无一失,Referer的值是由浏览器提供的,每个浏览器对于Referer的具体实现可能有差别,并不能保证浏览器自身没有安全漏洞。在部分情况下,攻击者可以隐藏,甚至修改自己请求的Referer。

3、服务端产生加密的token,客户端存到本地(cookie或localStorage,需要防止xss),以后的请求都将token放到authorization发送到服务端,服务端解密token判断。

5.  CSRF与XSS的区别

本质上讲,XSS是代码注入问题,CSRF是http问题。

XSS是内容没有过滤导致浏览器将攻击者的输入当代码执行

CSRF是因为浏览器在发送HTTP请求时自动带上cookie,而一般网站的session-id都存在cookie里

参考链接:juejin.cn/post/684490…