CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
常见特性:
依靠用户标识危害网站
利用网站对用户标识的信任
欺骗用户的浏览器发送HTTP请求给目标站点
另外可以通过IMG标签会触发一个GET请求,可以利用它来实现CSRF攻击。
同源指的是三个相同:
举例:
http://www.abc.com/1.html 协议是HTTP,域名是www.abc.com, 端口是80,它的同源:http://www.abc.com/lz/2.html(同源) http://www.12.com/2.html(不同源,域名不同) http://www.abc.com:8080/index.html(不同源,端口不同 )ftp://www.abc.com(不同源,协议不同)
同源目的:
保护用户信息安全,防止恶意的网站窃取数据。
例如,网站A的cookie,受到同源策略保护就不会被网站站B的恶意代码运行,因为不同源。
为什么要存在跨域?因为有同源策略,限制了同网站的二级域名等引用同一身份认证,避免了用户重复登陆的情况。
常见的请求方法:
1.jsonp
JsonP依赖于服务器端实现,我们在请求服务器资源之后,服务器可以返回一段js代码交由客户端执行, 在这段代码中附上客户端请求的信息。
比如客户端请求的url为 b.com/someResource?callback=someFunc, 服务器可以返回 someFunc({name: “someName”}) 交由客户端执行。
2.代理
比如我的前端服务器域名是 a.com, 我在js中想要访问 b.com的资源,我们可以在a.com中提供一个代理的api,比如 a.com/proxy, 这个接口的作用就是转发请求。 我们可以在payload中指定这个请求相关的信息, 比如真实资源的url,请求的方法,header和参数等。
3.CORS
CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。它允许浏览器向跨源服务器发出AJAX请求。
CORS需要浏览器和服务器同时支持。整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。
同源
完成CSRF攻击的条件
1.利用用户访问,受信任的站点,登陆状态,本地含有基础认证信息2.伪造正常用户请求,然后登陆状态,在用户不知道的情况下成功请求
挖掘漏洞注意点:
1.是否有token保护,token的不可猜测性2.验证了refer字段,确定网站的来源,来自可信任的网站3.是否存在跨域<img src="http://www.baidu.com"><img>标签不存在跨域
一般触发点: 修改个人资料,发信息,修改密码等
防御点: 比如说修改密码处,添加一个用户知道的信息验证,有本人发起,并非第三方伪造。
是否有验证referer,一般在burpsuit->repeater重放测试
在挖掘漏洞中,注意参数中有没有token,csrf等参数,来判断是否存在csrf漏洞
xss for csrf 已知含有csrf漏洞,当把找到另一个xss漏洞的时候,配合xss+csrf xss为存储型,构造payload,当用户触发xss时并触发了csrf漏洞,造成了蠕虫的效果。
参考文章: 浏览器同源政策及其规避方法 http://www.ruanyifeng.com/blog/2016/04/same-origin-policy.html
玩转CSRF之挖洞实例分享 https://www.ohlinge.cn/web/web_csrf.html