一、漏洞简介
1.1、CSRF漏洞详情
什么是CSRF
CSRF 是跨站请求伪造,也被称为 One Click Attack 或者 Session Riding ,通常缩写为 CSRF 或者 XSRF ,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与 XSS 非常不同, XSS 利用站点内的信任用户,而 CSRF 则通过伪装来自受信任用户的请求来利用受信任的网站。与 XSS 攻击相比, CSRF 攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比 XSS 更具危险性。
CSRF可以做什么
你这可以这么理解 CSRF 攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF 能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账…造成的问题包括:个人隐私泄露以及财产安全。
如何发现CSRF
对目标网站增删改的地方进行标记,并观察其逻辑,判断请求是否可以被伪造。
CSRF攻击流程
攻击流程图片1:
攻击流程图片2:
1.2、CSRF漏洞修复
增加二次验证机制
验证 HTTP Referer 字段
在请求地址中添加 token 并验证
在 HTTP 头中自定义属性并验证
二、环境下载
Pikachu:https://github.com/zhuifengshaonianhanlu/pikachu/archive/refs/heads/master.zip
三、漏洞利用
3.1、GET请求CSRF
实验描述
银行网站 A,它以 GET 请求来完成修改个人信息的操作。
危险网站B,它里面有一段HTML的代码如下:
<img src=http://www.yinhang.com/Information.php?name=hack&phone=10086>
首先,你登录了银行网站A,然后访问危险网站B,诶嘿,这时你会发现你的个人信息被改了。
实际演示
普通用户:账号vince 密码123456
黑客的用户:账号allen 密码123456
访问 pikachu 下的 CSRF -> CSRF(get) 漏洞环境。
这里模仿黑客构造 CSRF 链接,登录 allen 账号。
登录后有个修改功能的按钮,点击 "修改个人信息"。
这里将信息改为如下内容。
点击 "submit" 提交时利用 Burp 将数据包抓取。
将 URL 复制下来,构造恶意链接,最终构造链接如下:
http://192.168.149.77/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=boy&phonenum=13676767767&add=nba+666&email=allen%40pikachu.com&submit=submit
构造好链接后,模拟受害者被攻击的过程。
登录 vince 账号。
然后访问攻击者的 CSRF 链接,访问完毕后就会发现信息全被修改了。
3.2、POST请求CSRF
银行网站 A,它以 POST 请求来完成修改个人信息的操作。
危险网站B,它里面有一段HTML的代码如下:
1
首先,你登录了银行网站A,然后访问危险网站B,诶嘿,这时你会发现你的个人信息又又被改了。
实际演示
普通用户:账号vince 密码123456
黑客的用户:账号allen 密码123456
访问 pikachu 下的 CSRF -> CSRF(post) 漏洞环境。
模仿黑客构造 CSRF 链接,登录 allen 账号。
登录后有个修改功能的按钮,点击 "修改个人信息"。
将信息修改成如下图。
点击 "submit" 提交时利用 Burp 将数据包抓取。
右键选择 Engagement tools -> Generate CSRF Poc 构造恶意的 HTML。
复制 HTML 内容保存到攻击者的 Kali 里的 Web 目录下。
在 www 目录下开启 python3 的 http 服务。
最终 CSRF 的链接为。
http://172.26.147.94/csrf.html
构造好链接后,模拟受害者被攻击的过程。
登录 vince 账号。
然后访问攻击者的 CSRF 链接。
点击 Submit request 后就会跳转回来到修改个人信息的页面,此时就发现个人信息全被修改了。
3.3、CSRF Token
Token作用:
- 防止表单重复提交:服务端收到客户端发送的Token后,如果和Session中的值相同,此时客户端中session中的Token会更新。
- 防止CSRF(跨站请求攻击):在用户每次修改数据时都会重新生成一个 Token 从而攻击者无法攻击。说白了就是一个 Token 只能修改一次内容,下再修改就得获取下一个 Token 值以此类推
实践演示
普通用户:账号vince 密码123456
黑客的用户:账号allen 密码123456
访问 pikachu 下的 CSRF -> CSRF Token 漏洞环境。
模仿黑客构造 CSRF 链接,登录 allen 账号。
登录后有个修改功能的按钮,点击 "修改个人信息"。
将信息修改成如下图。
点击 "submit" 提交时利用 Burp 将数据包抓取。
可以看到数据包多了个 token 的参数。将数据包发送到 Repeater 模块,然后将 Proxy 的数据包放掉。
然后回到页面中可以看到刚刚放掉的包已经修改成 "china666" 了。
回到 Repeater 模块,将 china666 修改为 chinanb。
点击 Send 发送。
可以看到已经无法修改了,因为这里有个 Token 的防御,我们需要获取到新的 Token 才能进行修改。
这里需要用到一个插件 CSRF Token Tracker。
设置好 Host 和 Name 的值,然后勾选上。
回到 Repeater 模块,点击两次 Send 即可修改信息。
而可以一直修改不用修改数据包里的 token 值了。
这里回到插件里可以看到每次我们点一次 Send 这里的 Value 都会改变。
实验结束