2017-02-09 170 views
0

我有一個WCF服務,它具有基本的Http端點公開。在PEN測試中報告的問題是,服務接受包含腳本標記的字符串,並返回帶有腳本標記的字符串,當直接在使用它的Web應用程序中使用時,會導致XSS攻擊。防止WCF調用中的XSS攻擊

我可以做的是在每個操作實現中編寫一個代碼來使字符串腳本證明。但是有沒有簡單/有效的方法,以便我可以編寫單個代碼來清理WCF調用中來自腳本標記的所有傳入字符串。

例如在需要用戶名和地址的AddUser操作中,如果我提交Akshay<script>alert('hi');</script>,操作只是刪除腳本標籤。

所以目前它返回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」類,錯誤有兩個錯誤在下面。 1)CacheOperationInvoker:方法必須有返回類型 2)只讀字段不能分配到 請你看看它並更新你的答案,我急需它。 謝謝! –

+0

您好,eocron,您能否給我提供實現端點行爲的代碼,並將其附加到所有合同上的所有操作中? –

0

對於wcf,所謂的message interceptor可以在實際的目標操作之前攔截每個輸入和輸出的請求。如果您想驗證消息而不註釋每個操作,那麼這是完美的實現。實現並連接您的服務非常簡單。

此PENtest發現不僅是您的服務的可重複性,而且還會消耗結果的應用程序。

注:有時PENtest結果可能是假陽性specialy如果這兩個應用程序可以處理輸入無傷害:)