来自 ASP.NET MVC 站点的“无效 JSON 原语:alihack”错误

问题描述 投票:0回答:2

我们开始每天收到多个此类错误,出现在事件日志中:

无效的 JSON 原语:alihack。在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject() 在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 深度)在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(字符串 输入、Int32 深度限制、JavaScriptSerializer 序列化器)位于 System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer 序列化器、字符串输入、类型类型、Int32 深度限制)位于 System.Web.Mvc.JsonValueProviderFactory.GetDeserializedObject(ControllerContext 控制器上下文)在 System.Web.Mvc.JsonValueProviderFactory.GetValueProvider(ControllerContext 控制器上下文)在 System.Web.Mvc.ValueProviderFactoryCollection.GetValueProvider(ControllerContext 控制器上下文)在 System.Web.Mvc.ControllerBase.get_ValueProvider() 位于 System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext 控制器上下文、参数描述符(参数描述符)位于 System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext 控制器上下文,动作描述符动作描述符)在 System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass21.b__19(AsyncCallback asyncCallback,对象 asyncState) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult

1.CallBeginDelegate(AsyncCallback
  callback, Object callbackState) at
  System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase
1.Begin(AsyncCallback 回调、对象状态、Int32 超时) System.Web.Mvc.Async.AsyncControllerActionInvoker.BeginInvokeAction(ControllerContext controllerContext,字符串actionName,AsyncCallback回调,对象 状态)在 System.Web.Mvc.Controller.b__1c(AsyncCallback asyncCallback、对象 asyncState、ExecuteCoreState insideState) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncVoid
1.CallBeginDelegate(AsyncCallback
  callback, Object callbackState) at
  System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase
1.Begin(AsyncCallback 回调、对象状态、Int32 超时) System.Web.Mvc.Controller.BeginExecuteCore(AsyncCallback回调, 对象状态)在 System.Web.Mvc.Controller.b__14(AsyncCallback asyncCallback、对象回调状态、控制器控制器)位于 System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncVoid
1.CallBeginDelegate(AsyncCallback
  callback, Object callbackState) at
  System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase
1.Begin(AsyncCallback 回调、对象状态、Int32 超时) System.Web.Mvc.Controller.BeginExecute(RequestContext requestContext, AsyncCallback 回调,对象状态)位于 System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.BeginExecute(RequestContext requestContext、AsyncCallback 回调、对象状态)位于 System.Web.Mvc.MvcHandler.b__4(AsyncCallback asyncCallback、对象 asyncState、ProcessRequestState insideState) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncVoid
1.CallBeginDelegate(AsyncCallback
  callback, Object callbackState) at
  System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase
1.Begin(AsyncCallback 回调、对象状态、Int32 超时) System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext、AsyncCallback 回调、对象状态)位于 System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback 回调,对象状态)位于 System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext 上下文、AsyncCallback cb、对象 extraData) at Orchard.Mvc.Routes.ShellRoute.HttpAsyncHandler.BeginProcessRequest(HttpContext 上下文、AsyncCallback cb、对象 extraData) at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 在 System.Web.HttpApplication.ExecuteStep(IExecutionStep 步骤, 布尔值&同步完成)

请求发送至 http://example.com/ali.txt。请求的有效负载中应该有其他内容,因为简单地正确打开此 URL 会导致 404。

这是值得担心的事情吗?我可以吗,我应该阻止此类错误的发生,而是返回一个错误请求吗?为什么首先会发生这种反序列化?

asp.net iis cracking
2个回答
3
投票

此问题与 (JSON::ParserError) "{N}: 'alihack<%eval request(\"alihack.com\")%> 处出现意外标记,但针对不同的服务器 (IIS)。

如果您的网站不使用 PUT 请求,您可以使用

<requestFiltering />
简单地拒绝所有这些请求。

<configuration>
   <system.webServer>
      <security>
        <requestFiltering>
          <verbs applyToWebDAV="false">
            <add verb="PUT" allowed="false" />
          </verbs>
        </requestFiltering>
      </security>
   </system.webServer>
</configuration>

否则,可以使用url重写模块实现更优雅的解决方案(可以使用Web平台安装程序安装):

<configuration>
  <system.webServer>
    <rewrite>
      <rules>
        <rule name="Abort requests to ali.txt - alihack" patternSyntax="Wildcard" stopProcessing="true">
          <match url="ali.txt" />
          <conditions />
          <action type="AbortRequest" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

0
投票

这里存在一个更普遍的问题:当 Asp.Net MVC (.Net Framework) 接收到 JSON 内容类型的请求且其负载中没有有效的 JSON 时,它会失败并出现 500 HTTP 错误。

Asp.Net MVC 对这种情况的处理很糟糕。在这种情况下,它应该简单地回复错误请求(HTTP 400)。

不幸的是,我不知道有什么简单的方法可以解决一般情况下的不良处理问题。

© www.soinside.com 2019 - 2024. All rights reserved.