参考书目 《Web安全深度剖析》张炳帅
CSRF 英文名:cross-site request forgery 叫做跨站请求伪造
CSRF不是很流行,但是具有很高的危险性,相比于XSS更加难以防范。
CSRF攻击效果:攻击者盗用身份,以被害者的姓名执行某些非法操作。比如使用账户发邮件、获取敏感信息,盗取银行账户。
CSRF攻击原理当打开某个网站的时候,可以在网站上 进行一些操作,比如发邮件发消息
当结束会话的时候,这个网站可能会让你重新登录,或者提示身份过期,这是这个web在防范CSRF攻击的手段。
CSRF攻击是建立在会话之上的,比如当登录到银行账户进行转账的时候,攻击者给你发送一个URL,利用了社会工程学让你点开了这个URL ,而这个URL是黑客精心设计的转账业务代码,和你所登录的是同一个银行,当你点击这个URL的时候,会发现自己的钱被划走了。
其实并不神奇,你的会话是合法的,攻击者的这段代码也是正常的转账代码,比如你想给admin转账1000元,点击提交之后可能会有如下请求:
?username=admin&money=1000而攻击者hacker提供给你的URL里面的代码是这样的
?username=hacker&money=1000这样,你转发给admin的钱到位了,但是由于你中途点开了恶意URL,你的钱也转发给了hacker。
所以CSRF攻击有两个要点:
需要建立在浏览器与web服务器之间的会话中
社会工程学欺骗用户访问URL
CSRF攻击场景(GET)假如是全球最大的微博平台,全天下所有人都有它的账号。
偶然的条件下,黑客Tom对微博收听功能做了个抓包,收听的对象是xxser,报文截取如下:
然后它开始分析这个HTTP请求报文,发现在收听某人时,两个参数至关重要——uid和listenid。它猜测uid是自己的id,listenid是收听方的ID。但是不知道开发人员是不是这样想,所以Tom创建了个新的用户(小号)进行测试:pentest。
然后收听Tom的大号,报文如下:
发现listenid就是大号的uid,所以Tom的猜想是正确的。
Tom关掉小号,使用大号尝试收听pentest账号,但是没有使用界面化的web程序,而是直接构造url:
http://www.xxser.com/listen?id=218805&listenid=228820Tom访问这个页面的时候,刷新列表,发现已经收听了pentest账户
Tom心想,如果让别人访问这个URL,肯定会收听到自己,成为自己的听众,但是不知道别人的id,这样就无法构造url。
Tom想,干脆就不写id,所以URL就成了这样:
http://www.xxser.com/listen?id=228820然后Tom又去注册了一个小小号,访问这个URL,没想到收听成功了。
于是这Tom胆大包天,想做一次蠕虫攻击。
然后Tom想做一个答题充话费的活动,引导大家点击URL,但是他没有流量,效率太低,而且看起来很假。
Tom想让每个用户都让自己发站内信,或者转发微博,这样效率可以高很多,然后他截取转发微博的报文:
经过测试,发现转发微博文章的id是928978,说明只要用户访问?id=928978就可以转发他的微博了
那么问题来了,如何让一个用户单机一个URL就同时访问两个URL?
Tom做了一个单独的HTML页面open.html 代码如下: