如何预防CSRF攻击?可以试试这三种方式
1 前言
CSRF:全称Cross-site request forgery(跨站请求伪造), 是指利用受害者未过期的身份认证信息,通过链接、图片等方式诱骗其点击,在受害者不知情的情况下以其身份向目标服务器发送请求,从而实现一些非法操作。CSRF与XSS最大的区别在于,CSRF是直接通过用户身份进行攻击,而XSS是以攻击者身份进行攻击。
2 场景分类
我们用dvwa作为测试,dvwa的反射型CSRF分为不可能、高、中、低四种类型。
场景一:Low Security Level
利用burpsuite工具对用户的操作行为进行捕包拦截,然后根据用户的网页内容进行伪造非法网页,让用户点击或访问。具体操作方式为:
(1)查找到修改密码的url
(2)构造一个url的html文件
一般攻击者是构造一个以上url的恶意链接,诱导用户点击。用户点击完成后,密码就不知不觉被修改了。
(4)查看测试结果
此时,登录密码就被修改为123456,而不是用户设置的123,利用123456成功登录了。
(5)查看php代码
从上述代码中可以看出,代码只进行了新密码和确认密码的验证,验证方式比较简单,存在明显的漏洞。
场景二:Medium Security Level
利用burpsuite工具对用户的操作行为进行捕包拦截。具体操作方式为:
(1)查找到修改密码的url
例如:在10.4.3.29上修改了密码,在10.4.11.12上需要利用csrf这个漏洞,就要把html文件的名称修改为:10.4.3.29.html。一般攻击者是构造一个这种url的恶意链接,诱导用户点击。
(4)查看测试结果
此时,登录密码就被修改为123456,而不是用户设置的121,利用123456可以成功登录了。
(5)查看php代码
从上述代码中可以看出,代码进行服务端名称和HTTP Reference的验证,但是还是存在漏洞。
场景三:High Security Level
利用burpsuite工具对用户的操作行为进行捕包拦截。具体操作方式为:
(1)查找到修改密码的url
(2)利用bp动态修改token值
在Extender的BApp Store中找到CSRF Token Tracker勾选并安装, 安装完成后,在CSRF Token Tracker菜单中输入主机名以及user_token信息:
(3)将request请求加入到repeater中
(4)直接再次执行
点击go按钮,进行新的请求操作
(5)查看测试结果
此时,登录密码就被修改为123。
(6)查看php代码
从上述代码中可以看出,代码进行了user_token和session_token的验证,但是仍存在漏洞。当然,高级的CSRF,也可以通过xss漏洞获取token信息,并利用变化的token值进行攻击。
场景四:Impossible Security Level
这个级别的CSRF漏洞,算是比较安全的了,我们直接看下php代码:
这里新增了原始密码的验证,而且还增加了session_token和user_token的判断,加强了安全性。
3 经验总结
总结:经过上面的实验发现,CSRF攻击一般是利用用户对一些恶意链接或者图片等点击而产生的攻击方式。
建议3种方式进行防范:
1、增加服务端名称和HTTP Reference的验证;
2、增加原始密码校验,若原始密码不对,则不进行修改密码操作;
3、增加session_token和user_token的验证。
这三种防范方式同时加入到代码中,可以大大提高针对CSRF攻击的防范。