一、XSS
1、 定义
XSS即(Cross Site Scripting)中文名称为:跨站脚本攻击;
比如在有表单输入的地方,用户输入了类似<script>alert("ok")</script>的东西,而服务器没有经过过滤就保存下来了,别的用户看到网页就会弹出提示框。当然,xss攻击还可以做其他更加复杂的事情。比如,获取cookie什么的。
XSS的重点不是在跨站点,而在于脚本的执行。当用户浏览该页面的时候,那么嵌入到web页面中script代码会执行,因此会达到恶意攻击的目的。
XSS 存在的根本原因:对URL中的参数,对用户输入提交给web server的内容,没有进行充分的过滤。如果我们能够在web程序中,对用户提交的URL中的参数,和提交的所有内容,进行充分的过滤,将所有的不合法的参数和输入内容过滤掉,那么就不会导致“在用户的浏览器中执行攻击者自己定制的脚本”。
2、类型
反射型、存储型、DOM-based型
(1)反射性XSS原理
反射性XSS一般指攻击者通过特定的方式来诱惑受害者去访问一个包含恶意代码的URL,当受害者点击恶意链接url的时候,恶意代码会直接在受害者的主机上的浏览器执行。
反射型XSS的攻击步骤
- 攻击者构造出特殊的URL,其中包含恶意代码.
- 用户打开有恶意代码的URL时,网站服务器端将恶意代码从URL取出,拼接在HTML返回给浏览器.
- 用户浏览器接收到响应后解析执行,混在其中的恶意代码也会被执行。
- 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户行为,调用目标网站接口执行攻击者指定的操作.
注意:Chrome和Safari能够检测到url上的xss攻击,将网页拦截掉,但是其他浏览器不行,如IE和Firefox。
如何防御反射型XSS攻击?
对url查询参数进行转义后再输出到页面。
(2)存储型XSS的原理
只要是将恶意代码存储或上传到服务器中,下次只要受害者浏览包含此恶意代码的页面就会执行恶意代码。存储型XSS攻击的原因仍然是没有做好数据过滤:前端提交数据至服务器端时,没有做好过滤;服务端在按受到数据时,在存储之前,没有做过滤;前端从服务器端请求到数据,没有过滤输出。
存储型XSS的攻击步骤
- 攻击者将恶意代码提交到目标网站的数据库中。
- 用户打开目标网站时,网站服务端将恶意代码从数据库中取出,拼接在HTML中返回给浏览器。
- 用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。
- 恶意代码窃取用户数据并发送到攻击者的网站,或冒充用户行为,凋用目标网站接口执行攻击者指定的操作。
这种攻击常见于带有用户保存数据的网站功能,如论坛发帖,商品评论,用户私信等。
(3)DOM XSS是基于文档对象模型的XSS,web server不参与,仅仅涉及到浏览器的XSS,,实际上就是前端javascript代码不够严谨,把不可信的内容插入到了页面,在使用innerHTML、outerHTML、appendChild、document.write()等API时要特别小心,不要把不可信的数据作为HTML插入到页面上,尽量使用.innerText、textContent、setAttribut( )等。
DOM型XSS的攻击步骤
- 攻击者构造出特殊数据,其中包含恶意代码。
- 用户浏览器执行了恶意代码。
- 恶意窃取用户数据并发送到攻击者的网站,或冒充用户行为,调用目标网站接口执行攻击者指定的操作。
如何防御DOM型XSS攻击
防范DOM型XSS攻击的核心就是对输入内容进行转义(DOM中的内联事件监听顺和链接跳转都能把字符串作为代码运行,需对内容进行检查)
- 对于url链接(例如图片的src属性)那么直接使用encodeURIComponent来转义。
- 对于非url,我们可以进行编码;
面试:cookie安全策略
在服务器设置cookie的时候设置http-only,这样就可以防止用户通过JS获取cookie。对cookie的读写或发送一般有如下字段进行设置:
- http-only:只允许http或https请求读取cookie,JS代码是无法读取cookie的(document cookie会显示http-only的cookie项被自动过滤),发送请求时自动发送cookie;
- secure-only:只允许https请求读取,发送请求时自动发送cookie;
- host-only:只允许主机域名与domain设置完成一致的网站才能访问该cookie;
3、预防
对提交的所有内容进行过滤,对url中的参数进行过滤,过滤掉会导致脚本执行的相关内容;然后对动态输出到页面的内容进行html编码,使脚本无法在浏览器中执行。
对用户的输入进行过滤,如对& < > " ' /等进行转义。
二、CSRF
1、定义
CSRF(Cross-site request forgery) 全称跨站请求伪造,是一种挟制用户在当前已登录的Web
应用程序上执行非本意的操作的攻击方法,可以理解为攻击者盗用了用户的身份,以用户的名义发送了恶意请求。
可见完成一次CSRF
攻击,用户必须依次存在着两个操作:
- 登录信任网站A,并保存
Cookie
- 在不登出网站A的情况下,点击危险网站B
由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。
2、CSRF
特点
- 攻击一般发起在第三方网站,而不是被攻击的网站。被攻击的网站无法防止攻击发生
- 攻击利用受害者在被攻击网站的登录凭证,冒充受害者提交操作;而不是直接窃取数据
- 整个过程攻击者并不能获取到受害者的登录凭证,仅仅是“冒用”
- 跨站请求可以用各种方式:图片
URL
、超链接、CORS
、Form
提交等等。部分请求方式可以直接嵌入在第三方论坛、文章中,难以进行追踪
CSRF
通常是跨域的,因为外域通常更容易被攻击者掌控。但是如果本域下有容易被利用的功能,比如可以发图和链接的论坛和评论区,攻击可以直接在本域下进行,而且这种攻击更加危险。
3、常见CSRF
攻击类型
(1)GET类型
GET
类型的CSRF
利用非常简单,只需要一个HTTP
请求,一般会这样利用:
<img src="http://bank.example/withdraw?amount=10000&for=hacker" >
在受害者访问含有这个img
的页面后,浏览器会自动向http://bank.example/withdraw?account=xiaoming&amount=10000&for=hacker
发出一次HTTP请求。bank.example
就会收到包含受害者登录信息的一次跨域请求。
(2)POST类型
这种类型的CSRF利用起来通常使用的是一个自动提交的表单,如:
<form action="http://bank.example/withdraw" method=POST>
<input type="hidden" name="account" value="xiaoming" />
<input type="hidden" name="amount" value="10000" />
<input type="hidden" name="for" value="hacker" />
</form>
<script> document.forms[0].submit(); </script>
访问该页面后,表单会自动提交,相当于模拟用户完成了一次POST
操作。
POST
类型的攻击通常比GET
要求更加严格一点,但仍并不复杂。任何个人网站、博客,被黑客上传页面的网站都有可能是发起攻击的来源,后端接口不能将安全寄托在仅允许POST
上面。
4、防御措施
- 重要数据交互采用POST进行接收,当然是用POST也不是万能的,伪造一个form表单即可破解。
- 使用验证码,只要是涉及到数据交互就先进行验证码验证,这个方法可以完全解决CSRF。但是出于用户体验考虑,网站不能给所有的操作都加上验证码。因此验证码只能作为一种辅助手段,不能作为主要解决方案。
- 验证HTTP Referer字段,该字段记录了此次HTTP请求的来源地址,最常见的应用是图片防盗链。PHP中可以采用APache URL重写规则进行防御,可参考:http://www.cnblogs.com/phpstudy2015-6/p/6715892.html
- 为每个表单添加令牌token并验证。