跨站点伪造AJAX服务

时间:2016-05-27 15:34:58

标签: ajax security xss

我对如何防止跨站点伪造感到有点困惑。仍然。我知道那里有大量的信息,但我很困惑。

Steven Anderson's post中,他描述了一个这样的表格:

<body onload="document.getElementById('fm1').submit()">
    <form id="fm1" action="http://yoursite/UserProfile/SubmitUpdate" method="post">
        <input name="email" value="hacker@somewhere.evil" />
        <input name="hobby" value="Defacing websites" />
    </form>
</body>

在别人的网站上。

给出的解决方案是由服务器生成的“防伪”令牌,该令牌以隐藏形式发送回任何请求。这很酷,但是什么阻止黑客只是下载表单页面,提取令牌并发布它?

我的申请是:在注册我的网站时,我想要一个AJAX函数,它将当前输入的用户名发送到服务器,如果可用,它应该响应“真/假”。这发生在onKey上,因此用户可以选择尚未使用的用户名。当满足“新用户”的所有条件时,“提交”按钮将启用。

显然,对于黑客来说,这是一个利用该服务“测试”大量用户名以查看它们是否可用的机会 - 我知道这不是网络银行级别的风险,但我仍然只想服务来自我的应用程序的请求,而不是黑客。

有关这些查询的任何想法吗?

更新:

所以在我的场景中。我生成一个令牌(比如客户端IP地址的一些散列值),如果服务器提供有关用户名是否可用的信息,服务期望收到该消息。

- 问题仍然存在,域外的某人只是调用服务,例如/generateToken这看着客户的IP ......可能是一个知道的黑客。

返回

{ token: 4uru32br }

然后将其提交给/ isUsernameAvailable?token = 4uru32br&amp; partialUsername = usernam

这会让我感到什么?

3 个答案:

答案 0 :(得分:0)

  

什么是阻止黑客只下载表单页面,提取令牌并发布它?

same-origin policy,这是什么。

  

我喜欢AJAX函数,它将当前输入的用户名发送到服务器,该服务器应响应&#34; True / False&#34;如果可用或不可用。

那是一个用户枚举漏洞。

  

有关这些查询的任何想法吗?

这是您的新流程:

  1. 使用电子邮件地址作为用户名。

  2. 使用CAPTCHA防止注册表单自动化。

  3. 电子邮件用户名不存在:

    显示&#34;成功&#34;信息。使用一次性链接向地址发送电子邮件。使用该链接返回您的站点后注册用户。

    电子邮件用户名确实存在:

    显示&#34;成功&#34;信息。发送电子邮件到该地址,并带有消息说&#34;有人正在尝试使用此地址创建一个帐户,但它已经存在&#34;。

答案 1 :(得分:0)

您正在混淆CSRFuser enumeration

  

给出的解决方案是&#34;防伪&#34;令牌,由服务器生成,   以隐藏形式发送回任何请求。那&#39; S   很酷,但是什么是阻止黑客只下载表单页面,   提取令牌并发布它?

Say Bob是您网站上的普通用户。

查克是一个邪恶的攻击者。

Bob访问您的网站并提交评论表单(在您的代码示例中)。如果存在CSRF保护,则此表单中也包含一个令牌:

<input type="hidden" name="csrf_token" value="zxcvbnnmm1235152" />

Bob的会话为服务器端存储了令牌zxcvbnnmm1235152

Chuck还登录了您的网站,因为他已注册。

但是,当他进入此页面时,他会获得此令牌:

<input type="hidden" name="csrf_token" value="lklkljlk898977" />

如果Chuck下载该页面,请以某种方式获取Bob(例如向他发送电子邮件)以访问Chuck服务器上的此页面,因为csrf_token与Bob不匹配, Chuck不能将消息发布为Bob。

Bob可以继续正常,因为表单中的令牌与其会话相关联的令牌匹配。

CSRF是关于阻止Chuck使用Bob的浏览会话以Bob的形式提交内容。

  

我的申请是:在注册我的网站时我很喜欢   一个AJAX函数,用于将当前输入的用户名发送给   服务器应该响应&#34;真/假&#34;如果可用或不可用。   这发生在onKey上,因此用户可以选择尚未使用的用户名   已经使用过。所有条件都会启用“提交”按钮   为&#34;新用户&#34;满足了。

     

显然,这是黑客使用该服务的机会   &#34;测试&#34;很多用户名,看看它们是否可用 - 我知道它不是   确切地说是网上银行的风险,但我还是喜欢   仅服务来自我的应用程序的请求,而不是黑客。

是的,这是您的用户枚举漏洞。

将用户名作为电子邮件,并按照this answer了解如何确保此安全。

答案 2 :(得分:-1)

防伪令牌不是随机码。对于多个请求,也不是重复使用的令牌。

相反,服务器将令牌与呼叫者ip-address或会话耦合,例如通过使用服务器密钥加密ip + salt。

因此,如果攻击者试图从您的网站下载令牌,那么它将无法被真实客户端使用