代码之家  ›  专栏  ›  技术社区  ›  Seva Alekseyev

强化vs DataContractJsonSerializer

  •  0
  • Seva Alekseyev  · 技术社区  · 6 年前

    运行HP Fortify对抗C#/。NET项目。将一个JSON文档从一个Web源提供给另一个Web源的行为。净的 DataContractJsonSerializer 触发Fortify中的“JSON注入”问题。

    下面的代码片段可能会导致它:

    WebClient wc = new WebClient();
    string s = wc.DownloadString(SomeURL);
    using (MemoryStream mst = new MemoryStream(Encoding.UTF8.GetBytes(s)))
        return new DataContractJsonSerializer(typeof(SomeType)).ReadObject(mst) as SomeType;
    

    Fortify这样反序列化JSON有什么问题?这个班一直在上课。现在有一段时间了。

    编辑:引用描述:

    1. 数据从不受信任的来源进入程序。

    在本例中,数据在SF中的DownloadString()处输入。cs在43号线。

    1. 数据被写入JSON流。

    在本例中,JSON由SF中的ReadObject()编写。cs在45号线。

    应用程序通常使用JSON存储数据或发送消息。什么时候 用于存储数据的JSON通常被视为缓存数据,可能会 可能包含敏感信息。用于发送消息时, JSON通常与RESTful服务结合使用,可以 用于传输身份验证等敏感信息 资格证书

    如果 应用程序从未验证的输入构造JSON。以相对的方式 在良性情况下,攻击者可能会插入无关元素 这会导致应用程序在解析JSON时引发异常 文件或请求。在更严重的情况下,例如涉及 JSON注入后,攻击者可能会插入无关元素 允许对关键业务进行可预测的操纵 JSON文档或请求中的值。在某些情况下,JSON 注入可能导致跨站点脚本或动态代码评估。

    好的,总结一下,恶意JSON的风险是:

    1. 例外情况
    2. 逻辑操作
    3. XSS或动态评估

    第一是期望的行为——如果JSON格式严重错误,应用程序就会举手停止#2是可能的,但是我如何在没有解析的情况下验证它呢#3是不可能的,因为解析逻辑不是JavaScript eval() .

    EDIT2:另一个。NET的JSON阅读器, JavaScriptSerializer ,不会导致加固错误。奇怪的

    2 回复  |  直到 6 年前
        1
  •  1
  •   Nathan Teague    6 年前

    检查是否有日期被交换,json的data contact serializer会尝试按如下方式处理日期: Date(...) 嵌入命令,而不是iso字符串

        2
  •  0
  •   Am_I_Helpful    6 年前

    对不起,我不同意你的观点 your comment :

    ->解析的风险在哪里?除非解析器是窗口。eval(),虽然不是,但没有风险。如果字符串格式不正确,解析器将抛出异常。

    这里真正的抱怨不是直接针对解析器,而是传递给解析器的值。您假设正在读取/传递的数据要么是JSON,要么不是JSON,这将导致异常(如果是后者),但是,您忽略了一个重要的点,即可能存在危险的有效JSON,这可能会影响您的程序逻辑,或者可能会导致其他严重漏洞。

    如果你能通过 Fortify's description about JSON Injection ,有一点你没有注意到:

    如果 应用程序从未验证的输入构造JSON。以相对的方式 在良性情况下,攻击者可能会插入无关元素 这会导致应用程序在解析JSON时引发异常 文件或请求。在更严重的情况下,比如 包括JSON注入, 攻击者可以插入无关的 允许对业务进行可预测操纵的要素 JSON文档或请求中的关键值 .在某些情况下, JSON 注入可能导致跨站点脚本或动态代码评估 .

    所以,在你当前的代码中, string s = wc.DownloadString(SomeURL); 是问题的潜在原因。在将其流式存储到内存中之前,您应该检查这个字符串的合理性。如上所述,在严重情况下,可以插入可能影响业务逻辑的无关元素。显然,静态代码分析器可以为您做到这一点。 你知道这里会传递什么数据,但Fortify不知道。 毕竟,Fortify是一个静态代码分析器!

    因此,如果您希望Fortify不再抱怨,请对字符串进行健全检查,例如基于JSON数据的跨站点脚本攻击测试等。如果您确定字符串将始终保持干净,则可以抑制此警告。另外,作为补充,我认为(至少对我来说)使用静态代码分析器工具遇到这些问题是显而易见的。