【问题标题】:How to Protect API from Domain Manipulation in Hosts File?如何保护 API 免受主机文件中的域操纵?
【发布时间】:2022-11-15 17:44:15
【问题描述】:

我想知道在绕过 HTTP 中的 CORS 和/或引荐来源网址检查时,由于缺乏更好的术语,“域操作”是否是真实的。

现在我们的团队正在开发一个公共信息站点,该站点可以从我们的 SQL Server 数据库中动态提取内容。没有登录;从技术上讲,所有用户都是“匿名的”。

该站点本身是静态 HTML、CSS 和 jQuery,但在 .NET 项目/应用程序 (IIS 10.0) 中运行。为获取内容数据而调用的 API 在分离.NET Web API 应用程序和应用程序池。

我们正在使用机器对机器的 JWT 身份验证从站点访问 API;对于使用的每个 API,每次回收/启动应用程序池时,都会向我们的 Auth0 租户发送一个新的令牌请求,返回一个 access_token 并存储在 Application 变量中。这对我们很有效。

'from Application_Start in global.asax.vb ("apiHlpr" is a custom class):

        '. . .
        For Each apiName As String In apiNameList    '<-- pulls specific keys from <appSettings>
            Dim tkn As String = apiHlpr.GetSignedJWT(apiName, clientID, clientSec) 
            tkn = "Bearer " & tkn
            Application.Add("keyPrefix_" & apiName, tkn)
        Next

为了进一步加强访问限制,我们使用 Web 服务对令牌进行加密,然后将令牌通过请求标头传递给 API……

'snippet from our asmx webservice ("ourLibrary" is a custom class library):

    <WebMethod()>
    Public Function tkn(ByVal name As String) As Object
        Dim authBearer As String = HttpContext.Current.Application("keyPrefix_" & name).ToString.Trim()
        Dim strHlpr As New ourLibrary.StringHelper      
        authBearer = strHlpr.EncryptString(authBearer) 
        Dim token As New With {
            .bearer = authBearer
        }
        Return token
    End Function

...首先检查 HttpContext.Current.Request.UrlReferrer 是否以我们网站的域开头;如果是,则令牌在服务器端解密,然后进行验证。这也很有效。

'snippet from our API's controller ("strHlpr" and "apiHlpr" are custom classes):

        Dim token As String = auth.BearerToken()

        If auth.ValidReferrer(HttpContext.Current.Request.UrlReferrer) Then
            token = strHlpr.DecryptString(token)
        End If

        Dim status As String = apiHlpr.ValidateToken(token)
        
        '''proceed with validation and retrieve data if validated...
'from auth.vb:

    Public Function ValidReferrer(ByVal ref As Uri) As Boolean
        If Not IsNothing(ref) Then
            Dim str As String = ref.ToString
            Dim domain As String = AppSettings("DOMAINGOESHERE").Trim()
            If str.ToLower.StartsWith(domain) Then
                Return True
            Else
                Return False
            End If
        Else
            Return False
        End If
    End Function

结果:

  • 当从站点调用 API 时,内容被成功检索,并且...
  • 进入浏览器的网络选项卡尝试抓取access_token,用户将看到加密的字符串而不是未加密的令牌
  • 当尝试直接转到 API 请求 url 时,无论是通过不同域中的超链接、直接复制粘贴输入到浏览器中,还是通过 Postman(尝试将加密字符串粘贴到“授权”标头中),a返回 401(未授权)错误——这当然很好。

然而...如果我们要推进这项技术,和/或实施 CORS,我们会遇到一个棘手的问题,到目前为止,我在所有搜索中都没有看到完整的答案:

是什么阻止某人创建自己的带有 API 网址链接的页面,然后自定义他们的本地主机文件,以便他们的页面具有我们站点的域,从而通过他们的“虚拟页面”访问我们的数据?

【问题讨论】:

    标签: .net api jwt cors referrer


    【解决方案1】:

    如果您在 Hosts 文件中进行“域操作”其他人的电脑- 或者在共享计算机上 - 然后您可以使用他们的凭据和特权进行攻击。

    但是在您自己的计算机上的主机文件中进行域操作不会让您访问您尚不具备的特权或凭据。

    如果您在 trusted.example.com 没有凭据或权限,但您更改了自己的 Hosts 文件以使您的计算机认为其他站点是 trusted.example.com,那么您仍然无法访问任何凭据或权限真实的trusted.example.com

    CORS 对于一个人在一台计算机上进行域操作并不脆弱。仅仅通过在您自己的计算机上进行域操作是不可能做很多邪恶的事情的。

    还要考虑要执行问题中描述的操作,您甚至不需要管理员权限来更改主机文件;相反,您可以克隆 Chrome 或 Safari 或 Firefox 的源代码并更改它并构建一个浏览器版本,使其认为它正在运行来自 trusted.example.com 的受信任代码,而实际上它实际上正在运行来自 evil.example.com 的代码。

    但是,如果您实际上在 trusted.example.com 上没有凭据或权限,那么被黑客入侵的浏览器不会让您访问这些凭据和权限。

    为了能够使用这种被黑客入侵的浏览器进行攻击,您需要将该浏览器安装到另一台计算机上,该计算机正被拥有trusted.example.com 凭据和权限的人使用——否则,我想,以某种方式欺骗他们坐下在您的计算机上打开并导航到trusted.example.com 并登录等。

    所以一般来说,如果一个人故意通过“域操纵”来混淆自己的计算机,就像问题所描述的那样,那么现实世界中就不会发生 CORS 攻击。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-16
      • 1970-01-01
      • 1970-01-01
      • 2014-12-02
      相关资源
      最近更新 更多