《图解HTTP》读书笔记:
★web应用攻击技术
对web应用的攻击模式分为主动攻击和被动攻击。
1.以服务器为目标的主动攻击
主动攻击是攻击者通过直接访问web应用,把攻击代码注入的攻击模式。由于该模式是直接针对服务器上的资源进行攻击,因此攻击者需要能够访问到那些资源。
主动攻击模式里具有代表性的就是SQL注入攻击和OS命令注入攻击
2.以服务器为目标的被动攻击
被动攻击是指利用圈套策略执行攻击代码的攻击模式。在被动攻击过程中,攻击者不直接对web应用访问发起攻击。
被动攻击通常的攻击模式为:
步骤①:攻击者诱使用户触发已设置好的陷阱,而陷阱会自动发送已嵌入攻击代码的HTTP请求
步骤②:当用户不知不觉中招以后,用户的浏览器就会触发这个陷阱
步骤③:用户触发陷阱后的浏览器会把含有攻击代码的HTTP请求发送到作为攻击目标的web应用,执行攻击代码。
步骤④:执行完攻击代码后,存在安全漏洞的web应用会成为攻击者的跳板,可能导致用户所持的cookie等个人信息被窃取、登录状态中的用户权限被滥用的后果。
被动攻击里具有代表性的就是跨站脚本攻击(XSS)和跨站点请求伪造(CSRF)
a.跨站脚本攻击(XSS)
跨站脚本攻击是指存在安全漏洞的web应用在用户的浏览器上执行非法的HTML标签或者JavaScript脚本的一种攻击。动态创建的HTML部分可能隐藏着安全漏洞,这样攻击者就有可能编写脚本设下陷阱,用户在自己的浏览器上运行时一不小心就会受到攻击。
跨站脚本攻击可能存在以下影响:
- 利用虚假输入表单骗取用户个人信息。
- 利用脚本窃取用户的cookie值,在被害者不知情的情况下帮助攻击者发送恶意请求。
- 显示伪造的文章或图片。
b.跨站点请求伪造(CSRF)
跨站点请求伪造(CSRF)是一种被动的网络攻击方式。也就是攻击者伪造被攻击者的请求,而且被攻击者还没有察觉到。
举个例子说明:
A在银行要转一笔钱给朋友B,A可以通过一个HTTP(URL地址后面是for=B)请求把钱转给B。通常情况下,该请求到达网站后,服务器会验证请求是否来自一个合法的session,并且该session的用户A已经登录。攻击者C也在该银行有账户,于是他伪造了一个请求(URL地址后面是for=C),但是如果直接访问,服务器肯定会识别出当前登录用户是C而不是A,不能接受请求。于是通过CSRF攻击方式,将此链接伪造在广告下,诱使A自己点这个链接,那么请求就会随着A浏览的cookiie一起发送到银行,而此时A正在登录状态或者刚刚登陆不久session还没有过期,当服务器发现session中有A的信息,接收请求,攻击就成功了。
现在防御CSRF的策略
1.验证Referer
referer携带请求来源,从示例可以看出,受害者发送非法请求肯定不是在银行的界面,所以在服务器通过验证Referer是不是bank.example开始就可以了,这个方法简单粗暴。
2.在请求参数中加token验证
要抵御跨站点请求伪造就要设置一个黑客伪造不了的东西。我们可以在请求参数中加一个随机token,在服务器验证这个token,通过即销毁重设。
参考别人的实现:
首先定义token为key-value结构,因为很多情况会从不同的地方访问同一个请求,如果是单一的数据结构,第一个请求生成token后还没来得及发送请求,第二个又请求生成token就会把第一个冲掉,从而导致连续的验证失败。所以,我们要通过请求源将token隔离起来。这里我将请求地址摘要后作为token的key,用GUID作为token的value。
3.在HTTP请求头中自定义属性并验证
这个方法和上面那个类似,也是设置token,只是把token设置为HTTP请求头中的自定义属性。
通过XMLHttpRequest可以一次性给所有该类请求的HTTP头加上token 属性,但是XMLHttpRequest请求通常用于Ajax方法对局部页面的异步刷新,比较有局限性;而且通过XMLHttpRequest请求的地址不会被记录到浏览器的地址栏,一方面不会通过Referer泄露token,另一方面会导致前进,后退,刷新,收藏等操作失效,所以还是慎用。
虽然上面介绍了几种方法,但现在还没有一种完美的解决方案,但是通过Referer和Token方案结合起来使用,也能很得有效CSRF攻击。