Hay una aplicación ASP clásica en mi trabajo que es (creo) altamente vulnerable a la inyección de SQL. Quiero demostrar a la administración que este código no es seguro, pero todo lo que puedo hacer es insertar registros de registro "SQLINJ" en la base de datos:
Public function preventSQLInjection(lstr)
BlackList = Array("--", ";", "'", "/*", "*/", "@@", "@",_
"alter ", "begin ", "create ", "cursor ",_
"declare ", "delete ", "drop ", " end", "exec ",_
"execute ", "fetch ", "insert ", "kill ", "open ",_
"select ", "sysobjects", "syscolumns",_
"table ", "update ", "=")
preventSQLInjection = lstr
For Each s in BlackList
If ( InStr (lstr, s) <> 0 ) Then
execSqlQuery "INSERT INTO AccesLogs (datetime,ip,action,comments) VALUES ('" & formatDate(date) & " " & formatTime(time) & "','" & request.ServerVariables("REMOTE_ADDR") & "','SQLINJ','" & replace(lstr,"'","''") & "')",connectionstring
preventSQLInjection = "DONOTUSEIT"
exit for
End If
Next
end function
Según tengo entendido, el ataque más fácil sería en la propia tabla AccessLogs
, debido a que replace(lstr,"'","''")
"desinfecta" el intento de inyección de SQL y lo registra.
SÉ que este código debe descartarse y todo el ejecutable SQL debe ejecutarse con comandos y parámetros reales. Odio las cadenas concatenadas con pasión.
Quiero demostrar a la administración que la página es muy vulnerable, como, sysobjects
está en la lista negra, pero no sys.objects
, por lo que si puedo inyectar SQL ejecutable, debe ser posible obtener el esquema completo de la base de datos sin sudar. p>
¿Cómo se puede desactivar esta función de, digamos, los campos username
y password
en la página login.asp
? ¿O estoy inventando todo esto y este código es perfectamente seguro?