2017-02-09 171 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如果这两个应用程序可以处理输入无伤害:)