阅读这个问题
不同的用户在aspxanonymous中获得相同的cookie值
我开始想,如果有人真的可以用某种方式窃取cookie,然后把它放在他的浏览器上,然后以管理员的身份登录。
你知道表单认证如何确保即使cookie被篡改,黑客也不会真正使用它登录吗?
或者你知道其他自动防御机制吗?
提前谢谢你。
- 类似问题:stackoverflow.com/questions/3720720/…
Is it possible to steal a cookie and
authenticate as an administrator?
是的,有可能,如果表单auth cookie未加密,则有人可以对其cookie进行黑客攻击,以授予他们更高的权限;或者,如果不需要SSL,则复制其他人的cookie。但是,您可以采取以下步骤来降低这些风险:
在system.web/authentication/forms元素上:
RequiressL=真。这要求只能通过SSL传输cookie
slidingexpiration=false。如果为真,则可以重新激活过期的票据。
无烹饪=假。不要在试图加强安全性的环境中使用无烹饪会话。
EnableCrossAppDirects=假。如果为false,则不允许跨应用程序处理cookie。
保护=全部。使用machine.config或web.config中指定的计算机密钥加密和哈希表单auth cookie。此功能将阻止某人黑客自己的cookie,因为此设置告诉系统生成cookie的签名,并且在每次身份验证请求时,将签名与传递的cookie进行比较。
如果您愿意,您可以通过在会话中放置某种身份验证信息来添加一点保护,例如用户用户名的散列(不要将用户名以纯文本形式显示,也不要将其密码以纯文本形式显示)。这将要求攻击者同时窃取会话cookie和表单auth cookie。
- RequiressL=true,是我错过的东西。我认为这是最重要的一个。
在公共无线环境中会发生cookie被盗的情况。虽然您或我永远不会在这样的环境中操作,但可能无法阻止您的客户这样做。
如果攻击者知道你连接的是什么安全站点,那么你的浏览器可能会被欺骗,发布到同一个URL的非安全版本。在那一点上你的饼干是妥协。
这就是为什么除了httpOnlyCookies之外,您还需要指定requireSSL="true"
1
| <httpCookies httpOnlyCookies="true" requireSSL="true" /> |
我不同意鲁克的评论,因为我觉得这不公平;
@Aristos i updated my answer. But to be honest, if your using a Microsoft development platform your application will be inherently insecure. – The Rook 22 mins ago
安全不是偶然发生的,也不是"开箱即用"的,至少在我的经验中不是这样。在设计成这样之前,没有什么是安全的,不管平台或工具是什么。
在许多情况下,用于身份验证的cookie与服务器上的会话相匹配,因此不仅可以获取cookie并"登录",但是,您可能希望了解跨站点请求伪造,这允许恶意使用此cookie的机制:
http://en.wikipedia.org/wiki/cross-site_request_forgery
- 会话也与cookie连接。一个或两个cookie,将用户与会话和登录连接起来。
会话ID可以通过多种方式泄露给攻击者。XSS是劫持会话ID最常用的攻击,您应该测试应用程序中的XSS漏洞。.提高会话强度的常用方法是检查IP地址。当用户登录时,记录IP地址。检查每个请求的IP地址,如果IP发生变化,则可能是被劫持的会话。这种安全措施可以阻止合法的请求,但这是不太可能的。
不要检查x-forwarded-for或用户代理,攻击者修改这些值很简单。
我还建议在web.config文件中启用httponlycookies:
1
| <httpCookies httpOnlyCookies="true"/> |
这使得攻击者更难用JavaScript劫持会话,但仍然有可能。
- 感谢您提供的信息,但是我每次登录都会登录、检查并自动检查IP,并根据一些规则进行操作,但我需要重新考虑我的策略。我怎么会不知道ASP.NET是如何确保安全的呢?
- @亚里士多德,我更新了我的答案。但老实说,如果您使用的是Microsoft开发平台,那么您的应用程序本身就不安全。
- IP地址检查的问题是现在很多人都落后于负载均衡器,这意味着IP地址对于用户来说不稳定。
- @Rook,你能提供真实的数据来支持你的(模糊的)声明吗?
- @布鲁诺如果按严重程度对所有漏洞进行排序,您会发现微软是一个明显的领导者kb.cert.org/vuls/bymetric
- 那么拥有最多软件产品的公司拥有最多的漏洞?我认为这是常识。如果您极端地遵循这个逻辑,那么最模糊的平台必须是最安全的。默默无闻的安全?不是做出平台决策的好方法。
- @Markt您是否试图为Windows应用程序编写漏洞?您是否试图编写一个与SELinux一起使用的漏洞,例如默认的Fedora?
- @Rook:在我看来,典型的Web漏洞(如XSS)主要是独立于平台的。
- 您可能还需要添加一些有关XSRF/CSRF的详细信息。这种攻击不需要窃取认证cookie,因此也可以方便地提及这些内容。要添加,IP地址检查并不比用户代理或发送的HTTP头中的任何其他内容更安全。
- @RUSSCAM IP地址检查确实会阻止会话ID盗窃,在这里检查HTTP头中的任何内容都不会阻止任何内容,因为它们是攻击者控制的变量。CSRF确实发挥了作用,但它没有被问到,我也没有收到复选框,所以很好。在旁注中,你可以查看推荐人以停止CSRF。
- 恐怕IP地址检查并不能阻止身份验证cookie的窃取,欺骗IP地址是很简单的,另外,正如其他评论者指出的那样,IP地址可以在会话期间为使用某些ISP的用户更改。referer头很容易被欺骗,并非所有浏览器都会发送它/用户很容易关闭referer头的发送。
- @由于三路握手,RUSSCAMTCP套接字不能在开放的Internet上被欺骗。我建议你在贴上[安全]标签之前做些调查。在这里犯错误意味着有人会被黑客攻击。我很清楚负载均衡器及其对传出IP地址的影响,但在我的系统中不会这样做。
- @鲁克:一项更科学的研究将根据用户数量标准化报告的攻击数量。多发性硬化症的流行受到诅咒。当苹果电脑在边缘的时候,它是相当安全的。既然它更受欢迎,它就不那么安全了。就这样。
- @鲁克:我读到了罗斯卡姆的评论,他的观点不是说IP可以被欺骗,而是说,一个IP可以在一个会话的中间发生变化,因为没有欺骗迹象的无辜原因。我强烈建议你在回答之前要仔细阅读,尤其是当听到这样的否定语气时。谢谢您。
- @史蒂芬·苏迪特实际上删除了评论。也许你不该跟着我。微软已经好转了,但历史上是最糟糕的。他们多年来一直在IE中打开远程代码执行漏洞。向上看那只秃鹫。
- @鲁克:我用铬是有原因的。但不要自以为是:你不是唯一一个遵守安全标签的人。
- @史蒂文·苏迪特连续三次评论?阅读我的帖子并作出回应是可以的,嘲笑我的每一篇帖子是另一回事。
- @鲁克:如果你觉得我的评论是嘲弄的话,我就情不自禁了,但我会指出,在你正确的地方,我对你投了赞成票,而且没有对你投反对票。
- @史蒂文·苏迪特,谢谢你,有人给我-1是因为我是个混蛋。我不太在意。我喜欢帮助别人,我喜欢别人对我的感谢。我很乐意回答你可能提出的任何问题,或者反驳你的反驳。
- @鲁克:我保证会对你更加耐心,只要求你也这么做。
- @史蒂文·苏迪特,在安全问题上,我经常对人们很严厉。有很多误解,因为这是一个困难的话题,一个错误意味着你会被黑客攻击。这是一个学术环境,我们应该尊重我们的同龄人。如果我冒犯了你,我很抱歉。
- @鲁克:没什么好道歉的。你完全可以不同意我的意见。我只要求你诚实地努力解释分歧的根源,这样它就不会变成个人的。
我正在研究这个问题,我想出了一个主意,我不确定它是否100%安全,但这是一个主意。
我的想法是每个用户都必须通过登录页面。如果有人偷了cookie,不是通过登录页面,而是直接进入其余页面。他不能通过登录页面,因为不知道真正的密码,所以如果他通过,他还是失败了。
所以我放置了一个额外的会话值,用户成功地通过了登录页面。现在在每个关键页面中,我检查额外的会话值,如果发现它为空,我就注销并再次请求密码。
现在我不知道,也许微软已经做好了一切准备,需要更多的检查。
为了检查这个想法,我使用了这个直接让用户登录的函数。
1
| FormsAuthentication.SetAuthCookie("UserName", false); |
我的第二个安全性是检查同一个登录用户的不同IP和/或不同cookie。我有很多想法,很多支票(如果是委托书后面的,如果是来自不同国家的,什么是寻找的,我见过他多少次等等),但这是一般的想法。
这段视频正是我想要阻止的。通过使用我在这里描述的技巧,您不能只设置登录cookie。
只是分享我的想法…
- 我不知道你在说什么。可能是语言问题。
- @Steven I只是在会话数据(与登录数据不同)上放置一个标志,表明用户已通过登录页面。
- 好的,但是如果用户登录,然后他们的会话被劫持,那么标志就已经设置好了。还是我错过了什么?
- @史蒂文,他必须劫持两个不同的cookie,一个用于登录,一个用于会话。一种是只使用SSL传输。我认为破解两个不同的cookie(使用不同的代码/解码/变量方式)比破解一个更困难。这是一种将这些cookie连接在一起的方法。他不能记录和劫持会话,因为日志保留了权限的关键信息。这是为了防止有人试图破解饼干,或嗅嗅它们。
- @史蒂文,你看youtube.com/watch?v=yHic_2ram是我试图阻止的。
我不知道有问题的cookie的具体内容,但是将用户名和密码存储在用户cookie中通常是不好的做法。您通常只希望将用户名和其他非敏感信息存储在cookie中。这样,只有在登录时才会提示用户提供密码。
- 这个答案怎么了?
- @Jason,cookie的被盗和使用方式与在cookie中存储用户名和密码无关。(我不是投反对票的人)。
- 您不应该将用户名或密码存储在cookie中。使用cookie的最安全和最明智的方法是只在cookie中插入一个值,例如正确用户名的哈希、连接所用的IP地址以及一些服务器端的机密值。用用户名将这个哈希存储到数据库中,并使用它来获取正确的数据。您应该始终假设用户或其他人会篡改cookie值,如果您允许的话,他们应该是加密安全的。
- 我只是想简单地证明在cookie中存储密码一开始不是个好主意。我同意金枪鱼的说法,哈希是一个存储用户名的好主意,但我只是想传达一个简单的想法,把它们放在正确的轨道上,
- 我之所以放置+1,仅仅是因为即使cookie上的登录信息完全加密,系统也不知道密码(哈希检查),任何cookie上都没有显示任何内容,一次又一次地这样说是多么的好。
- @金枪鱼:事实上,ASP.NET这样做更安全:它存储了一个不易被猜测的任意值。此值用作在服务器端检索会话字典的查找,该字典包含有关用户的任何信息(但不包含用户的密码)。