CSRF漏洞
CSRF原理
CSRF(Cross-Site Request Forgery,跨站请求伪造)
主要涉及到攻击者利用受害者尚未失效的身份认证信息(如cookie、会话令牌等),通过诱导用户点击恶意链接或访问包含攻击代码的页面,从而在用户不知情的情况下以受害者的身份向服务器发送请求,完成非法操作(如转账、修改密码等)
CSRF分类
站外和站内
- 站内
CSRF站内类型的漏洞在一定程度上是由于程序员滥用$_REQUEST类变量造成的。在一些敏感的操作中(如修改密码、添加用户等),本来要求用户从表单提交发起POST请求传递参数给程序,但是由于使用了$_REQUEST等变量,程序除支持接收POST请求传递的参数外也支持接收GET请求传递的参数,这样就会为攻击者使用CSRF攻击创造条件。一般攻击者只要把预测的请求参数放在站内一个贴子或者留言的图片链接里,通过get请求来攻击,受害者浏览了这样的页面就会被强迫发起这些请求。
- 站外
CSRF站外类型的漏洞本质上就是传统意义上的外部提交教据问题。通常程序员会考虑给一些留言或者评论的表单加上水印以防止SPAM问题(这里,SPAM可以简单的理解为垃圾留言、垃圾评论,或者是带有站外链接的恶意回复),但是有时为了提高用户的体验性,可能没有对一些操作做任何限制,所以攻击者可以事先预测并设置请求的参数,在站外的Web页面里编写脚本伪造文件请求,或者和自动提交的表单一起使用来实现GET、POST请求,当用户在会话状态下点击链接访问站外Web页面,客户端就被强迫发起请求。
漏洞检测
1.最简单的方法就是抓取一个正常请求的数据包,去掉Referer字段后再重新提交,如果该提交还有效,那么基本上可以确定存在CSRF漏洞。
2.对目标站点增删改查的地方进行标记,并观察逻辑,判断请求是否可以伪造。
比如修改管理员账号时,不需要验证旧密码
比如修改敏感信息不需要token验证(确认凭证的有效期)
虽然退出或关闭了览器,但Cookie仍然有效,或者Session没有及时过期,导致CSRF攻击变得简单
CSRF和XSS的区别
CSRF是借助用户的权限完成攻击,攻击者并没有拿到用户的权限。目标构造修改个人信息的链接,利用lucy在登录状态下点击此链接达到修改信息的目的。
XSS直接盗取了用户的权限,然后实施破坏。攻击者利用XSS盗取了目标的Cookie,登录lucy的后台,再修改相关信息。
攻击场景例子

lucy想要在购物网站上修改购物地址,这个操作是lucy通过浏览器向后端发送了请求。这个请求里面包含了lucy的新的收货地址,如果是通过GET提交的,那么会以URL传参的方式的方式将新的地址提交给后台,类似上图中的URL,相当于点了链接就能修改个人信息。
如果这时候攻击者想要修改lucy的信息怎么办?那么他需要取得lucy的账号,获得登录权限。这时候他可以将修改个人信息的请求伪造一下,构造类似下图中的URL,引诱lucy在登录状态下进行点击,这样攻击就成功了。

攻击实验
自解压文件完成CSRF攻击删除网站数据(GET请求)

管理员正常登陆界面
要获取管理员删除数据的url,用bp抓包

1 | http://192.168.116.34/pikachu-master/pikachu-master/vul/overpermission/op2/op2_admin.php?id=25 |
这个动作也就是删除数据包的get请求的数据包,所以只要获得了管理员的cookie,访问这个url就可以删除对应id的数据
那么现在就做一个自解压的压缩包,并且设置解压后访问此攻击url,如果管理员正在访问此界面,并且解压了这个攻击压缩包,那么就攻击成功,此id的用户被删除
制作自解压压缩包:

未攻击之前页面数据:

解压压缩包,攻击之后id=16的数据(最后一条)被删除

基于POST请求的账号创建
用户准备更改信息

bp抓包,是一个POST包

用bp自带的工具,生成CSRF POC

并将生成的html代码,放到文件中,生成一个html文件

让受害者点开html中的按钮

未更改信息之前:

受害者在登陆的情况下,同时用与登录相同的浏览器打开攻击html之后,点击按钮,信息被更改

修改密码

在修改密码页面,bp抓包,然后放到重发器中,丢弃包

按理来说,这里应该不用输入原密码,这样才是一个没有防护的状态
生成一个html页面
1 | <html> |
让受害用相同的浏览器打开,并点击,则修改密码