2017-02-09 14 views
0

basicHttpエンドポイントが公開されているWCFサービスがあります。この問題は、サービスがスクリプトタグを含む文字列を受け取り、それを消費するWebアプリケーションで直接使用されたときにXSS攻撃を引き起こすスクリプトタグを含む文字列を返すというPENテストで報告されています。WCFコールでのXSS攻撃の防止

私ができることは、すべての操作の実装では、文字列のスクリプトを証明するコードを書くことです。しかし、スクリプトタグからWCF呼び出し内のすべての受信文字列を消去するためのコードを書くことができるように、簡単で効率的な方法があります。

私がAkshay<script>alert('hi');</script>を提出すれば、ユーザー名と住所を取るAddUser操作では、スクリプトタグを削除するだけです。

ので、現在それがAkshay<script>alert('hi');</script>を返しているが、あなたはあなた自身の操作の呼び出しを実装することができAkshayalert('hi');

答えて

1

のようなものを返すことが期待されます。

public class CleanOperationInvoker:IOperationInvoker 
{ 
    private readonly IOperationInvoker _invoker; 
    public CacheOperationInvoker(IOperationInvoker invoker) 
    { 
     _invoker = invoker; 
    } 

    public object Invoke(object instance, object[] inputs, out object[] outputs) 
    { 
     inputs = CleanInputs(inputs); 
     return _invoker.Invoke(instance, inputs, out outputs); 
    } 

    private static object[] CleanInputs(object[] inputs) 
    { 
     for(int i = 0; i < inputs.Length;i++) 
     { 
      var str = inputs[i] as string; 
      if(!string.IsNullOrEmpty(str)) 
       inputs[i] = StripHTML(str); 
     } 
     return inputs; 
    } 

    public static string StripHTML(string input) 
    { 
     return Regex.Replace(input, "<.*?>", String.Empty); 
    } 
} 

次に動作を実装:

public class CleanOperationBehavior: Attribute, IOperationBehavior 
{ 
    public void ApplyDispatchBehavior(OperationDescription operationDescription, System.ServiceModel.Dispatcher.DispatchOperation dispatchOperation) 
    { 
     //Putting ourself in between dispatching invoker 
     dispatchOperation.Invoker = new CleanOperationInvoker(dispatchOperation.Invoker); 
    } 
} 

それからちょうどこのように使用してください:

[ServiceContract] 
public interface IHackMeService 
{ 
    [OperationContract] 
    [CleanOperationBehavior] 
    int Get(string hack, string me, int beach); 
} 

エンドポイントの動作を実装して、すべての契約のすべての操作にアタッチすることができます。ところで、この方法では、無効な文字列が含まれている場合でも操作を拒否することができます。例外や何かを投げてください。

私はそれを編集していないので、あなたが何か誤りがあった場合、あなたに教えてください。私は私の答えを更新します。

+0

こんにちはeocron、 私はあなたの答えを実装しているが、私は「CleanOperationInvoker」クラス、エラーで2つのエラーを得ました以下の通りです。 1)CacheOperationInvoker:メソッドの戻り値の型が である必要があります。2)読み取​​り専用フィールドを割り当てることができません。 あなたはそれを調べて答えを更新してください、私は緊急にそれを必要としますか? ありがとう! –

+0

こんにちはeocron、エンドポイントの動作を実装するためのコードを私に提供して、すべての契約のすべての操作にそれを添付できますか? –

0

実際のターゲット操作に先立って、すべての入出力要求を傍受することができるwcfのために、いわゆるmessage interceptorがあります。すべての操作に注釈を付けずにメッセージを検証する場合は、完璧な実装です。あなたのサービスを実装して接続するのはかなり簡単です。

このPENtestの検索結果は、サービスの再利用可能性だけでなく、結果を消費するアプリもあります。

注:両方のアプリは害なしで入力を処理できるかどう時々侵入テストの結果がspecialyな偽陽性の可能性があり:)