当用户点击恶意 link 时易受攻击
Vulnerable when user clicks on a malicious link
我正在尝试了解安全登录身份验证。实现登录功能的代码如下link。 (在这种情况下,使用了 guid,但在现实生活中可以采用更好的机制)
用户登录后,欢迎页面有下面的代码link来检查用户的真实性。 (这是我能找到的用于验证用户身份验证的最常见代码)
我在想一个可能会失败的场景。考虑场景
- 受害者已登录
- 受害者将在服务器上创建 2 个会话变量。前任:
会话["userLoggedin"] = "Victim"
会话["AuthToken"] = "GUID"
- 受害者将在他的浏览器中创建一个 cookie。前任:
饼干["AuthToken"] = "GUID"
- 攻击者向受害者发送恶意代码 link,对受害者的状态进行一些更改(发送好友请求、删除用户、将受害者注销……)。
让我们假设 link 如下:
www.somewebsite.com/Logout 这会注销用户。
- 受害者点击 link,获得身份验证,因为来自浏览器的 cookie,即 "GUID" 被发送到服务器并根据会话变量进行验证。
- 用户被注销
我知道上面提到的可能性没有严重影响,但是,这种情况可以避免吗?或者这甚至是一个有效的场景?我错过了什么吗?
这是我的问题
- 这种情况可以处理吗? (考虑到这是一个有效的场景)
- 我指的是安全代码吗?
- 这个漏洞是什么?
- 我该如何缓解这种情况?
在此示例中,您提到这是另一种攻击场景 (CSRF)。
CSRF 的基本含义是:攻击者代表受害者执行操作。此操作或此操作的原始请求将来自另一个站点。
要防止 CSRF,您可能需要遵循 OWASP 指南。 (https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.md)
但以你为例。假设您要保护名为 Order 的操作。
您的服务器上将生成一个令牌。然后将呈现或发送此令牌给客户端。
一个有效的请求看起来像 www.somewebsite.com/Order
和 Post 参数
Order=Something & Token="RANDOM_TOKEN"
此令牌将在执行此操作之前由服务器随后检查。
如果攻击者只是从另一个 site/domain 发起此请求,那么攻击者将无法访问此令牌,因为它是在客户端页面上呈现的。
攻击者是否有可能获得此令牌?
是的,如果应用程序容易受到 (XSS) 攻击,则有可能。
使用 JS,攻击者可以使用 JS 命令向受害者发送恶意的 link,该命令将
- 获取呈现的 CSRF 令牌。
- 使用令牌执行操作。
尽管 XSS 窃取受害者 cookie 的常见案例场景。但是,如果 cookie 被标记为 HTTPOnly
,则可能会发生 CSRF 攻击。
我正在尝试了解安全登录身份验证。实现登录功能的代码如下link。 (在这种情况下,使用了 guid,但在现实生活中可以采用更好的机制)
用户登录后,欢迎页面有下面的代码link来检查用户的真实性。 (这是我能找到的用于验证用户身份验证的最常见代码)
我在想一个可能会失败的场景。考虑场景
- 受害者已登录
- 受害者将在服务器上创建 2 个会话变量。前任: 会话["userLoggedin"] = "Victim" 会话["AuthToken"] = "GUID"
- 受害者将在他的浏览器中创建一个 cookie。前任: 饼干["AuthToken"] = "GUID"
- 攻击者向受害者发送恶意代码 link,对受害者的状态进行一些更改(发送好友请求、删除用户、将受害者注销……)。 让我们假设 link 如下: www.somewebsite.com/Logout 这会注销用户。
- 受害者点击 link,获得身份验证,因为来自浏览器的 cookie,即 "GUID" 被发送到服务器并根据会话变量进行验证。
- 用户被注销
我知道上面提到的可能性没有严重影响,但是,这种情况可以避免吗?或者这甚至是一个有效的场景?我错过了什么吗?
这是我的问题
- 这种情况可以处理吗? (考虑到这是一个有效的场景)
- 我指的是安全代码吗?
- 这个漏洞是什么?
- 我该如何缓解这种情况?
在此示例中,您提到这是另一种攻击场景 (CSRF)。
CSRF 的基本含义是:攻击者代表受害者执行操作。此操作或此操作的原始请求将来自另一个站点。
要防止 CSRF,您可能需要遵循 OWASP 指南。 (https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.md)
但以你为例。假设您要保护名为 Order 的操作。
您的服务器上将生成一个令牌。然后将呈现或发送此令牌给客户端。
一个有效的请求看起来像 www.somewebsite.com/Order
和 Post 参数
Order=Something & Token="RANDOM_TOKEN"
此令牌将在执行此操作之前由服务器随后检查。
如果攻击者只是从另一个 site/domain 发起此请求,那么攻击者将无法访问此令牌,因为它是在客户端页面上呈现的。
攻击者是否有可能获得此令牌?
是的,如果应用程序容易受到 (XSS) 攻击,则有可能。 使用 JS,攻击者可以使用 JS 命令向受害者发送恶意的 link,该命令将
- 获取呈现的 CSRF 令牌。
- 使用令牌执行操作。
尽管 XSS 窃取受害者 cookie 的常见案例场景。但是,如果 cookie 被标记为 HTTPOnly
,则可能会发生 CSRF 攻击。