【问题标题】:Prevent XSS attacks in WCF calls防止 WCF 调用中的 XSS 攻击
【发布时间】:2017-02-09 07:49:19
【问题描述】:

我有一个暴露了 basicHttp 端点的 WCF 服务。在 PEN 测试中报告了该问题,该服务接受包含脚本标签的字符串并返回带有脚本标签的字符串,当直接在使用它的 Web 应用程序中使用时会导致 XSS 攻击。

我能做的是在每个操作实现中编写一个代码来证明字符串脚本。但是有什么简单/有效的方法可以让我编写一个代码来清除来自脚本标签的 WCF 调用中的所有传入字符串。

例如在接受用户名和地址的 AddUser 操作中,如果我提交Akshay<script>alert('hi');</script>,则该操作应该删除脚本标签。

所以目前它正在返回Akshay<script>alert('hi');</script>,但预计会返回类似Akshayalert('hi');的东西

【问题讨论】:

    标签: c# wcf security xss


    【解决方案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);
    }
    

    或者您可以实现端点行为并将其附加到您对所有合约的所有操作中。这样,顺便说一句,如果它包含无效字符串,您甚至可以拒绝操作。只是抛出异常或其他东西。

    我还没有编译,所以如果你遇到任何错误,你可以告诉我,我会更新我的答案。

    【讨论】:

    • 嗨 eocron,我已经实现了你的答案,但我在“CleanOperationInvoker”类中遇到了两个错误,错误如下。 1) CacheOperationInvoker:方法必须有返回类型 2) 只读字段不能分配给您能否查看并更新您的答案,我迫切需要它。谢谢!
    • 嗨 eocron,您能否提供我实现端点行为的代码并将其附加到您对所有合约的所有操作中?
    【解决方案2】:

    wcf 有所谓的message interceptor,您可以在其中拦截每个传入和传出的请求,然后再进行实际的目标操作。如果您想在不注释每个操作的情况下验证消息,这是完美的实现。它很容易实现和连接您的服务。

    这个 PENtest 发现不仅是您的服务的责任,也是将使用结果的应用程序的责任。

    注意:有时 PENtest 结果可能是误报,特别是如果两个应用程序都可以处理输入而不会造成伤害:)

    【讨论】:

      猜你喜欢
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-16
      • 2023-03-04
      • 1970-01-01
      相关资源
      最近更新 更多