0x01 Brief Description

csrf 跨站伪造请求,请求伪造的一种,是由客户端即用户浏览器发起的一种伪造攻击。攻击的本质是请求可以被预测的到。

在了解csrf攻击之前,需要了解浏览器的cookie策略,浏览器所持有的Cookie分为两种,一种是存放在浏览器进程内存中的session cookie,另外一种是保存在本地的Thirdy party cookie,如果浏览器从一个域的页面中,要加载另一个域的资源,由于安全原因,某些浏览器会阻止Tirdy party Cookie的发送,比如IE、safari,有些是允许的比如 Friefox、chrome,之所以csrf能攻击成功,是由于使用了允许发送第三方cookie的浏览器,导致了csrf攻击的成功。此外值得注意的是jsonp的劫持本质上也是csrf。

0x02 Vulnerability impact

csrf攻击能够劫持用户在已登录的web站点上执行非本意的操作。

攻击者盗用你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全。

个人认为产生CSRF漏洞的原因主要有两点:1.一方面是开发者不够审慎,编写的web应用程序存在漏洞被恶意利用,另一方面,因为web浏览器对cookie和http身份验证等会话信息的处理存在一定的缺陷(隐式的认证方式)。

csrf 进击的巨人,csrf在近年来csrf能做的事情越来越多,对应的攻击也越来越多,比如,一些内网资源由于防火墙做了限制只能是内网的资源去访问,所以这个时候可以使用客户端请求伪造即csrf,或者使用ssrf进行内网探测和内网攻击,有点儿“借刀杀人”的感觉

0x03关于Referer伪造

在csrf的防御中有这样一个措施是添加对Referer字段的验证(一般是白名单过滤),但是之前网上有看到说可以伪造Referer,遂就研究一下怎么绕过Referer。

首先来学习一下,在发送ajax请求的时候,我们可以发送自己定制的Header字段,那么我们是否就可以添加Referer字段,从而覆盖掉浏览器自己所“识别”的Referer字段呢,简单的测试代码如下:

1.php

<?php
?>
<a href="http://www.51m0rk.xyz:81/referertest/2.php"> Click </a>

2.php

<?php
//echo "Referer: ";
//echo getenv('HTTP_REFERER');
echo "</br>";
foreach (getallheaders() as $name => $value) {
echo "$name: $value</br>";
}
?>

ajax.html

<html>
<head>
<script type="text/javascript">
function loadXMLDoc()
{
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest(); }
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
}
var url = "http://www.51m0rk.xyz:81/referertest/2.php"
xmlhttp.open("GET",url,true);
xmlhttp.setRequestHeader("my-head", "M0rk")
xmlhttp.send();
}
</script>
</head>
<body> <h2>AJAX</h2>
<button type="button" onclick="loadXMLDoc()">请求数据</button>
<div id="myDiv"></div> </body>
</html>

然后我们测试:

当点击之后会显示来源Referer字段,如下图:

那么我们现在就尝试用ajax请求的方式试图修改Referer字段。访问ajax.html

诶?有我们的自定义头,那试试修改成Referer试试呢,看会不会覆盖

比如修改成这样:

刷新页面如下图所示:

可以看到并没有出现我们想要的结果,打开chrome的调试器,我们发现有一处报错。

可见,浏览器已拒绝了我们发送了我们自定义的Referer,即ajax的请求的头中Referer字段是我们不能自定义的,除此之外,笔者还测试了像Host、User-agent也是不能自定义的。

其它浏览器的情况呢?

经测试firefox也不会让你发送自定义的Referer,但是User-Agent 却可以修改,此外,firefox并不会像chrome那样有报错。

但是就真的没有可以自定义Referer的吗,有,之前看到过一篇文章讲IE 通过activeX控件可以修改到Referer Link,但是像csrf这种“欺骗”攻击,ie况且安装和开启了activeX的毕竟还是少数,再有就是安全研究,修改Referer的方法就很多了,比如burpsuite或者firefox的ModifyHeaders插件等,当然后端语言可以轻松的去伪造Referer。

总结就一句话:Referer如果可以伪造,那就是浏览器的漏洞,你可以在服务器上伪造,但是不能在浏览器上伪造Referer。

可见验证Referer还是一种相对安全的一种方法,但是也不一定,有时候为了需要,某些操作虽然验证了Referer,但是Referer允许为空,因为用户有可能并不是通过跳转过来的。那么允许空Referer的情况下就有一些绕过的姿势了。比如

  1. 不同协议之间的跳转,比如我从qq消息中 http://www.51m0rk.xyz:81/referertest/2.php 页面显示的Referer就为空,此外还有比如https/ftp/file/javascript等
  2. 猜测后端代码可能是某关键字或者某个正则,则利用这个缺陷去构造,比如代码中检测了referer中有qq.com,然后你去申请一个qq.com.fuck.cn,就有可能绕过

。。。

0x04 Defense

1.添加对Referer的验证,且确保验证的方式方法足够安全。

2.添加token字段(确保token足够随机,不被攻击者猜测的到)。

3.重要操作增加验证码(可能会降低用户体验,此外增加验证码还可以在一定程度上防御cc攻击)。

0x05 Reference

1.http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html

2.《xss跨站脚本攻击剖析与防御》邱永华著

3.https://www.youtube.com/watch?v=hW2ONyxAySY

4.http://0x007.blog.51cto.com/6330498/1610946

5.http://blog.163.com/yl32940@126/blog/static/50356084201453093323474/

CSRF篇-本着就了解安全本质的想法,尽可能的用通俗易懂的语言去解释安全漏洞问题的更多相关文章

  1. xss篇-本着就了解安全本质的想法,尽可能的用通俗易懂的语言去解释安全漏洞问题

    前言 最早接触安全也是从xss攻击和sql注入攻击开始的. 0x01    跨站脚本攻击漏洞(XSS),是客户端脚本安全中的头号大敌,owasp top10 屡居榜首,由于攻击手法较多,开发者水平不一 ...

  2. SSRF篇-本着就了解安全本质的想法,尽可能的用通俗易懂的语言去解释安全漏洞问题

    SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞.一般情况下,SSRF攻击的目标是从外网无法访问的内部系统.( ...

  3. sqli篇-本着就了解安全本质的想法,尽可能的用通俗易懂的语言去解释安全漏洞问题

    前言 最早接触安全也是从xss攻击和sql注入攻击开始的. 和xss一样屡居OWASPtop10 前三名的漏洞,sqli(sql Injection)sql注入攻击也是web安全中影响较大和影响范围较 ...

  4. XXE篇-本着就了解安全本质的想法,尽可能的用通俗易懂的语言去解释安全漏洞问题

    0x01 Brief Description XXE(XML External Entity) XML外部实体攻击也是常见的web漏洞之一,在学习这个漏洞之前有必要了解一下xml,可以参考w3c的基本 ...

  5. Python开发【第十四篇】:Web框架本质

    Web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...

  6. 如果这篇文章说不清epoll的本质,那就过来掐死我吧!

    转载自:https://www.toutiao.com/i6683264188661367309/ 目录 一.从网卡接收数据说起 二.如何知道接收了数据? 三.进程阻塞为什么不占用cpu资源? 四.内 ...

  7. 构建后端第6篇之---java 多态的本质 父类引用 指向子类实现

    张艳涛写于2021-2-20 今天来个破例了,不用英文写了,今天在家里电脑写的工具不行,简单的说 主题是:java多态的原理与实现 结论是:java的多态 Father father= new Son ...

  8. DVWA 黑客攻防演练(十四)CSRF 攻击 Cross Site Request Forgery

    这么多攻击中,CSRF 攻击,全称是 Cross Site Request Forgery,翻译过来是跨站请求伪造可谓是最防不胜防之一.比如删除一篇文章,添加一笔钱之类,如果开发者是没有考虑到会被 C ...

  9. 跨站点请求伪造(CSRF)总结和防御

    什么是CRSF 构建一个地址,比如说是删除某个博客网站博客的链接,然后诱使已经登录过该网站的用户点击恶意链接,可能会导致用户通过自己的手将曾经发布在该网站的博客在不知情的情况下删除了.这种构建恶意链接 ...

随机推荐

  1. linux命令之:yum

    yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理,能够从指定的服务器自动下载RP ...

  2. Django view(视图)

    在Django MTV模式中,View视图负责业务逻辑部分,路由系统接收到HTTP请求,并将任务分配给相应的视图函数,由视图函数来负责响应这个请求.无论视图本身包含什么逻辑,都要返回响应. 在这里HT ...

  3. 一位月薪1.2w的北漂程序员真实生活!

    “ 每个人都有一条生活道路.千万人,千万条,各不相同,各有特点.但是并不是好人都有一条好路,坏人都有一坏路.有的时候却恰恰相反.这虽然不是历史的必然,但却是客观社会存在的.今天咱们说的这部书是发生在当 ...

  4. 工具篇-Spring boot JPA多数据源

    写这篇博文是因为这个东西坑太多,首先说明下边实现的多数据源不是动态切换的,应该算是静态的. 坑一.pom文件 pom中spring boot以及mysql connector的版本一定要注意. < ...

  5. 私有云方案——利用阿里云云解析实现DDNS

            各位都是程序员,工作中是不是遇到个类似情况.在家里研究的一些开源代码或写的一些demo或试验代码,在工作中正好需要参考一下,但是在家里的电脑上.           虽然这些都可以用云 ...

  6. C#调用Delphi DLL获取字符串(C# IntPtr 与 string互转 )

    前因后果 调用一门锁的dll实现读取酒店IC卡数据,直接用Readme里的方法出错. 函数声明: 一.读卡函数    ************************ Delphi 调用 ****** ...

  7. Java中,尽量相信自己,使用自己写的方法,不要使用底层提供的方法。都是坑。

    Date转LocalDate时,调用toInstant()报UnsupportedOperationException异常. https://www.jianshu.com/p/11d8ed48f7a ...

  8. Python中的垃圾回收与del语句

    python中的垃圾回收采用计数算法 一个对象如果被引用N次,则需要N次(即计算引用次数为零时)执行del 才能回收此对象. a = 100 b = a del a print(b) print(a) ...

  9. 小小知识点(五)——MATLAB对复数的操作

    MATLAB程序 a=3+4*i %复数 real(a) %求复数的实部 imag(a) %求复数的虚部 abs(a) %求复数的模 angle(a) %求复数的相位 conj(a) %求复数的复共轭 ...

  10. [转帖]十二 个经典 Linux 进程管理命令介绍

    https://www.cnblogs.com/swordxia/p/4550825.html 接了 http referer 头 没法显示图片 可以去原始blog 里面去查看.   随笔- 109  ...