1.环境准备
1.1.PC端设置BurpSuite设置代理
打开BurpSuite>proxy>options,开启本地代理
导出CA证书,打开BurpSuite>proxy>options,点击Import/export CA certificate,导出证书到本地。
安装导出的证书到本地计算机,安装方法不再详述。
1.2.靶机环境
DVWA是著名的OWASP开放出来的一个在线web安全教、学平台。提供了:暴力破解、命令执行、CSRF、文件包含、SQL注入、XSS学习环境,并且分:low、medium、high三种不同的安全等级,等级越高难度也越大。同时每一个漏洞可以直接在页面选择查看源码进行源码对比学习。
使用dvwa靶机环境,可以自行搭建也可以使用在线懒人版。
下载地址:https://github.com/ethicalhack3r/DVWA/archive/master.zip
懒人版:https://www.vsplate.com/labs.php
使用phpstudy或xampp自行搭建即可,详细搭建过程在此不详述!
2.CSRF漏洞
2.1.漏洞简介
Cross-site request forgery 简称为“CSRF”,中文为:跨站请求伪造 。
CSRF是一种攻击,它迫使最终用户在当前通过身份验证的Web应用程序上执行不必要的操作。借助一些社交工程的帮助(例如通过电子邮件/聊天发送链接),攻击者可能会强迫/诱导用户执行攻击者选择的操作。
在正常用户的情况下,成功的CSRF攻击可能会危及最终用户的数据和操作。如果目标最终用户是管理员帐户,这可能会危及整个Web应用程序。
这种攻击也可以称为“XSRF”,类似于“跨站点脚本(XSS)”,它们经常一起使用。
2.2.常见应对策略
2.2.1.请求来源验证
根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。根据判断请求中的Referer指向判断是否为CSRF攻击请求,如果是则拦截该请求,不对该请求做出回应。
(1)优点:
简单易行,网站的普通开发人员不需要操心 CSRF 的漏洞,只需要在最后给所有安全敏感的请求统一增加一个拦截器来检查 Referer 的值就可以。特别是对于当前现有的系统,不需要改变当前系统的任何已有代码和逻辑,没有风险,非常便捷。
(2)缺点:
Referer 的值是由浏览器提供的,虽然 HTTP 协议上有明确的要求,但是每个浏览器对于 Referer 的具体实现可能有差别,并不能保证浏览器自身没有安全漏洞。使用验证 Referer 值的方法,就是把安全性都依赖于第三方(即浏览器)来保障。理论上来讲,这样并不安全。事实上,对于某些浏览器,目前已经有一些方法可以篡改 Referer 值,这样就可以通过验证,从而进行 CSRF 攻击。
即便是使用最新的浏览器,黑客无法篡改 Referer 值,这种方法仍然有问题。因为 Referer 值会记录下用户的访问来源,有些用户认为这样会侵犯到他们自己的隐私权,特别是有些组织担心 Referer 值会把组织内网中的某些信息泄露到外网中。他们会设置浏览器使其在发送请求时不再提供 Referer,当他们正常访问验证Referer值的网站时,网站会因为请求没有 Referer 值而认为是 CSRF 攻击,拒绝合法用户的访问。
2.2.2.TOKEN验证码
Token验证码是在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。
(1)优点:
相比仅仅使用Referer值校验的方法,更安全。
(2)缺点
在一个网站中,可以接受请求的地方非常多,要对于每一个请求都加上 token 是很麻烦的,并且很容易漏掉,通常使用的方法就是在每次页面加载时,使用 javascript 遍历整个 dom 树,对于 dom 中所有的 a 和 form 标签后加入 token。这样可以解决大部分的请求,但是对于在页面加载之后动态生成的 html 代码,需要程序员在编码时手动添加 token。
还有,难以保证 token 本身的安全。在一些论坛之类支持用户自己发表内容的网站,黑客可以在上面发布自己个人网站的地址。由于系统也会在这个地址后面加上 token,黑客可以在自己的网站上得到这个 token,并马上就可以发动 CSRF 攻击。为了避免这一点,系统可以在添加 token 的时候增加一个判断,如果这个链接是链到自己本站的,就在后面添加 token,如果是通向外网则不加。
2.2.3.自定义HTTP头
这种方法也是使用 token 并进行验证,和上一种方法不同的是,这里把它放到 HTTP 头中自定义的属性里。通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中。
(1)优点:
这样解决了上种方法在请求中加入 token 的不便,同时,通过 XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏,也不用担心 token 会透过 Referer 泄露到其他网站中去。
(2)缺点:
这种方法的局限性非常大。XMLHttpRequest 请求通常用于 Ajax 方法中对于页面局部的异步刷新,并非所有的请求都适合用这个类来发起,而且通过该类请求得到的页面不能被浏览器所记录下,从而进行前进,后退,刷新,收藏等操作,给用户带来不便。
另外,对于没有进行 CSRF 防护的遗留系统来说,要采用这种方法来进行防护,要把所有请求都改为 XMLHttpRequest 请求,这样几乎是要重写整个网站,这代价无疑是不能接受的。
2.2.4.密码验证
密码验证策略是一种在操作时需要人工输入用户密码来验证请求来源的方法。常见的应用场景有:密码修改时,让用户提供当前密码。
(1)优点:
可以明确解决CSRF漏洞带来的威胁,因为在同一浏览器上访问的其他网站几乎不可能事先获知用户的密码。
(2)缺点:
在发起请求时需要人工输入密码,增加了操作的复杂程度,不适用于所有请求,仅适用于一些非常关键的操作。
频繁的输入密码,可能引起密码的泄露,如:传输过程被截取,破解;他人偷窥、监控拍摄泄露;等。
3.CSRF漏洞测试
3.1.环境配置
访问dvwa靶机环境,重置数据库.
点击login跳转到登陆页面。
使用chrome打开DVWA登陆页,使用初始密码登录。点击DVWA Security,设置安全等级为low并提交。
3.2.抓包
打开BurpSuite,配置代理,设置为不拦截,并在PC的internet选项中配置使用的代理。在DVWA网页中,点击CSRF,打开跨站请求伪造漏洞页面。
可以看到这是一个修改密码的也没,输入修改后的密码和确认的密码,点击change按钮,弹出Password Changed提示。
在抓取到的报文记录中找到修改密码的报文,右键发送到Repeater。
3.3.测试方法
打开Repeater,找到刚刚添加的更改登录密码的报文。
修改请求中的新密码和确认密码为想要更改的字符串,新密码=确认密码。
3.3.1.删除Referer值
删除原有Referer值为空,发送请求,查看响应结果。
根据结果判断,密码修改成功,系统存在CSRF漏洞。
使用此方法可以测试没有Referer值和Token校验时的CSRF漏洞。
3.3.2.Referer值绕过
花式修改Referer值,来尝试绕过系统对Referer值的校验。
比如:后台校验Referer值中是否包含自己系统的域名,可以在黑客的网站中将该域名包含在自己的CSRF链接路径中。修改Referer值后,发送请求如果可以获得期望的响应结果,则系统存在CSRF漏洞。
此方法适用于仅系统校验Referer值且对Referer值校验方法简单的系统。
3.3.3.Token随机性验证
反复多次使用浏览器发起请求,获取多个Token值,使用Intruder将获取的Token值作为字典,发起攻击,检查攻击结果。如果出现期望的结果,则Token不是随机生成,系统存在CSRF漏洞。
适用于Token为非随机生成(从库中获取,且库比较小)的系统。
3.4.攻击手段
针对CSRF漏洞发起攻击的方法与以上介绍的测试方法基本一致,按照上述方法的思路去实现黑客网站、网页、链接,让用户点击以达到攻击的目的。
3.4.1.网页生成
无论何种攻击手段,都需要发起请求,网页生成是指利用软件抓取报文后生成可以发起CSRF请求的网页。常用的工具有BurpSuite和CSRF tester,在此仅介绍BurpSuite软件操作,不再介绍CSRF tester,如有需要请自行了解。
使用BurpSuite对请求报文抓包,在拦截页面,点击Action,选择点击相关工具> CSRF POC生成。
BurpSuite弹出生成网页窗口界面,如下图所示。黑客可以将生成的HTML代码保存为文件,放入自己的网站系统中,可以得到一个可以发起CSRF攻击的页面地址。
在此,可以将BurpSuite理解为黑客的网站系统,网页已经放入系统中,点击用浏览器测试,
点击复制,复制攻击网页地址到剪贴板。打开浏览器,粘贴访问。
模拟用户点击提交请求按钮,
页面跳转,打开密码修改成功页面。由此可知,攻击成功。
进阶:
以上方式为通过访问后生成的攻击页面,点击按钮的方式发起攻击跨站请求。如果想要访问后无需点击即可发起请求,则可以通过修改html文件放入黑客网站中,使得访问url地址后立即发起请求即可。
修改方法:在生成的html页面body中插入以下代码,保存到本地。
打开本地服务器(模拟黑客网站),将文件放入网站应用路径中,得到访问路径为:
http://127.0.0.1/dvwa/vulnerabilities/csrf/csrf_my.html
3.4.2.链接生成
链接生成,是指生成一个无法识别作用(用于绕过一些安全检测)的链接(常用方式为短链接),再通过一些社会学方法去传播这些链接让用户点击链接从而发起跨站请求。
DVWA环境LOW级别的CSRF请求为一个GET请求,请求地址为: http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=admin&password_conf=admin&Change=Change
或者使用BurpSuite生成攻击网页放到黑客网站中,并将访问该网页的地址当做发起CSRF请求地址(例如:http://127.0.0.1/dvwa/vulnerabilities/csrf/csrf_my.html)即可。
链接生成的最简单的方式是使用第三方公开的服务将此链接转换成为一个短链接,再将短链接通过邮件、QQ消息等方式发送给普通用户,当普通用户在访问登陆目标网站后再访问此地址,即会自动发送修改密码的请求。
第三方短网址服务:通过google或baidu搜索,可以得到。
优点:使用第三方短网址可以绕过某些邮箱、聊天工具的安全检测。
3.4.3.嵌入链接
嵌入链接,是指利用一些第三方网站,将生成的短链接嵌入到第三方网站,在用户访问到嵌入链接的地址(或执行指定操作)后,浏览器将自动访问该短链接地址发起跨站攻击请求。
举例:
①存储式XSS注入:<img src=”目标链接” hidden>
②正常的评论内容中加入目标链接,并加入一些引人的话语诱导用户点击。
…
其中与XSS相结合使用的CSRF漏洞,又称为:XSRF漏洞。