2009-07-02 77 views
1

我读过几个XSRF解决方案,它们依赖于向响应添加更多的标记,这有助于保护仅在POST上运行的代码。这个想法中的任何逻辑循环漏洞用于防止跨站点请求伪造?

即这将是一个一步到位的攻击依托,响应HTTP页面上GET

<img src="http://amazon.com/buybook/anarchistscookbook/mailto/me/execute.php"> 

但随着像jQuery更好的库,它变得越来越容易编写恶意的JavaScript XmlHttpRequest的脚本,可以做两(一个GET,解析Anti-XSRF视图状态/查询字符串/额外的cookie等),然后提交POST。 (或者说,我不担心AES很快就会被破解,我是否应该担心针对HTTP POST操作的2步XSRF攻击变得与上面显示的img标签攻击一样容易?)

我想一步攻击主要可以通过在GET上做任何不感兴趣的事情来解决,这两种攻击都可以通过要求网站用户解决CAPTCHA来实现,然后CAPTCHA会获得所有URL所需的查询字符串标记会议?

到目前为止,它似乎只会在CAPTCHA失败时失败,比如OCR软件可以读取文本或者是否有机械turk组件。

编辑:特定的攻击在脑海中是一个电子邮件与xhr JavaScript或图像标记。所以代码将在电子邮件客户端的浏览器或从本地文件系统加载的HTML页面中执行。为了简单起见,我在想象该网站没有XSS漏洞(即没有机会让恶意用户将HTML注入到网站发送的HTML中)

回答

1

问题是JavaScript无法读取-XSRF令牌来自跨域上下文,并且XMLHTTPRequest仅是同源的,所以它不能用于窃取令牌。

如果您的网站已经存在XSS漏洞,那么您已经损坏,并且反XSRF令牌不会对您有所帮助。

+0

嗯,有趣。你提到的HTTP只有双重提交的cookies,对吧? 关于XSS,真实的,但你并不需要XSS拉过一个XSRF?典型的例子是一个电子邮件,其中包含用于POST的JavaScript或用于GET的图像标记。 – MatthewMartin 2009-07-02 04:52:27

+0

如果一个网站没有试图减轻XSRF的话,那么是的,一个坏人将不需要XSS利用它。 针对XSRF的典型防御措施是在表单或cookie中使用一次性令牌。如果有问题的网站存在XSS漏洞,此防御通常无效。 – EricLaw 2009-07-06 03:06:37

1

这两天XmlHttpRequests和javascript框架操作都不能跨域使用;那会是纯粹的疯狂。这些日子的CSRF攻击通常由你提到的图像标签组成,或者自动生成POST到另一个网站的表单。但是,检索反XSRF令牌(大概是基于每个会话生成的加密随机数)几乎是不可能的。只有当它是一个非常差的标记,不检查用户会话和IP地址时,才可能利用服务器端语言来检索它,然后将其与客户端CSRF结合使用。除了令牌之外,很多人只需通过检查引用者并阻止所有远程域来停止CSRF。由于域限制,用XmlHttpRequests提交CSRF几乎是不可能的。

无论如何,您不必担心XmlHttpRequest能够访问远程域。唯一可能发生的事情就是如果你有XSS漏洞,在这种情况下,就像EricLaw所说的那样,你已经崩溃了。

+0

如果页面是从本地文件系统加载的(比如说是一封恶意邮件的结果),那么xhr似乎能够发布到用户登录的网站。我不清楚跨域规则如何影响在本地文件系统上运行的JS。 – MatthewMartin 2009-07-02 04:59:01

1

我认为你对同源策略感到困惑。请求本地文件中的html页面不会绕过这个策略。事实上,我认为更严格的规则适用于文件资源。你会发现在本地html文件中的Javascript将而不是能够作出成功的请求来检索非本地资源。

现代浏览器不允许使用Javascript 在本地HTML文件访问远程 HTTP资源。

在哪个浏览器中,您能够从文件中成功执行跨域XHR:/// resource?

我在IE6,IE7,IE8,火狐3测试这一点,火狐3.5和Chrome,Opera和Safari在Windows的最新版本;他们都拒绝跨域http请求。

<html> 
<head> 
<script 
    type="text/javascript" 
    src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> 
<script type="text/javascript"> 
    $(document).ready(function() { 
    $('#xhr').append('replace me with remote xhr'); 
    $('#xhr').load('http://stackoverflow.com/', function() { 
     $('#xhr').append('xhr load complete');   
    }); 
    }); 
</script> 
</head> 
<body> 
    test 
    <div id="xhr">original</div> 
</body> 
</html> 

有可能一些旧的浏览器限制较少。

相关问题