我有一个WCF服务,它暴露了basicHttp端点。在PEN测试中报告该问题,该服务接受包含脚本标记的字符串,并返回带有脚本标记的字符串,当直接在使用它的Web应用程序中使用时会导致XSS攻击。
我能做的就是在每个操作实现中编写一个代码来使字符串脚本得到证明。但是有没有简单/有效的方法,以便我可以编写单个代码来清除脚本标记中WCF调用中的所有传入字符串。
e.g。在使用用户名和地址的AddUser操作中,如果我提交Akshay<script>alert('hi');</script>
,则操作应该删除脚本标记。
目前它正在返回Akshay<script>alert('hi');</script>
,但预计会返回Akshayalert('hi');
答案 0 :(得分: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);
}
或者您可以实施端点行为并将其附加到所有合同上的所有操作中。这样,顺便说一下,如果包含无效字符串,您甚至可以拒绝操作。只是抛出异常或其他东西。
我没有编译它,所以如果你遇到任何错误,你可以告诉我,我会更新我的答案。
答案 1 :(得分:0)
对于wcf,有一个所谓的message interceptor,您可以在实际目标操作之前拦截每个输入和传出请求。如果您想要在不注释每个操作的情况下验证消息,那么它是完美的实现。它很容易实现并且可以与您的服务相连接。
此PENtest发现不仅是您的服务的可靠性,还是将消耗结果的应用程序。
注意:如果两个应用都可以无损地处理输入,有时PENtest结果可能是误报:)