CSRF篇-本着就了解安全本质的想法,尽可能的用通俗易懂的语言去解释安全漏洞问题
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的情况下就有一些绕过的姿势了。比如
- 不同协议之间的跳转,比如我从qq消息中 http://www.51m0rk.xyz:81/referertest/2.php 页面显示的Referer就为空,此外还有比如https/ftp/file/javascript等
- 猜测后端代码可能是某关键字或者某个正则,则利用这个缺陷去构造,比如代码中检测了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篇-本着就了解安全本质的想法,尽可能的用通俗易懂的语言去解释安全漏洞问题的更多相关文章
- xss篇-本着就了解安全本质的想法,尽可能的用通俗易懂的语言去解释安全漏洞问题
前言 最早接触安全也是从xss攻击和sql注入攻击开始的. 0x01 跨站脚本攻击漏洞(XSS),是客户端脚本安全中的头号大敌,owasp top10 屡居榜首,由于攻击手法较多,开发者水平不一 ...
- SSRF篇-本着就了解安全本质的想法,尽可能的用通俗易懂的语言去解释安全漏洞问题
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞.一般情况下,SSRF攻击的目标是从外网无法访问的内部系统.( ...
- sqli篇-本着就了解安全本质的想法,尽可能的用通俗易懂的语言去解释安全漏洞问题
前言 最早接触安全也是从xss攻击和sql注入攻击开始的. 和xss一样屡居OWASPtop10 前三名的漏洞,sqli(sql Injection)sql注入攻击也是web安全中影响较大和影响范围较 ...
- XXE篇-本着就了解安全本质的想法,尽可能的用通俗易懂的语言去解释安全漏洞问题
0x01 Brief Description XXE(XML External Entity) XML外部实体攻击也是常见的web漏洞之一,在学习这个漏洞之前有必要了解一下xml,可以参考w3c的基本 ...
- Python开发【第十四篇】:Web框架本质
Web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...
- 如果这篇文章说不清epoll的本质,那就过来掐死我吧!
转载自:https://www.toutiao.com/i6683264188661367309/ 目录 一.从网卡接收数据说起 二.如何知道接收了数据? 三.进程阻塞为什么不占用cpu资源? 四.内 ...
- 构建后端第6篇之---java 多态的本质 父类引用 指向子类实现
张艳涛写于2021-2-20 今天来个破例了,不用英文写了,今天在家里电脑写的工具不行,简单的说 主题是:java多态的原理与实现 结论是:java的多态 Father father= new Son ...
- DVWA 黑客攻防演练(十四)CSRF 攻击 Cross Site Request Forgery
这么多攻击中,CSRF 攻击,全称是 Cross Site Request Forgery,翻译过来是跨站请求伪造可谓是最防不胜防之一.比如删除一篇文章,添加一笔钱之类,如果开发者是没有考虑到会被 C ...
- 跨站点请求伪造(CSRF)总结和防御
什么是CRSF 构建一个地址,比如说是删除某个博客网站博客的链接,然后诱使已经登录过该网站的用户点击恶意链接,可能会导致用户通过自己的手将曾经发布在该网站的博客在不知情的情况下删除了.这种构建恶意链接 ...
随机推荐
- python开发【lambda篇】
lambda 与 python 高级函数的配套使用 filter函数 过滤 __author__ = "Tang" # filter(lambda, []) people = [' ...
- maven-assembly-plugin打包可执行的jar包
pom.xml添加 <build> <plugins> <plugin> <artifactId>maven-assembly-plugin</a ...
- mysql中group by和order by混用 结果不是理想结果(转)
文章转自 https://www.cnblogs.com/myphper/p/3767572.html 在使用mysql排序的时候会想到按照降序分组来获得一组数据,而使用order by往往得到的不是 ...
- Numpy基本操作
NumPy:数组计算 NumPy是高性能科学计算和数据分析的基础包.它是Pandas等其他各种工具的基础 NumPy的主要功能: ndarray,一个多维数据结构,高校且节省空间 无需循环即可对整组数 ...
- PHP实现微信企业付款
一.封装微信企业付款类WeiXinPayToUser,如下图代码所示: class WeixinPayToUser { /** * API 参数 * @var array * 'mch_appid' ...
- StatefulSet(一):拓扑状态
Deployment 实际上并不足以覆盖所有的应用编排问题. 造成这个问题的根本原因,在于 Deployment 对应用做了一个简单化假设. 它认为,一个应用的所有 Pod,是完全一样的.所以,它们互 ...
- git revert用法以及与git reset的区别
git revert用法 git revert 撤销 某次操作,此次操作之前和之后的commit和history都会保留,并且把这次撤销 作为一次最新的提交 * git revert HEAD ...
- es6 模本字符串拼接方法 ``
1.字符串拼接 可以使用 es6 ` ` 配合 ${xxx} 具体操作上代码 <!DOCTYPE html> <html lang="en"> < ...
- Vue组件以及组件之间的通信
一.组件的注册 1. 全局组件注册 1. 注册基本语法Vue.component Vue.component("my_header", { template: `<div&g ...
- shutil模块和几种文件上传Demo
一.shutil模块 1.介绍 shutil模块是对os中文件操作的补充.--移动 复制 打包 压缩 解压 2.基本使用 1. shutil.copyfileobj(文件1, 文件2, 长度) 将文件 ...