「这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战」
跨站脚本攻击(XSS攻击)
简介
XSS
又称CSS(Cross SiteScript),跨站脚本攻击,是web
程序中常见的漏洞,XSS
属于被动式且用于客户端的攻击方式。其原理是攻击者有意向有XSS
漏洞的网站中输入(传入)恶意的HTML
代码,当用户浏览该网站时,这段HTML
代码会自动执行,从而达到攻击的目的。如:盗取用户的cookie
,破坏页面结构,重定向到其他网站等。
分类
-
反射型XSS
-
原理: 反射型XSS,又叫非持久性XSS,
是指发生请求时,XSS代码出现在请求 URL中,作为参数提交到服务器,服务器解析并响应。响应结果中包含XSS代码,最后浏览器解析并执行。
-
实现:攻击者通过给用户发送带有恶意脚本的
URL
地址,当URL
地址被打开的时,特有的恶意代码参数被HTML
解析,执行。
-
-
存储型
- 原理:一般是攻击者将恶意代码“存储”在服务器端,主要是将
XSS
代码发送到服务器,不管是数据库,内存还是文件系统。只要用户浏览包含此恶意代码的页面都是执行恶意代码。 - 执行:存储型XSS一般出现在网站的留言,评论,博客日志等交互处。例如:攻击者在网站提交了一条包含XSS代码的留言道数据库,当用户查询留言时,那些包含恶意代码的留言就会从服务器解析之后加载出来,浏览器发现有恶意代码,但是作正常的HTML和JS解析执行。XSS的攻击就发生了。
- 原理:一般是攻击者将恶意代码“存储”在服务器端,主要是将
-
DOM based XSS
- 基于DOM的XSS,也就是没有服务器的参与,仅仅只涉及浏览器的XSS,比如根据用户的输入来动态构造一个DOM节点,如果没有对用户的输入进行过滤,也就导致了XSS的产生。
XSS防御
XSS防御的总体思路:对输入(URL参数)进行
过滤
,对输出进行编码
。
跨站请求伪造(CSRF)
CSRF就是利用你所在的网站的登录的状态,以你的名义向网站发送恶意请求。例如利用你的身份发送邮件,短信,交易转账,盗取你的账号,甚至购买商品,虚拟货币转账等等。
实现:用户登录受信任网站A,并且在本地生成了cookie,在不退出网站A的情况下,访问了危险网站B。
CSRF防御
- 增加
token
(token
就是服务端返回给客户端类似sessionId
)。在请求中放入攻击者不能伪造的信息,并且该信息总是不存在于cookie
当中。系统开发人员可以在HTTP
请求中以参数的形式加入一个随机产生的token,并在服务器端进行token验证,如果请求中没有token或者token
内容不正确,则认为是CSRF
攻击而拒绝请求。 - 通过
Referer
识别。根据HTTP
协议,在HTTP
头中有一个字段叫Referer
,它记录了HTTP
请求的来源地址。在通常情况下,访问一个安全受限的页面的请求都来自同一个网站。 - 在
HTTP
头中自定义属性并验证。这种方法也是使用token
并进行验证,和之前不同的是,这里并不是把token
以参数的形式置于HTTP
请求之中,而是把它放到HTTP
头中自定义的属性里。通过XMLHttpRequest
这个类,可以一次性给所有该类请求加上csrftoken
这个HTTP
头属性,并把token
值放入其中。这样解决了上种方法在请求中加入token
的不便,同时,通过XMLHttpRequest
请求的地址不会被记录到浏览器的地址栏,也不用担心token
会透过Referer
泄露到其他网站中去。
然而这种方法的局限性非常大。XMLHttpRequest 请求通常用于 Ajax 方法中对于页面局部的异步刷新,并非所有的请求都适合用这个类来发起,而且通过该类请求得到的页面不能被浏览器所记录下,从而进行前进,后退,刷新,收藏等操作,给用户带来不便。另外,对于没有进行 CSRF 防护的遗留系统来说,要采用这种方法来进行防护,要把所有请求都改为 XMLHttpRequest 请求,这样几乎是要重写整个网站,这代价无疑是不能接受的。