web-dev-qa-db-ja.com

.NETでJsonインジェクションを強化する

Json文字列を逆シリアル化するためにNewtonsoft.Jsonを使用していますが、未検証のjsonを使用しているとfortifyが文句を言いました。次に、Newtonsoft.Json.Schemaを使用してチェックを追加しましたが、さらに文句を言うようになりました

var schema = JsonSchema.Parse(JsonConvert.SerializeObject(typeof(T)));
JToken token = JArray.Parse(json); -- Vulnerability
IList<string> errors;
if (token.IsValid(schema, out errors))
{
    return JsonConvert.DeserializeObject<T>(json); -- Vulnerability
}

Json文字列を検証する方法に関するアドバイスはありますか?

の23行目で、メソッドDeserializeObject()は未検証の入力をJSONに書き込みます。この呼び出しにより、攻撃者は任意の要素または属性をJSONエンティティに挿入できる可能性があります。

7
Ash

応答が遅れたことをお詫びします。私はなんとか要塞を修正/欺くことができました。これが修正です

byte[] jsonBytes = Encoding.UTF8.GetBytes(json);
using (var stream = new MemoryStream(jsonBytes))
{
    output = Deserialize<List<T>>(stream);
}

 public TResult Deserialize<TResult>(Stream responseStream)
    {
        using (var sr = new StreamReader(responseStream))
        {
            using (var reader = new JsonTextReader(sr))
            {
                var serializer = new JsonSerializer
                {
                    MissingMemberHandling =
                        EnforceMissingMemberHandling ? MissingMemberHandling.Error : MissingMemberHandling.Ignore,
                    NullValueHandling = IgnoreNullValues ? NullValueHandling.Ignore : NullValueHandling.Include
                };

                return serializer.Deserialize<TResult>(reader);
            }
        }
    }

これが誰かを助けることを願っています

11
Ash

あなたの場合、Fortifyは、信頼できないソースからjsonを使用していると文句を言っているようです。これは、 Fortifyのドキュメント で述べられていることです。

アプリケーションが未検証の入力からJSONを構築する場合、JSONドキュメントとメッセージのセマンティクスを変更できます。比較的害のないケースでは、攻撃者は、JSONドキュメントまたはリクエストの解析中にアプリケーションが例外をスローする原因となる無関係な要素を挿入できる可能性があります。 JSONインジェクションを含むようなより深刻なケースでは、攻撃者は、JSONドキュメントまたはリクエスト内のビジネスクリティカルな値の予測可能な操作を可能にする無関係な要素を挿入できる可能性があります。

所有しているWebサービスからjsonを受け取った場合は、Fortifyの警告を無視できます。ただし、入力でJArray.Parse()を呼び出しており、それが有効な配列であると想定していることに注意してください。そうでない場合は、JsonReaderExceptionを取得します。また、JSONをスキーマに対して実際に検証するわけではありません。JSONスキーマを指定する方法については、 JSON.NETの例 を参照してください。

正直なところ、FortifyがサードパーティのWebサービスから受信したJSONを検証することをどのように期待するかを知りたいと思います。

4
oldbam

誰かがまだ解決策を探しているなら、私は次のことをしました、そしてそれは期待通りに働いているようです。

1オンラインツールを使用してJSONサンプルを取得し、スキーマを推測します。

2 JSONを解析または逆シリアル化する前に、JSONを検証するための別のメソッドを追加します。

3スキーマを使用してJSONを検証した後、通常の操作に進みます。

1
Arun662469