是否可以使用webHttpBinding对WCF服务执行CSRF攻击?

时间:2012-05-03 11:27:51

标签: asp.net wcf web-services security

我们正在使用带有webHttpBinding绑定的WCF服务来向客户端公开端点。服务由IIS(.svc)托管。客户端是使用enableWebScript行为自动生成的JavaScript。所有方法都使用POST。

是否可以对此服务进行CSRF攻击?

我考虑了以下选项:

  • AJAX - 不可能,因为不允许跨站点请求(我假设我们的站点不容易使用XSS)
  • HTML表单提交 - 不可能,因为服务需要某些无法使用HTML表单设置的HTTP标头

还有其他选择吗? Flash,Silverlight,网络套接字还是别的什么?

有效请求如下所示:

POST http://site/Service.svc/ServiceMethod HTTP/1.1
Host: site
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: cs,en-us;q=0.8,en;q=0.5,pl;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
X-Requested-With: XMLHttpRequest
Content-Type: application/json; charset=utf-8
Referer: http://site/
Content-Length: 33
Cookie: cookies, session id, etc.
Pragma: no-cache
Cache-Control: no-cache

{"param1":11,"param2":"123"}

要明确:我正在努力确保我的服务。不执行攻击。我正在考虑为每次通话添加“身份验证令牌”,但首先我想知道是否值得付出努力。

2 个答案:

答案 0 :(得分:1)

这是一篇旧帖子,但这是第一件出现在Google上的WCF CSRC StackOverflow.com"所以这是OWASP的观点推荐标题:

https://www.owasp.org/index.php/Cross-Site_Request_Forgery_%28CSRF%29_Prevention_Cheat_Sheet#Checking_The_Referer_Header

这里的另一个答案有点误导。 referrer标头是检查CSRF的有用方法,但并不完全可靠。一种更可靠的方法是使用嵌入在每个表单中的随机令牌(最好是为表单的每个实例随机生成),这将在服务器端进行检查。

例如:

<html>
<body>
    <form>
        <input type='text' name='securityfield' /><input type='submit' value='submit' />
    <input type='hidden' value='<some random token>' name='CSRF-token' />
    </form
</body>
</html>

在MVC代码中:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult SomeAction(Dictionary<string, string> parameters){
    if(parameters["CSRF-token"] != UserContext.csrfToken){
        return View();
    }

    //Do actual work
}

这是必要的原因是因为CSRF攻击使用受害者的浏览器,该浏览器可能仍然登录到您的站点。如果用户打开了多个选项卡,或者您的会话只需要一段时间才能过期,则会发生这种情况。攻击者通常会将用户重定向到包含恶意数据的表单提交页面。

我还应该说AJAX不是跨域的。此外,XSS不需要实现AJAX。

答案 1 :(得分:-1)

通常,检查Referrer标头足以阻止CSRF,因为浏览器将设置引用标头(即使它是由javascript设置的)。

我认为没有人能够保证您的服务对CSRF是安全的,因为您可能(意外地)打开一些攻击媒介。例如,如果您有以下网站:

http://mycompanysite.com/MyService/Service.svc (hosting the service)
http://mycompanysite.com/MyWebApp/ (hosting a web app)

然后,Web应用程序中的漏洞可能允许攻击,因为“跨域”规则不再适用。此外,客户端应用程序(即浏览器)中可能存在漏洞,因此从托管角度来看,您实际上只能在用户使用众所周知的最新浏览器的基础上工作。没有插件等