> 文档中心 > CSRF跨站请求伪造知识点

CSRF跨站请求伪造知识点


CSRF(Cross-site request forgery)跨站请求伪造

原理

(客户端请求伪造)

攻击者自己首先用自己的账号在客户端中进行了一些操作,然后将URL链接或者攻击者构造的POST请求的链接发送给用户,用户打开这个链接,如果客户端中存在链接对应的网站的Cookie,攻击者就会盗用用户的身份,以用户的名义发起请求。

CSRF检测

1.检测CSRF漏洞是一项比较繁琐的工作,最简单的方法就是抓取一个正常请求的数据包,去掉Referer字段后再重新提交,如果该提交还有效,那么基本上可以确定存在CSRF漏洞。

2.随着对CSRF漏洞研究的不断深入,不断涌现出一些专门针对CSRF漏洞检测的工具,若CSRFTester,CSRF Request Builder等。

  • 一切可执行的地方,并且没有进行二次验证码和token验证的地方,就有可能存在CSRF

危害

修改用户信息

执行转账等恶意操作

利用

1.执行恶意操作

请求方式为GET时直接用URL

请求方式为POST时,通过Burp自动生成CSRFpoc,也就是通过构造表单实现出操作对应的URL,表单构造中注意:隐藏输入框,使Javascript自动提交。将poc的URL进行复制,粘贴发送给其他人。

2.与XSS结合

在构造的CSRF的URL或者表单中添加Javascript代码,也就是XSS

XSS在标签的value值中,无法直接进行解析CSRF构成的URL或者表单提交能够实现输出表单的一个值然后就将两者结合,将XSS的js代码值放入表单的value中,然后输出浏览器进行解析,造成XSS漏洞。

CSRF防御

1.验证HTTP Referer字段;

2.在请求地址中添加token并验证;Token验证的方法可以用来防御登陆CSRF,但是开发者往往会忘记验证,因为如果没有登陆,就不能通过session来绑定CSRF token

鉴于有充足的资源,网站都可以使用HMAC方法来防御CSRF攻击,HMAC的特性能确保即使攻击者知道用户的CSRF token,也不能推断出用户的session标识符。

3.在HTTP头中自定义属性并验证。通过HTTPS来防御CSRF。在HTTPS请求里,Referer可以被用来防御CSRF

4、修改浏览器在发送POST请求的时候加上一个Origin字段,Origin字段并没有包含涉及到用户隐私的URL路径和请求内容

针对不同方式的CSRF采用不同的防御手段

1 、登陆CSRF。我们建议使用严格的Referer验证策略来防御登陆CSRF,因为登陆的表单一般都是通过HTTPS发送,在合法请求里面的Referer都是真实可靠的。如果碰到没有Referer字段的登陆请求,那么网站应该直接拒绝以防御这种恶意的修改。

2、HTTPS。对于那些专门使用HTTPS协议的网站,比如银行类,我们也建议使用严格的Referer验证策略来防御CSRF攻击。对于那些有特定跨站需求的请求,网站应该建立一份白名单,比如主页等。

3、 第三方内容。如果网站纳入了第三方的内容,比如图像外链和超链接,网站应该使用一个正确的验证token 的框架,比如 Ruby-on-Rails。如果这样的一个框架效果不好的话,网站就应该花时间来设计更好的token 验证策略,可以用HMAC方法将用户的session与token 绑定到一起。

绕过

1.在帐户之间使用CSRF令牌
2.替换相同长度的值
3.从请求中完全删除CSRF token
4.解码CSRF令牌

referer绕过

1.利用https协议
https向http跳转的时候Referer为空
拿一个https的webshell

  <iframe src="https://xxxxx.xxxxx/attack.php"> attack.php写上CSRF攻击代码

2.判断Referer是某域情况下绕过
比如你找的csrf是xxx.com 验证的referer是验证的*.xx.com 可以找个二级域名 之后 之后在把文章地址发出去 就可以伪造。

3.判断Referer是否存在某关键词
referer判断存在不存在google.com这个关键词
在网站新建一个google.com目录 把CSRF存放在google.com目录,即可绕过

4.判断referer是否有某域名
判断了Referer开头是否以126.com以及126子域名 不验证根域名为126.com 那么我这里可以构造子域名x.126.com.xxx.com作为蠕虫传播的载体服务器,即可绕过。

CSRF漏洞常用检测方法

黑盒

1.首先肯定确定是否除Cookie外其他参数均可确定,即:无验证码,无Token等
2.再者如果发现是Referer头判断的话,可以尝试是否可以绕过正则。
3.还有就是考虑能不能绕过Token,比如Url处的Token用加载攻击者服务器上的图片来获取。
4.最后可以考虑与XSS结合,如:攻击者使用iframe跨域,存在xss漏洞的网站插入的XSS执行代码为eval(window.name),那么我们构造的iframe标签里可以添加个name属性与子页面进行通信,

白盒

1.查看是否有Token,验证码,Referer等不确定参数判断。
2.判断Referer的正则是否安全。
3.判断Token返回的位置是否为安全位置。
4.判断生成的Token是否足够随机,毫无规律。

⭐CSRF和XSS的区别:

1、CSRF需要登陆后操作,XSS不需要
2、CSRF是请求页面api来实现非法操作,XSS是向当前页面植入js脚本来修改页面内容。