本篇文章用于巩固对自己csrf漏洞的学习总结,其中部分内容借鉴了以下博客。
链接: pikachu CSRF(跨站请求伪造) (皮卡丘漏洞平台通关系列)
链接: Pikachu漏洞靶场系列之CSRF
CSRF全称为跨站请求伪造(Cross-site request forgery
),是一种网络攻击方式,在CSRF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接),然后欺骗目标用户进行点击,用户一旦点击了这个请求,整个攻击就完成了。也被称为 one-click attack
或者 session riding
。
CSRF攻击利用网站对于用户网页浏览器的信任,挟持用户当前已登陆的Web应用程序,去执行并非用户本意的操作。
1.只使用JSON API
2.验证HTTP Referer字段
3.在请求地址中添加token验证
1.对目标网站增删改的地方进行标记,并观察其逻辑,判断请求是否可以被伪造
例如修改管理员账号时,不需要验证旧密码,导致请求容易被伪造;对于敏感信息的修改并没有使用安全的token验证,导致请求容易被伪造
2.确认凭证的有效期
虽然退出或关闭了浏览器,但cookie仍然有效,或者session并没有过期,导致CSRF攻击变得简单
进入靶场发现是一个登陆界面,所以我们直接点击提示得到账号密码进行登录。
发现有这么多账号,直接选择一个登陆。
我这里使用allen
这个账号登录,登录后是一个个人信息页面
点击修改个人信息进入修改界面点击submit进行修改
发现url没有变化,点击提交之后就跳转到上图这个显示个人信息的页面了,信息也修改成功了
所以这时候我们可以使用burpsuit进行抓包修改,在提交修改个人信息的时候,可以抓包,看到下面的内容
从上面的url可见,修改用户信息的时候,是不带任何不可预测的认证信息的。那么,这里应该是可以被利用的。
在allen登录状态下(其实这个链接里面是不包含用户名的,谁登录都无所谓,只要有人登录着就行,登录着的用户的信息就会被改成url提供的那些),试试改一改上面的链接,比如把电话号码改一改。浏览器地址栏输入payload:
http://www.pikachu.com:90/vul/csrf/csrfget/csrf_get_edit.php?sex=boy&phonenum=123456789&add=nbaluckhouse&email=allen%40qq.com&submit=submit
如果被攻击者此时登录状态或cookie/session没有过期,则她的信息被修改。
跳转到显示用户信息的地方,手机号已经被成功修改,攻击成功。
如下图:
如果觉得这个url过于明显,网上有很多短链接网站可以修饰url(百度搜索“短链接”就有很多)
比如下图这样(印象中似乎见过一个网站可以自己定义生成的短链接的部分特征,比如以某个知名网站名开头。没找到,要是哪位大神知道,欢迎分享)
进入第二关,也是一个登陆界面,登陆的账号密码和第一关一样,依旧登陆allen
账号进行修改
进入修改信息界面,点击submit进行抓包
可以看到下图
从上图的请求报文来看,和前一关一样,没有不可预测的认证信息,可以被利用。
但是这一关是post类型,URL不再显示修改参数,所以无法再使用上述办法(即通过URL来伪造请求)进行修改,但是抓包可以知道本页面中有的标签以及name,方便后面构造表单时使用。
此时,黑客可以通过构造恶意站点,将POST请求隐藏在站点中的表单中,然后诱骗用户进行点击,当用户点击后触发表单,数据自然就POST到存在CSRF漏洞的网站,用户的信息则被恶意修改。
将写好的表单部署到黑客站点,这里因为是本机做演示,所以我放到Pikachu/vul/csrf/
目录下
最后,当用户在登录状态下,访问黑客站点http://www.pikachu.com:90/csrf.html
并点击提交按钮,那么其个人信息将会被恶意修改,可以在控制台中看到点击按钮后触发的POST请求。
点击前
点击后
这关是防范CSRF的常用方法的一个演示。
CSRF的主要问题是敏感操作的链接容易被伪造
每次请求,都增加一个随机码(需要够随机,不容易伪造),后台每次对随机码进行验证
网页接受从后台发过来的token,类型不可见。将其一并提交给后台进行验证。每次刷新,后台发送过来的token都不一样,起到了防止伪造的作用。
修改用户信息并提交,在burpsuite的proxy模块可以看到报文中包含token(如下图红框中所示)
试了一下,这关删除token是无法修改用户信息的,多抓几个包之后也没有看出token有什么规律。
在一个浏览器上以allen登录,到修改信息的页面,查看网页源代码获取token,再到另一个浏览器以lili登录,构造payload包含此token也是无法攻击成功的。
看一下代码,修改用户信息时,服务器会比较url中的token字段和session中的token字段,如果相同才能修改用户信息。
修改完用户信息之后,会用set_token()函数生成新的token,将其返回到html表单中并隐藏起来,以便下次用户修改信息时代入url。
set_token()函数如下图所示,在生成新token之前会先销毁老token,避免token重复使用。