Hijacking JSON y cómo previene ASP.NET AJAX 1.0 estos ataques.

Se han publicado algunos reportes de seguridad describiendo formas en las que los hackers podrían usar el formato de JSON usado por los frameworks de AJAX más populares para intentar lanzar ataques de cross site scripting. Concretamente, estos ataques usan peticiones HTTP GET invocados a través de HTML <script src=»» >para saltarse la política de «mismo origen» de los navegadores (que limita los objetos JavaScript como XmlHttpRequest llamando a urls en el mismo dominio desde donde fué cargada la pagina), y buscar formas para modificar el contenido de JSON.

ASP.NET AJAX 1.0 incluye un número de opciones y características activadas por defecto que le previenen de ser susceptible de este tipo de ataques JSON. Abajo tenéis algunos detalles sobre cómo se mitigan estos ataques:

Los métodos web (web methods) de ASP.NET AJAX no admiten llamadas HTTP GET por defecto.

Los archivos de script caragdos con elementos HTML <script src=»» > sólo pueden ser obtenidos con peticiones HTTP GET.

Por defecto, la capa de servicios web de ASP.NET AJAX no permite que los métodos web (web methods) sean invocados por peticiones HTTP GET. Por ejemplo, imaginemos que un desarrollador escribe un método de un servicio web como abajo:

<

p style=»background:#eeeeee;margin:0″ class=»MsoNormal»>[WebMethod]
public StockQuote[] GetQuotes(string symbol) {
}

ASP.NET sólo permitirá que el método GetQuotes sea llamado con HTTP POST, y rechazará todos los intentos que se hagan usando HTTP GET.

Para hacer que un web method ASP .NET AJAX sea llamable con un acceso HTTP GET, el desarrollador debe atribuir explícitamente cada método para que pueda ser llamado de esa forma. Usando el atributo ScriptMethod (y poniendo la propiedad UseHttpGet a true): 

[WebMethod]
[ScriptMethod(UseHttpGet
=true)]
public StockQuote[] GetQuotes(string symbol) {

Aunque esta modificación sea sencilla de hacer, requiere que el desarrollador habilite el servicio web para que funcione con el GET. Los servicios web ASP.NET AJAX nunca habilitarán eso por defecto, y la documentación de ASP.NET AJAX no recomienda que se habilite esta opción por una serie de razones .

Nota: El control «UpdatePanel» de ASP.NET AJAX,  como todos los controles que vienen con ASP.NET AJAX 1.0, no usan HTTP GET, sino que usan HTTP POST cuando hacen postbacks asíncronos.

Validación de cabeceras Content-Type en ASP.NET AJAX

Hay una capa de validación de proteccion que ASP.NET obliga para los web methods basados en ASP.NET AJAX para las peticiones GET y POST, por eso, aunque se usen llamadas HTTP, ASP.NET siempre requerirá que la cabecera HTTP Content-Type tenga el valor application/json. Si no se envía esta cabecera, ASP.NET AJAX rechazara la petición en el servidor.

Usando el web method escrito más arriba, una traza HTTP de una invocación GET de ASP.NET AJAX debe ser como esta:

GET /StockService/Stock.asmx/GetQuotes?symbol=%22msft%22 HTTP/1.1
Accept: /
Accept-Language: en-us,fr;q=0.5
Referer: http://xxxxxx/StockService/test.aspx
Content-Type: application/json; charset=utf-8
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2)
Host: xxxxxx
Proxy-Connection: Keep-Alive 

Aunque lo de arriba sea una petición GET, la pila JSON del cliente sigue insertando una cabecera HTTP Content-Type  que le dice al servidor que considere esa llamada como una petición a un servicio web AJAX. La pila de servicios web del servidor para ASP.NET AJAX 1.0 siempre chequean esta cabecera, y si no la encuentran rechazan la petición.

Si un desarrollador malicioso quiere hacer este tipo de ataque contra el servicio web, debería incluir un tag de script como el siguiente:

<script type=»text/javascript» srchttp://contoso.com/StockService/Stock.asmx/GetQuotes?symbol=msft« />   Sin embargo, los navegadores no pondrán el Content-Type con el valor application/json cuando parseen el elemento <script src=»» > y hagan la petición. Como resultado cuando ASP .NET reciba la petición hecha desde un <script />, no la reconocerán como una petición para un servicio web ASP.NET AJAX, y esto dará un error de declaración de ASP.NET que no reconocerá la url solicitada. Esto prevendrá los intentos de ataques de JSON (incluso cuando tengamos habilitado la opción GET en un servicio web).

Resumen

ASP.NET AJAX 1.0 por defecto sólo admite peticiones HTTP POST para invocar servicios web que usen JSON, lo que significa que no podemos permitir, sin darnos cuenta, que los navegadores invoquen servicios web con HTTP GET.

ASP.NET AJAX 1.0 requiere la cabecera Content-Type con el valor «application/json» para peticiones a servicios web AJAX con GET y POST. Las peticiones JSON que no contengan estas cabeceras serán rechazadas por el servidor ASP .NET. Esto significa que no podemos invocar servicios web ASP.NET AJAX con <script src=»»> ya que los navegadores no permiten añadir cabeceras content-type cuando solicitan un archivo de JavaScript como ese.

Espero que sirva,

Scott.

 Traducido por: Juan María Laó Ramos. Microsoft Student Partner.

0 comentarios sobre “Hijacking JSON y cómo previene ASP.NET AJAX 1.0 estos ataques.”

Responder a Guy Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *