CSRF原理
CSRF漏洞定义
CSRF(Cross-site request forery,XSRF)跨站请求伪造,也被称为One Click Attack或Session Riding。
CSRF与XSS的区别:
1、XSS利用站点内的信任用户,盗取cookie
2、CSRF通过伪装成受信任的用户请求受信任的网站
CSRF漏洞原理
利用目标用户的合法身份,以目标用户的名义执行某些非法操作
例如:
转账链接:http://www.xxx.com/pay.php?user=xx&money=100
构造恶意链接:http://www.xxx.com/pay.php?user=恶意用户&money=10000
CSRF漏洞利用简单示例
环境:bwapp
示例:bwapp - CSRF(change password)-low
修改密码为test(原密码为bug)
复制该链接
http://bwapp:8089/csrf_1.php?password_new=test&password_conf=test&action=change
退出登录,尝试使用bug登录,登录失败,使用test登录,登录成功。修改复制的链接为:
http://bwapp:8089/csrf_1.php?password_new=bug&password_conf=bug&action=change
即还原为默认密码bug,访问链接,密码修改成功
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YP5G5dWN-1596627637670)(https://upload-images.jianshu.io/upload_images/21035483-6db2067eb2c53477.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
无防护的CSRF漏洞利用
GET型CSRF
构造GET型URL,提交username和password参数,以此新建用户和密码
例如:
http://url/new_user.php?username=admin123&password=123
对于此类漏洞,可以通过隐藏利用诱导用户点击链接,例如制作一个中奖页面,将链接隐藏在img标签src属性中,当用户访问页面时,链接就会自动加载访问。
POST型CSRF
设置表单用于提交,将用户注册信息隐藏,并将链接放在action中,例如:
CSRF自动化探测
手动探测原理
手动探测原理在于探测web应用程序具有防止CSRF的措施(HTTP Referer头、是否设置Token、HTTP头自定义)。
自动化探测工具
CSRFTester(抓取表单信息重新提交)
1、设置浏览器代理:127.0.0.1:8080
2、登录web应用程序,提交表单,在CSRF工具中修改表单内容,查看是否更改,如果更改则存在CSRF漏洞。
3、生成POC代码(burpsuite(仅专业版)也可生成,抓取请求后,右键-Engagement tools-Generate CSRF POC)
4、使用服务器搭建CSRF POC访问页面
CSRF漏洞Token防御
漏洞修补逻辑
漏洞实质:服务器无法准确判断当前请求是否是合法用户自定义操作。一般情况下,服务器给予的合法令牌(登录成功时获得)会写入表单隐藏域的value值中,随表单内容一起提交。令牌正确才执行操作。
生成Token代码
Token:识别操作是否是当前用户自己操作的唯一凭证,需设置为难以**的内容,例如:
<?php function token_s(){ $salt="hello".date("h:i:s"); $token_r=md5($salt); return $token_r; } $token=token_s(); echo $token; ?>使用Token进行CSRF漏洞防御
1、登录验证成功之后,在SESSION[“user_token”]中保存Token
2、在后台操作,增删改表单中添加隐藏域hidden,设置value为Token
3、提交验证Token是否正确
CSRF绕过Referer技巧
Referer防御CSRF原理
用户点击被构造好的CSRF利用页面,在用户执行对应操作时,提交的HTTP请求中有对应的Referer值,此时服务器判断Referer值是否与当前服务器域名有关,不相关则不执行操作。
代码大致如下:
绕过Referer技巧
如果服务端只判断当前的Referer中是否具有域名,则可以直接新建文件夹进行绕过
GET型CSRF漏洞利用方法
链接利用
利用a标签可以携带GET型参数,例如:
<a href=“url/?new_user.php?username=恶意用户&password=123”>点击
iframe利用
iframe标签内容会在页面加载过程中自动加载,src指向页面请求的位置(注:可设置iframe的style=“display:none”,以此不显示加载内容),例如:
<iframe src=“url/?new_user.php?username=恶意用户&password=123” style=“display:none” />
img标签利用
<img src=“url/?new_user.php?username=恶意用户&password=123” >
CSS-background利用
body{
background:url(“url/?new_user.php?username=恶意用户&password=123”);
}
1、验证码防御(强制与用户互动)
2、Referer Check(主要用于防止盗链,也可以检查请求是否合法)
3、Anti CSRF Token防御(生成随机且不易猜测的参数但如果Token泄露,也可能遭受到CSRF攻击,例如GET型泄露(页面包含,那么请求中的Referer就会携带对应的GET Token)和POST型泄露(利用XSS盗取cookie,获取存储在其中的Token))