Skip to content

Latest commit

 

History

History
98 lines (66 loc) · 4.71 KB

File metadata and controls

98 lines (66 loc) · 4.71 KB

6.4 Prevenir hijack de la sesión

El secuestro de la sesión es es un problema grave de seguridad que nos amenaza. Los clientes utilizan el identificador de sesión para comunicarse con el servidor, y podemos fácilmente averiguar cuál es el identificador de sesión cuando hacemos un seguimiento de las comunicaciones, que son utilizadas por los atacantes.

En esta sección, vamos a mostrarte cómo secuestrar (hijack) la sesión con el fin de ayudarle a entender más acerca de la sesión.

Proceso de secuestro de sesión

El código siguiente es un contador para la variable count:

	func count(w http.ResponseWriter, r *http.Request) {
	    sess := globalSessions.SessionStart(w, r)
	    ct := sess.Get("countnum")
	    if ct == nil {
	        sess.Set("countnum", 1)
	    } else {
	        sess.Set("countnum", (ct.(int) + 1))
	    }
	    t, _ := template.ParseFiles("count.gtpl")
	    w.Header().Set("Content-Type", "text/html")
	    t.Execute(w, sess.Get("countnum"))
	}

El contenido de count.gtpl es el siguiente:

Hi. Now count:{{.}}

A continuación, podemos ver el siguiente contenido en el navegador:

Figure 6.4 count en el navegador.

Refresque hasta que el número se convierte en 6, y vamos a abrir el gestor de cookies (yo uso chrome aquí), usted debe ver la siguiente información:

Figure 6.5 cookies que son guardadas en el navegador.

Este paso es muy importante: abra otro navegador (yo uso firefox aquí), copie la URL a el nuevo navegador, y el simulador de cokies abierto para crear una nueva cookie de entrada exactamente con el mismo valor de la cokie que vimos.

Figure 6.6 Simulador de cookies.

Actualice la página, y verá:

Figure 6.7 sucedio el secuestro de la sesion.

Aquí vemos que podemos secuestrar la sesión entre diferentes navegadores, y lo mismo sucederá en diferentes computadoras. Si hace clic en Firefox y Chrome, a su vez, verá que en realidad modifican el mismo mostrador. Debido a que HTTP no tiene estado, así que no hay manera de saber que identificador de sesión simula firefox, y chrome no es capaz de conocer que su identificador de sesión ha sido secuestrado.

Prevenir el secuestro de la sesión

Solo cookies y el token

Mediante el sencillo ejemplo de el secuestro de sesión, usted debe saber que es muy peligroso, porque los atacantes pueden hacer lo que quieran. Entonces, ¿cómo podemos evitar el secuestro de la sesión?

El primer paso es establecer identificador de sesión sólo en la cookie, en vez de en la reescritura de URL, y establecer la propiedad httponly de la cookies como true para restringir el script del cliente para tener acceso al identificador de sesión. Así la cookie no se puede acceder por XSS y no es tan fácil como se mostró el obtener el id de sesión con el administrador de cookies.

El segundo paso es añadir un token en toda solicitud, como nos ocupamos de forma repetida en los apartados anteriores, se añade un campo oculto que contiene el token, y verificamos este símbolo para demostrar que la solicitud es única.

	h := md5.New()
	salt:="astaxie%^7&8888"
	io.WriteString(h,salt+time.Now().String())
	token:=fmt.Sprintf("%x",h.Sum(nil))
	if r.Form["token"]!=token{
	    // ask to log in
	}
	sess.Set("token",token)

Timeout del ID de sesion

Otra solución es agregar un tiempo al crear cada sesión, y eliminar el identificador de sesión cuando a caducado y crear una nueva. Esto puede evitar el secuestro de la sesión en algún momento.

	createtime := sess.Get("createtime")
	if createtime == nil {
	    sess.Set("createtime", time.Now().Unix())
	} else if (createtime.(int64) + 60) < (time.Now().Unix()) {
	    globalSessions.SessionDestroy(w, r)
	    sess = globalSessions.SessionStart(w, r)
	}

Hemos establecido un valor para ahorrar el tiempo de crear y comprobar si está caducado (puse 60 segundos aquí), este paso puede evitar muchos secuestros de sesiones.

Combinar estas dos soluciones, puede evitar la mayor parte de el secuestro de sesiones en sus aplicaciones web. En un lado, los cambios en el identificador de la sesión y frecuentemente el atacante siempre consigue un caducada e inútil Identificación de sesiones; por el otro lado, nos propusimos que el id de sesión sólo se pueda pasar a través de las cookies y las cookies es httponly, así que todos los ataques basados ​​en la URL no funcionan. Finalmente, pusimos el MaxAge = 0 lo que significa que identificador de sesión no se guardará en el historial de los navegadores.

Enlaces