Ayer recibí el siguiente correo de un preocupado programador (lo de programador despistado no va dirigido a la persona que me escribió el mail 😉 ):
A pesar de haber leido mucho sobre inyección de SQL, aun son incapaz de realizar ataques decentes. Mis ataques son tan malos que hacen que mis webs parezcan seguras cuando no lo son.
Siguiendo tus consejos suelo usar autenticas paranoias en el filtrado de cadenas de entrada. Ademas de validar los tipos de todas aquellas variables que vayan a una consulta.
Ultimamente me he encontrado con un programador que me ridiculiza diciendo que él lo arregla asi de facil:
asp:
<%
function sanear
(original
)
texto=
""
cadena=
"abcdefghijklmnñopqrstuvwxyzABCDEFGHIJKLMNÑOPQRSTUVWXYZ0123456789,.':;ÁÉÍÓÚÀÈÌÒÙáéíóúàèìòùïüÏÜçÇ¡!¿?-_*+-/=)(@%ºª{[]} "
origen=original&
""
if len(origen
)>
0 then
for i=
1 to len(origen
)
letra=mid
(origen,i,
1)
if instr(cadena,letra
)>
0 then
texto=texto&letra
end if
next
end if
sanear=texto
end function
usuario=replace(sanear(request.Form("usr")),"'","")
contrasena=replace(sanear(request.Form("pass")),"'","")
set rs=con.execute("select * from usuario where usuario='"&usuario&"' and contrasena='"&contrasena&"'")
%>
La base de datos está en una intranet y es un SQL Server 2000
A mi me parece que eso es tan inseguro como no poner login. Pero no he sido capaz de crear una cadena que se salte ese filtro 🙁
Me atasco con el espacio en blanco que no esta permitido. Probé el %00, el char(32)... pero algo hago mal porque no lo logro 🙁
Necesito demostrar que eso es inseguro o seguiran usando esa mierda de validaciones en toda la aplicacion.
Puedes usar mi pregunta para un articulo si te parece oportuno, de hecho seguro que tus lectores sabrian darme una respuesta.
No hay que ser experto en ASP para darse cuenta que ese código es bastante ineficiente y le dá una falsa sensación de seguridad al que lo programó, así mismo, me parece que también demuestra su falta de experiencia en programación.
Viendo el ejemplo particular que pone, creo que no es vulnerable a inyección de SQL. ¿Ustedes qué opinan?