2016-09-19 79 views
5

this鏈接,在備註部分提到「TypeNameHandling should be used with caution when your application deserializes JSON from an external source. Incoming types should be validated with a custom SerializationBinder when deserializing with a value other than TypeNameHandling.None.」。如果使用TypeNameHandling.All進行序列化/反序列化,那麼外部源的JSON會有什麼危害?一個工作示例將不勝感激。TypeNameHandling在Newtonsoft Json中謹慎

回答

10

當使用TypeNameHandling.All反序列化並且沒有Seri​​alizationBinder檢查時,json.net將嘗試創建一個類型的實例,該類型作爲JSON中的元數據。

public class Car 
{ 
    public string Maker { get; set; } 
    public string Model { get; set; } 
} 

{ 
    "$type": "Car", 
    "Maker": "Ford", 
    "Model": "Explorer" 
} //create a Car and set property values 

但攻擊者可以發送您危險的類型存在於你的代碼或框架。

即從hereSystem.CodeDom.Compiler.TempFileCollection是一個可序列化的類,其目的是維護由編譯過程產生的臨時文件列表,並在不再需要時刪除它們。爲了確保文件被刪除,類實現了一個終結器,當垃圾收集器正在清理對象時將會調用這個終結器。攻擊者可以構建這個類的序列化版本,將其內部文件集合指向受害者系統上的任何文件。這將在反序列化之後的某個點被刪除,而沒有任何來自反序列化應用程序的交互。

[Serializable] 
    public class TempFileCollection 
    { 
     private Hashtable files; 
     // Other stuff... 

     ~TempFileCollection() 
     { 
     if (KeepFiles) {return} 
     foreach (string file in files.Keys) 
     { 
      File.Delete(file); 
     } 
     } 
    } 

    { 
     "$type": "System.CodeDom.Compiler.TempFileCollection", 
     "BasePath": "%SYSTEMDRIVE", 
     "KeepFiles": "False", 
     "TempDir": "%SYSTEMROOT%" 
    } // or something like this, I just guessing but you got the idea 
+0

如需更多信息,請參見[如何配置Json.NET創建一個漏洞的Web API(https://www.alphabot.com/security/blog/2017/net/How-to-configure-Json .NET到創造 - 一個脆弱的web-API.html)。 – dbc

+0

還有AlvaroMuñoz&Oleksandr Mirosh的黑帽紙https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf – dbc

0

一些額外的攻擊工具已經在阿爾瓦羅·穆尼奧斯&阿列克Mirosh的黑帽紙https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf被確定。它們是:

  • System.Configuration.Install.AssemblyInstaller - 攻擊矢量:在裝配負載上執行有效負載。

  • System.Activities.Presentation.WorkflowDesigner - 攻擊向量:在解析Xaml有效載荷時執行靜態方法。攻擊向量:攻擊者向受控服務器發送帶有URL的有效載荷,該服務器響應Xaml有效載荷和目標服務器在解析Xaml有效載荷期間執行期望的靜態方法。 1)調用任何解組對象的方法; 2)調用任何解組對象的方法; 2)調用任何解組對象的方法; 2)調用任何解組對象的方法; 2)調用任何解組對象的方法; 2)我們可以用受控參數調用所需類型的參數化構造函數; 3)調用任何公共方法,包括具有受控參數的靜態方法。

  • System.Windows.Forms.BindingSource - 攻擊矢量:任意的getter調用。

  • Microsoft.Exchange.Management.SystemManager.WinForms.ExchangeSettingsProvider - 攻擊矢量:它允許從setter跳轉到嵌套的BinaryFormatter反序列化。