CSRF漏洞是什么:
目标用户使用其用户名和密码登录受信任站点,从而创建了一个新的会话,受信任站点则会为目标用户Web浏览器Cookie中的会话信息存储了会话标示符。测试者往Web应用页面中插入恶意的HTML链接或脚本代码,而目标页面又没有过滤或者过滤不严,那么当用户浏览该页面时,用户的Web浏览器将被操纵向受信任站点发送一个恶意请求,比如删除帖子、添加管理员、添加邮件转发规则、改变路由器的DNS设置等。Web浏览器将会为这个恶意请求自动附加会话Cookie信息,因为是访问的受信任站点,因此该恶意请求将会成功完成。
CSRF漏洞原理:
网站的cookie在浏览器中不会过期,只要不关闭浏览器或者退出登录,那以后只要是访问这个网站,都会默认你已经登录的状态,假如某网站对用户的一些操作(比如删除帖子,添加管理员等)没有做除了cookie之外的其它验证,那么在此期间,攻击者发送了构造好的csrf脚本或包含csrf脚本的链接,诱使用户去点击可能会执行一些用户不想做的功能.
CSRF漏洞原理图:
与XSS相比
1 | XSS:利用用户对站点的信任,攻击者通过注入程序来修改网站来使用户浏览器被重定向等 |
利用CSRF漏洞的前提条件
1 | (1) 受害者登录受信任网站A,并在本地生成Cookie |
CSRF漏洞的分类
- GET型的CSRF:
假如有这样一个场景,用户登陆后添加管理员账户,正常请求为
1 | http://www.***.com/useradd.php?user=test&pwd=123.com |
但是因为服务端没有做除了cookie之外的校验,那么攻击者可以构造
1 | <img src="http://www.***.com/useradd.php?user=hacker&pwd=123.com"> |
包含该代码代码的一个页面,诱使受害者去点击,当受害者点击之后就会在受害者不知情的情况下添加一个账号为hacker,密码为123.com的管理员账户
小技巧:如果请求url太长,可以制作成短链接
- POST型的CSRF:
假设有这样一个场景,用户A给用户B去转账,正常请求为
1 | POST /give_money.php HTTP/1.1 |
所做的操作为用户A给张三转账100元,攻击者可以构造一个自动提交的form表单
1 | <form action="http://192.168.1.123/give_money.php"method=POST> |
受害者访问该页面后,表单会自动提交,相当于模拟用户完成了post操作,当受害者点击了该页面后,就会受害者不知情的情况下给hacker转账100元.
生成CSRF漏洞POC
我们自己不想写的时候,可以利用burp直接生成CSRF漏洞POC
即可以帮我们生成CSRF的html
造成CSRF漏洞的原因
1 | 1.请求所有的参数均可确定 |
CSRF漏洞的检测
最简单的办法就是使用burp抓取一个正常的请求包,然后发送到repeti模块,去掉数据包中的Referer字段,看请求能否正常执行,如果可以正常执行,则有可能存在CSRF漏洞
CSRF漏洞存在的位置:
1 | 1.评论处 |
针对CSRF漏洞探测的工具:
1 | 1.CSRFTester |
CSRF漏洞造成的危害
1 | 1.篡改目标网站上的用户数据信息; |
CSRF漏洞的防御:
1.尽可能的使用POST请求
GET接口太容易被拿来做CSRF攻击,只要构造一个img标签,而img标签又是不能过滤的数据。接口最好限制为POST使用,GET则无效,降低攻击风险。当然POST并不是万无一失,攻击者只要构造一个form就可以,但需要在第三方页面做,这样就增加暴露的可能性
2.添加验证码(对用户体验不太好)
虽然增加验证码能够很好遏制CSRF攻击,但是增加验证码降低了用户的体验,所以网站不可能给所有的操作都加上验证码,所以只能将验证码作为一种辅助的手段,在关键业务点设置验证码;
3.验证Referer(效果不太高)
但是这种办法的有效性不高,第一,可以抓包修改该字段;第二,在https跳转到http的情况下,浏览器出于安全考虑,不会发送referer,服务器就无法进行检查了,而且如果该网站同域的其他网站有XSS漏洞,那么攻击者可以在其他网站注入恶意脚本,受害者进入了此类同域的网址,也会遭受攻击。所以说有效性不高。(不靠谱的原因是服务器并不是随时都能获得Referer,只能监控是否发生,并且不能防范统一域上的CSRF攻击)
4.添加token,对token进行验证
也就是发送请求时在HTTP请求中以参数的形式加入一个随机产生的token(一次性随机值),并在服务器建立一个拦截器来验证这个token。服务器读取浏览器当前域Cookie中这个token值,会进行校验该请求当中的token和Cookie当中的token值是否都存在且相等,当判断出存在且相等才认为这是合法的请求。否则认为这次请求是违法的,拒绝该次服务。
5.请求做二次确认
比如黑客用CSRF让你转账,但是这个时候提示你——是否转账?,或者让你输入验证码什么的,提醒你的误操作,就可以有效防止CSRF
XSS与CSRF的组合拳
如果一个网站同时存在xss与csrf漏洞,那么攻击者就可以把csrf利用链接填入到存在xss漏洞的地方,从而增大攻击成功的可能性,一定程度上也可以绕过服务端对Referer的验证.