WEB攻防-CSRF利用-原理&构造
原理
登录受信任网站A,并在本地生成Cookie,在不登出A的情况下,访问危险网站B

!
CSRF 功能点
- 删除帐户
- 更改电子邮件
- 如果不需要旧密码,请更改密码
- 如果您的目标支持角色,请添加新管理员
- 更改正常信息,名字,姓氏等……
- 类似复选框的接收通知
- 更改个人资料图片/删除它
检测与利用
- 检测:黑盒手工利用测试,白盒看代码检验(有无token,来源检验等)
- 生成:BurpSuite->Engagement tools->Generate CSRF Poc
- 利用:将文件放置自己的站点下,诱使受害者访问(或配合XSS触发访问)
案例-CSRF利用-无防护
步骤1:生成csrf-poc
登陆网站1,添加账号



然后复制HTML代码后,创建一个HTML文件放进去,最后把这个HTML 文件放在“恶意网站”上
或者说直接放在网站首页,只要一访问恶意网站就触发
步骤2:使目标访问poc

访问“恶意网站”下的csrf poc


原理
把添加用户的数据包放置在了网站2“恶意网站”上,访问就触发数据包
条件
- 必须访问得了
- 与当前浏览器策略有关
- 如果会话还存在着,(后台没有退出登陆)就会触发
WEB攻防-CSRF防御-同源策略
CSRF利用-同源策略防护

原理:同源策略检测数据包,只能由同一个地址产生和发送,因为csrf是由另一个站点发送的,所以启用同源策略可阻止大部分csrf
同源策略原理
原理:等值判断
<?php
$flag='i love xiaodi';
$refer= $_SERVER['HTTP_REFERER'];
echo $refer;
if($refer=="http://www.xiaodi8.com"){
echo $flag;
}else{
echo 'nimeide';
}
当访问数据包是从”http://www.xiaodi8.com”发出的时候,输出flag,即”i love xiaodi”
否则输出”nimeide”


绕过:抓包修改Referer字段

原理:当仅自己浏览器访问时,没有Referer字段(为空)
当使用baidu作为跳转时,字段内容为”www.baidu.com“
所以,修改Referer字段内容为所需要的”http://www.xiaodi8.com”,即可得到所想要的内容
防护措施
检测Referer字段,阻止跨站请求
正常添加账号

跨站非法添加

判断同源:(匹配判断)
等值判断:更安全,但不符合逻辑。不使用等值判断,判断”www.xiaodi8.com”,就只能是”www.xiaodi8.com”,只能从这个首页访问,写死了。1=1,a=a匹配判断:符合逻辑,安全性更低。判断”www.xiaodi8.com”,使用”xiaodi8.com”,”xiaodi8.com/admin”都行,不影响功能,较为灵活,1=1.0
匹配判断同源的安全问题

制作csrf poc

将poc放在另一个网站上,删除刚才创建的用户后,尝试访问

被来源检测了,用户也没有添加,csrf失败

绕过办法:修改数据包,伪造来源

创建用户抓包生成poc

将poc放在另一个网站上
访问该网页,抓包改包

发送后重新刷新发现增加了一个用户

实战问题:实战中无法操作目标主机进行来源伪造 –> 无法伪造来源
判断同源的匹配判断 绕过
绕过1:规则匹配绕过问题(代码逻辑不严谨)
- 方法1:功能逻辑绕过 置空来源:在生成的html代码前加上
<meta name="referrer" content="no-referrer">
访问后刷新直接绕过,增加了一个用户 - 方法2:匹配机制绕过 匹配机制:http://xx.xx.xx.xx/http://xx.xx.xx.xx 第一个为外部链接,第二个为同源链接,同源判断使用匹配判断了第二个链接合法就放行了 将自己网站文件夹强制命名为对应网站链接,将poc置于其中 如何强制命名有待实验,结果如下:
或在网上申请一个高仿域名,如www.baidu.com就申请www.xxxbaidu.com
绕过2:配合文件上传绕过(严谨使用同源绕过)
绕过3:配合存储XSS绕过(严谨使用同源绕过)
WEB攻防-CSRF防御-Token校验防护

Token更难绕过
每一个操作都有一个编号(Token),再次重复操作就无效 — > 保证了数据包的唯一性
测试


绕过
- 将Token参数值复用(代码逻辑不严谨)–> 不实用
- 将Token参数删除(代码逻辑不严谨)–> 首先测试
- 将Token参数值置空(代码逻辑不严谨) –> 首先测试
实验
以上实验没有考虑token带来的影响,看似有csrf漏洞,实则可能没有 –> 因为都是在本地“自导自演”
再次实验
- 受害者目标:本地firefox浏览器模拟
- 攻击者: 1.创建一个受害者访问界面:http://192.168.10.201/ 实际为公网地址 2.创建一个和受害者访问目标网站一样的网站源码(触发访问的数据包的形成条件):本地搭建,然后模拟测试数据包 在本地模拟了用户常见数据包的提取和修改 用bp制作poc(已内置当前模拟的token) 1.html 将制作好的html放置在http://192.168.10.201/ 下 等着受害者访问http://192.168.10.201/1.html
- 问题:利用失败
- 原因token校验不通过 — > 本地自己实验时,token没有变过 –> 当实际情况下,token改变,校验不通过(先不考虑同源策略影响)


虽然看似token值已经被设置一样了,但是对应受害用户不是使用这个token — > 校验不通过

受害者自己的token明显与刚才模拟生成的不一样,如果是这个token就能实现攻击 — > 不现实
总结
CSRF测试手法:
首先判断有无防护 –> 有防护 –>抓包查看是不是有相关token校验内容 –> 有token防护 –>尝试删除token或置空
–>没有token防护 –>有同源策略 –> 尝试同源策略绕过
–>有token防护,还有同源策略 –> 基本不用测试了
本节知识点&CSRF思维导图
Web攻防-CSRF-原理&检测&利用&防御
Web攻防-CSRF-防御-Referer策略隐患
Web攻防-CSRF-防御-Token校验策略隐患
