CSRF漏洞入门学习
文章目录
一.什么是CSRF?
CSRF(Cross-Site Request Forgery),也被称为 one-click attack 或者 session riding,即跨站请求伪造攻击。即强制最终用户在当前对其进行身份验证的Web应用程序上执行不需要的操作,浏览器的安全策略是允许当前页面发送到任何地址的请求,所以用户在浏览无法控制的资源时,攻击者可以控制页面的内容来控制浏览器发送它精心构造的请求。
简单来说,就是攻击者可以盗用你的登录信息,以你的身份模拟发送各种请求对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。
在CSRF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接),然后欺骗目标用户进行点击,用户一旦点击了这个请求,整个攻击就完成了。所以CSRF攻击也成为"one click"攻击。
二.CSRF攻击原理
1、用户打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;
2、在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;
3、用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;
4、网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;
5、浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。
CSRF攻击的三个条件:
1.用户登陆了站点A,并在本地记录了cookie。2.在用户没有登出站点的情况(cookie生效的情况),访问了攻击者提供的恶意链接。3.站点A没有任何CSRF防御
三.CSRF分类及危害
CSRF分类:
CSRF攻击可以分为以下几种类型:
(1)GET型:这种类型的CSRF利用非常简单,只需要一个HTTP请求 ,这种类型的CSRF一般是由于程序员安全意识不强造成的。例:<img src=http://example.cn/csrf.php?x=1 />
访问了img图片之后,浏览器就会向 http://example.cn/csrf.php?x=1
发出一次HTTP请求。所以,如果将该网址替换为存在GET型CSRF的地址,就能完成攻击了。
(2)POST型:这种类型的CSRF危害没有GET型的大,利用起来通常使用的是一个自动提交的表单。例:在普通用户的眼中,点击网页->打开试看视频->购买视频是一个很正常的一个流程。可是在攻击者的眼中可以算正常,但又不正常的。攻击者在购买处抓到购买时候网站处理购买(扣除)用户余额的地址。比如:/coures/user/handler/25332/buy.php
。通过提交表单,buy.php处理购买的信息,这里的25532为视频ID。那么攻击者现在构造一个链接,链接中包含以下内容:
<form action=/coures/user/handler/25332/buy method=POST>
<input type="text" name="xx" value="xx" />
</form>
<script> document.forms[0].submit(); </script>
当用户访问该页面之后,表单会自动提交,相当于完成了一次POST操作,自动购买了id=25332的视频,从而导致受害者扣除金额。
(3)点击劫持:点击劫持是一种视觉上的欺骗手段。攻击者使用一个透明的、不可见的 iframe,覆盖在一个网页上,然后诱使用户在该网页上进行操作,此时用户将在不知情的情况下点击透明的 iframe 页面。
想让iframe页面透明:可以尝试以下几种方法:1.通过使用allowtransparency和background-color来设置iframe框架的透明效果:<iframe src="" opacity="0" style="opacity:0"></iframe>
2.把iframe 设置成绝对定位,把 z-index 设置很多,让它处在最上层。
(4)CSRF - token leak:通过XSS攻击等手段获取提交时的token,重新生成PoC链进行攻击。
CSRF漏洞危害:
- 1.修改账户信息。
- 2.利用管理员账号,上传木马文件。
- 3.传播蠕虫病毒。
- 4.和其他攻击手段配合,实现攻击,比如XSS。
四.CSRF攻击,漏洞挖掘
了解完CSRF的一些概念之后我们来进行实战吧:
CSRF攻击:
1.pikachu靶场的get型CSRF : 我们用username=lili password=123456进行登录。登陆之后如下图:
我们点击修改个人信息:
这时候,用我们的抓包工具burpsuite,进行抓包。将手机号码修改成110然后提交,我们可以抓到一个数据包如下所示:
根据如图所示的url可以看到,用户在修改个人信息的时候,系统是没有给出任何的认证信息的,我们可以这个漏洞。于是我构建了这个链接,将性别,邮箱改为0。http://localhost/pikachu-master/vul/csrf/csrfget/csrf_get_edit.php?sex=0&phonenum=110&add=usa&email=0&submit=submit
为了将链接变得隐蔽,我们可以使用短链接工具:(https://www.duanlianjie.net/),将URL进行缩短,让目标不方便发觉。综上所述,我们要设法让被攻击者点击了,这个链接,那么CSRF攻击就可以发生。
2.pikachu靶场的post型CSRF : 同样的我们用lili来登录。登录完之后->修改个人信息->submit
然后进行抓包,我们发现:
右键使用更多相关工具,然后选到 generate CSRF PoC:
我们点击options,勾选最后一个选项,自动提交脚本,就生成了一段HTML:
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<script>history.pushState('', '', '/')</script>
<form action="http://localhost/pikachu-master/vul/csrf/csrfpost/csrf_post_edit.php" method="POST">
<input type="hidden" name="sex" value="1" />
<input type="hidden" name="phonenum" value="18656565545" />
<input type="hidden" name="add" value="usa" />
<input type="hidden" name="email" value="lili@pikachu.com" />
<input type="hidden" name="submit" value="submit" />
<input type="submit" value="Submit request" />
</form>
<script>
document.forms[0].submit();
</script>
</body>
</html>
将代码用记事本编写成一个html文件,然后把文件放到pikachu文件中,在这里我命名为:111.html我的存放位置是:`pikachu-master\vul\csrf` 然后我们在访问网站:`http://localhost/pikachu-master/vul/csrf/111.html` 攻击完成。
3.pikachu靶场CSRF–token 同样的我们用bp抓包发现,报文中,增加了token值。为了解决这个token,我在BApp Stroe中,下载插件CSRF Token Tracker。
下载插件之后我们打开插件CSRF token Tracker:将host name value
的值按照如下输入,然后勾选enable 和 sync requests based on the following rules (基于以下规则同步请求)。
配置完之后,将抓到的报表发送到repeater中,我将sex设置为2,来测试是否允许修改:
发现成功了:
4.DVWA - medium: 我们查看源码,可以看到有这么一段判断语句:eregi()
函数在由模式指定的字符串中搜索指定的字符串,搜索不区分大小写。如果模式被验证,则返回true
,否则返回false
。
if( eregi( $_SERVER[ 'SERVER_NAME' ], $_SERVER[ 'HTTP_REFERER' ] ) ) {
// Get input
$pass_new = $_GET[ 'password_new' ];
$pass_conf = $_GET[ 'password_conf' ];
这段代码适用于判断’SERVER_NAME’ 是否等于 ‘HTTP_REFERER’ 的,我们用bp生成好的CSRF漏洞html代码时,只需将文件名改成127.0.0.1即可绕过这段判断语句。
CSRF漏洞挖掘:
- 1.抓取请求数据包,查看是否有Refere和token。如果没有,择优CSRF漏洞。
- 2.即使存在Refere字段,但是若是请求删去Refere仍能够提交成功,那么也存在CSRF漏洞。
- 3.使用CSRFTester-1.0 漏洞测试工具。
知识补充:
-
关于Refere:1.Referer是HTTP请求
header
的一部分,当浏览器(或者模拟浏览器行为)向web
服务器发送请求的时候,头信息里有包含Referer 。比如我在www.xxxx.com
里有一个www.baidu.com
链接,那么点击这个www.baidu.com
,它的header
信息里就有:Referer=https://www.xxxx.com信息。2.Referer的作用:防盗链,防止恶意请求。 -
关于Token:所谓的Token,其实就是服务端生成的一串加密字符串、以作客户端进行请求的一个“令牌”。当用户第一次使用账号密码成功进行登录后,服务器便生成一个Token及Token失效时间并将此返回给客户端,若成功登陆,以后客户端只需在有效时间内带上这个Token前来请求数据即可,无需再次带上用户名和密码。
五.CSRF的防御
(1) 验证header字段,常见的是Referer和Origin,Referer容易绕过,且会包含有一些敏感信息,可能会侵犯用户的隐私,而Origin字段代表最初请求,更建议使用。
(2) Token令牌机制,
当前最成熟的防御机制,但若存在验证逻辑及配置问题则存在绕过风险。Token的生成机制通常和session标识符挂钩,将用户的token与session标识符在服务端进行匹配。当下已经有很多开源库和中间件都可以实现token生成。
(3) 验证自定义header,如基于cookie的csrf保护,验证cookie中的某些值和参数必须相等。
(4)双重cookie验证,利用CSRF攻击不能获取到用户Cookie的特点,我们可以要求Ajax和表单请求携带一个Cookie中的值。
tencent.com/product/tdmq?from_column=20065&from=20065)都可以实现token生成。
(3) 验证自定义header,如基于cookie的csrf保护,验证cookie中的某些值和参数必须相等。
(4)双重cookie验证,利用CSRF攻击不能获取到用户Cookie的特点,我们可以要求Ajax和表单请求携带一个Cookie中的值。