x00 简要介绍


CSRF(Cross-site request forgery)跨站请求伪造,由于目标站无token/referer限制,导致攻击者可以用户的身份完成操作达到各种目的。根据HTTP请求方式,CSRF利用方式可分为两种。

0x01 GET类型的CSRF


这种类型的CSRF一般是由于程序员安全意识不强造成的。GET类型的CSRF利用非常简单,只需要一个HTTP请求,所以,一般会这样利用:

<img src=http://wooyun.org/csrf.php?xx=11 />

如下图,在访问含有这个img的页面后,成功向http://wooyun.org/csrf.php?xx=11发出了一次HTTP请求。所以,如果将该网址替换为存在GET型CSRF的地址,就能完成攻击了。

乌云相关案例:

http://wooyun.org/bugs/wooyun-2010-023783

http://wooyun.org/bugs/wooyun-2010-027258 (还未公开)

0x02 POST类型的CSRF


这种类型的CSRF危害没有GET型的大,利用起来通常使用的是一个自动提交的表单,如:

<form action=http://wooyun.org/csrf.php method=POST>
<input type="text" name="xx" value="11" />
</form>
<script> document.forms[0].submit(); </script>

访问该页面后,表单会自动提交,相当于模拟用户完成了一次POST操作。

乌云相关案例:

http://wooyun.org/bugs/wooyun-2010-026622

http://wooyun.org/bugs/wooyun-2010-022895

0x03 其他猥琐流CSRF


过基础认证的CSRF(常用于路由器):

POC:

<img src=http://admin:admin@192.168.1.1 />

加载该图片后,路由器会给用户一个合法的SESSION,就可以进行下一步操作了。

乌云相关案例:

WooYun: TP-LINK路由器CSRF,可干许多事(影响使用默认密码或简单密码用户)

0x04 如何修复


针对CSRF的防范,有以下几点要注意:

关键操作只接受POST请求

验证码

CSRF攻击的过程,往往是在用户不知情的情况下构造网络请求。所以如果使用验证码,那么每次操作都需要用户进行互动,从而简单有效的防御了CSRF攻击。

但是如果你在一个网站作出任何举动都要输入验证码会严重影响用户体验,所以验证码一般只出现在特殊操作里面,或者在注册时候使用

检测refer

常见的互联网页面与页面之间是存在联系的,比如你在www.baidu.com应该是找不到通往www.google.com的链接的,再比如你在论坛留言,那么不管你留言后重定向到哪里去了,之前的那个网址一定会包含留言的输入框,这个之前的网址就会保留在新页面头文件的Referer中

通过检查Referer的值,我们就可以判断这个请求是合法的还是非法的,但是问题出在服务器不是任何时候都能接受到Referer的值,所以Refere Check 一般用于监控CSRF攻击的发生,而不用来抵御攻击。

Token

目前主流的做法是使用Token抵御CSRF攻击。下面通过分析CSRF 攻击来理解为什么Token能够有效

CSRF攻击要成功的条件在于攻击者能够预测所有的参数从而构造出合法的请求。所以根据不可预测性原则,我们可以对参数进行加密从而防止CSRF攻击。

另一个更通用的做法是保持原有参数不变,另外添加一个参数Token,其值是随机的。这样攻击者因为不知道Token而无法构造出合法的请求进行攻击。

Token 使用原则

Token要足够随机————只有这样才算不可预测
Token是一次性的,即每次请求成功后要更新Token————这样可以增加攻击难度,增加预测难度
Token要注意保密性————敏感操作使用post,防止Token出现在URL中

0x05 测试CSRF中注意的问题


如果同域下存在xss的话,除了验证码,其他的方式都无法防御这个问题。

有个程序后端可能是用REQUEST方式接受的,而程序默认是POST请求,其实改成GET方式请求也可以发送过去,存在很严重的隐患。

当只采用refer防御时,可以把请求中的修改成如下试试能否绕过:

原始refer:http://test.com/index.php

测试几种方式(以下方式可以通过的话即可能存在问题):

http://test.com.attack.com/index.php

http://attack.com/test.com/index.php

[空]

refer为空构造的方法:

由于浏览器特性,跨协议请求时不带refer(Geckos内核除外),比如https跳到http,如果https环境不好搭建的话,ftp其实也是可以的:)

<iframe src="data:text/html,<script src=http://www.baidu.com></script>"> //IE不支持

利用 xxx.src='javascript:"HTML代码的方式"'; 可以去掉refer,IE8要带。
<iframe id="aa" src=""></iframe>
<script>
document.getElementById("aa").src='javascript:"<html><body>wooyun.org<scr'+'ipt>eval(你想使用的代码)</scr'+'ipt></body></html>"';
</script>
//来自于二哥gainover

CSRF简单介绍及利用方法的更多相关文章

  1. CSRF简单介绍及利用方法-跨站请求伪造

    0x00 简要介绍 CSRF(Cross-site request forgery)跨站请求伪造,由于目标站无token/referer限制,导致攻击者可以用户的身份完成操作达到各种目的.根据HTTP ...

  2. lombok的简单介绍和使用方法

    这是上周在群里发现有人推荐lombok,他说是神器,当时就引起了我的好奇,然后下班回来我就看了看官网介绍(菜鸟英语水平),这就是难点了,然后就是大概了解了一下,就在网上查了查相关资料,周末的时候自己试 ...

  3. 关于ios的autoLayout的一些简单介绍以及使用方法

    一.autoLayout的用途: 主要用于屏幕适配,尤其是出现了iphone6,plus之后. 二.怎么简单的用autoLayout呢? 点击左一,可以看到: 点击左二: 基本上要想autolayou ...

  4. (转)TreeSet简单介绍与使用方法

    TreeSet简介 TreeSet是JAVA中集合的一种,TreeSet 是一个有序的集合,它的作用是提供有序的Set集合.它继承于AbstractSet抽象类,实现了NavigableSet< ...

  5. TreeSet简单介绍与使用方法

    TreeSet简介 TreeSet是JAVA中集合的一种,TreeSet 是一个有序的集合,它的作用是提供有序的Set集合.它继承于AbstractSet抽象类,实现了NavigableSet< ...

  6. java中的泛型,简单介绍。 修饰方法的用法

    一.<R>  ( R  r ) 默认object  可以存所有类型.   R 这个是随便定义的大写字母,前后要保持一致性! package com.aaa.test; /* * 演示 泛型 ...

  7. CSS3中transform,transition和animation的简单介绍和使用方法演示样例

    transform是一个属性,本质跟width,height是一样的,加上transform也就是为类添加一个变换属性. transition是一个属性.它是用来控制过渡效果的,由于用transfor ...

  8. 决策树简单介绍(二) Accord.Net中决策树的实现和使用

    决策树介绍 决策树是一类机器学习算法,可以实现对数据集的分类.预测等.具体请阅读我另一篇博客(http://www.cnblogs.com/twocold/p/5424517.html). Accor ...

  9. Java泛型使用的简单介绍

    目录 一. 泛型是什么 二. 使用泛型有什么好处 三. 泛型类 四. 泛型接口 五. 泛型方法 六. 限定类型变量 七. 泛型通配符 7.1 上界通配符 7.2 下界通配符 7.3 无限定通配符 八. ...

随机推荐

  1. go学习笔记(3) -- package fmt

    package fmt fmt包实现了格式化的I/O函数,这点类似C语言中的printf和scanf,但是更加简单,其中的格式“占位符”衍生自 C 占位符 一般占位符 布尔占位符 浮点数及其复合构成占 ...

  2. mySQL把秒转换成日期

    mysql> SELECT SEC_TO_TIME (3600); +--------------------+ | SEC_TO_TIME (3600) | +---------------- ...

  3. nginx实战七

    Nginx优化-配置参数优化上 https://coding.net/u/aminglinux/p/nginx/git/blob/master/optimize/nginx_opt.md Nginx作 ...

  4. C#--readlyonly关键字

    字段可以使用readyonly修饰符声明.其作用类似声明一个字段为const,一旦值被设定就不能改变. const字段只能在字段的声明语句中初始化,而readyonly字段可以在下列任何位置设置它的值 ...

  5. java读取url中json文件中的json数据

    有时候需要远程从其他接口中获取json数据,如果遇到返回的json数据是一个文件而不直接是数据,那么可以通过以下方法进行读取: /** * 从数据接口获取到数据 * @return * @throws ...

  6. JavaScript:表单常用验证脚本(整理)

    以下内容根据网上资源整理而来,主要来源是CSDN一个供下载的check.js,源码地址找不到了. 1. 检查输入字符串是否为空或者全部都是空格 /* 检查输入字符串是否为空或者全部都是空格 输入:st ...

  7. xpages的combobox提前输入值

            之前的文档已经提到怎么在combobx手动输入.哪我们如何能够在combobox默认获取值呢?下面有几个种方法请大家參考 1)获取当前数据库某视图的某列值 @DbColumn(&quo ...

  8. 【Android】5.8 滑动条(SeekBar)

    分类:C#.Android.VS2015: 创建日期:2016-02-07 一.简介 滑动条也叫拖动条(用户可拖动改变滑动条的值),比如可让用户调节音量大小.调节屏幕亮度.调节歌曲或视频当前播放的位置 ...

  9. jvm 性能调优 经验总结---转

    最近因项目存在内存泄漏,故进行大规模的JVM性能调优 , 现把经验做一记录. 一.JVM内存模型及垃圾收集算法 1.根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老 ...

  10. angular学习笔记(五)-阶乘计算实例(1)

    <!DOCTYPE html> <html ng-app> <head> <title>2.3.2计算阶乘实例1</title> <m ...