前言

本篇文章用于巩固对自己csrf漏洞的学习总结,其中部分内容借鉴了以下博客。
链接: pikachu CSRF(跨站请求伪造) (皮卡丘漏洞平台通关系列)

链接: Pikachu漏洞靶场系列之CSRF

漏洞简述

CSRF是什么

CSRF全称为跨站请求伪造(Cross-site request forgery),是一种网络攻击方式,在CSRF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接),然后欺骗目标用户进行点击,用户一旦点击了这个请求,整个攻击就完成了。也被称为 one-click attack 或者 session riding

CSRF攻击原理

CSRF攻击利用网站对于用户网页浏览器的信任,挟持用户当前已登陆的Web应用程序,去执行并非用户本意的操作。

CSRF攻击防护

1.只使用JSON API
2.验证HTTP Referer字段
3.在请求地址中添加token验证

如何确认一个web系统存在CSRF漏洞

1.对目标网站增删改的地方进行标记,并观察其逻辑,判断请求是否可以被伪造
例如修改管理员账号时,不需要验证旧密码,导致请求容易被伪造;对于敏感信息的修改并没有使用安全的token验证,导致请求容易被伪造

2.确认凭证的有效期
虽然退出或关闭了浏览器,但cookie仍然有效,或者session并没有过期,导致CSRF攻击变得简单

第1关 CSRF(get)

进入靶场发现是一个登陆界面,所以我们直接点击提示得到账号密码进行登录。
在这里插入图片描述
发现有这么多账号,直接选择一个登陆。
我这里使用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成功变成女孩啦
在这里插入图片描述

第2关 CSRF(post)

进入第二关,也是一个登陆界面,登陆的账号密码和第一关一样,依旧登陆allen账号进行修改
在这里插入图片描述
进入修改信息界面,点击submit进行抓包
可以看到下图
在这里插入图片描述
从上图的请求报文来看,和前一关一样,没有不可预测的认证信息,可以被利用。

但是这一关是post类型,URL不再显示修改参数,所以无法再使用上述办法(即通过URL来伪造请求)进行修改,但是抓包可以知道本页面中有的标签以及name,方便后面构造表单时使用。

此时,黑客可以通过构造恶意站点,将POST请求隐藏在站点中的表单中,然后诱骗用户进行点击,当用户点击后触发表单,数据自然就POST到存在CSRF漏洞的网站,用户的信息则被恶意修改。

在这里插入图片描述

将写好的表单部署到黑客站点,这里因为是本机做演示,所以我放到Pikachu/vul/csrf/目录下
在这里插入图片描述

最后,当用户在登录状态下,访问黑客站点http://www.pikachu.com:90/csrf.html并点击提交按钮,那么其个人信息将会被恶意修改,可以在控制台中看到点击按钮后触发的POST请求。
点击前
在这里插入图片描述
点击后
在这里插入图片描述

<html>
    <script>                                                                                                       <!-- 这个script是用来自动提交表单的 -->
        window.onload = function() {
        document.getElementById("submit").click();
        }
    </script>              
    <body>
            <form action="http://www.pikachu.com:90/vul/csrf/csrfpost/csrf_post_edit.php" method="POST">    
                <input type="hidden" name="sex" value="girl" />
                <input type="hidden" name="phonenum" value="123456789" />
                <input type="hidden" name="add" value="usa" />
                <input type="hidden" name="email" value="caker@pikachu.com" />
                <input type="hidden" name="submit" value="submit" />
              <input id="submit" type="submit" value="Submit request" style="display:none"/>                    <!-- style设置为display:none起到隐藏submit按钮的作用 -->
            </form>
    </body>
</html> 

第三关 CSRF Token

这关是防范CSRF的常用方法的一个演示。

token验证原理

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重复使用。
在这里插入图片描述

其他防范措施

在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐