【问题标题】:Server-Side Request Forgery Fortify Fix服务器端请求伪造强化修复
【发布时间】:2019-12-01 03:22:45
【问题描述】:

我正在尝试调用网络服务。此 Web 服务调用取决于用户输入的 URL。

网址如下所示:

https://someurl.com/somefunction/{userinput}

我的函数看起来像这样

public async Task<Data> GetData(string input)
{
    try
    {
        Address = BaseAddress; // https://someurl.com/somefunction/{userinput}
        Address = Address.Replace("{userinput}", input);
        ....
        WebService ws = await base.GetData(httpClient, serverIPaddress);
        ....
    }
}

我从 Fortify 收到安全错误

服务器端请求伪造(输入验证和表示,数据 流)

第 122 行的函数 GetAsync() 启动网络连接到 使用用户控制的数据作为资源 URI 的第三方系统。一个 攻击者可能利用此漏洞代表发送请求 应用程序服务器的请求,因为请求将来自 应用服务器的内部 IP 地址。

以下是建议:

建议:

不要建立基于用户控制的数据和网络连接 确保请求被发送到预期的目的地。如果 用户数据是构建目标 URI 所必需的,请使用 间接:创建用户的合法资源名称列表 允许指定,并且只允许用户从列表中选择。 使用这种方法,用户提供的输入永远不会被使用 直接指定资源名称。

在某些情况下,这种方法是不切实际的,因为 合法资源名称太大或太难跟踪。 在这些情况下,程序员经常求助于黑名单。 黑名单选择性拒绝或逃避潜在危险 使用输入之前的字符。但是,任何此类不安全的列表 字符可能是不完整的,几乎肯定会变成 过时了。更好的方法是创建字符白名单 允许出现在资源名称中并接受输入 完全由批准集中的字符组成。

此外,如果需要,请确保用户输入仅用于 指定目标系统上的资源,但 URI 方案、主机、 端口由应用程序控制。这种方式造成的损害 攻击者能够做的事情将大大减少。

但问题是我真的需要根据用户提供的数据更改{userinput}{userinput} 将是一个具有特定最大长度的字符串。 如何解决这个问题?

【问题讨论】:

  • 你能解决这个问题吗?
  • @HamzaKhanzada,最后我根据数据库验证输入,并提供从数据库返回的值以分配给用户输入。
  • 我发现另一个黑客可以在不通过数据库的情况下解决此问题。让我把它作为答案发布

标签: c# web-services fortify


【解决方案1】:

经过这么多的研究和反复尝试,我终于通过在BaseAddress 中附加输入来完成这项工作

示例代码如下所示

public async Task<Data> GetData(string input)
{
    try
    {
        var httpClient = new HttpClient();
        httpClient.BaseAddress = new Uri($"https://someurl.com/somefunction/{input}");
        var content = await httpClient.GetStringAsync("");
        return JsonConvert.DeserializeObject<Data>(content);
    }
}

【讨论】:

    猜你喜欢
    • 2021-11-17
    • 2022-08-05
    • 2021-04-17
    • 2022-07-08
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 2020-09-20
    相关资源
    最近更新 更多