¿Hay alguna forma de realizar una inyección de SQL utilizando solo la sintaxis de Scala (sin importar Java)? Por lo que he visto en línea, todos los ejemplos (como esto ) se basaron en importar cosas de Java y luego usarlas para la inyección.
El código de Scala es vulnerable a SQLi cuando usa Slick con #$
para insertar directamente su literal en el SQL:
NO SEGURO
def slickInterpolationInsert(firstName: String, lastName: String, email: String, password: String) = db.withSession {
implicit session: Session =>
sqlu"insert into users (first_name, last_name, email, password) values (#$firstName, #$lastName, #$email, #$password)".execute
}
La forma segura sería:
SAFE
def slickInterpolationInsert(firstName: String, lastName: String, email: String, password: String) = db.withSession {
implicit session: Session =>
sqlu"insert into users (first_name, last_name, email, password) values ($firstName, $lastName, $email, $password)".execute
}
Otra forma insegura sería usando la clase StaticQuery:
NO SEGURO
def slickStaticQuery(email: String) = db.withSession { implicit session: Session =>
(StaticQuery.u + "update users set first_name = 'buddy' where email = '" + email + "'").execute
}
La forma segura sería:
SAFE
def slickStaticQueryBindVariables(email: String) = db.withSession { implicit session: Session =>
val query = StaticQuery[String, String] + "select email from users where email = ? "
query(email)
}
Respuestas tomadas de: enlace
Creo que estás confundiendo dos cosas:
La página de ejemplo a la que te vinculas tiene un código Java del tipo # 1 y usa el programa SQLMap (escrito en Python) para el tipo # 2 . Parece que estás preguntando por el tipo # 2, pero vamos a revisarlos uno por uno.
# 1: el código vulnerable al ataque de inyección SQL
El código en # 1 podría estar escrito en cualquier idioma; para una amplia gama de ejemplos (pero no Scala), consulte este sitio . Si, por algún motivo, desea escribir un código vulnerable en Scala, esto podría hacerse (aunque no considero un motivo por el cual querría hacerlo).
Primero necesitas conectarte a una base de datos. No soy programador de Scala, pero tengo entendido que esto generalmente se hace con JDBC e importando algunas bibliotecas de Java, por lo que esto romperá la regla de "no importar ningún Java". Esta página le ofrece un buen recorrido.
Entonces necesitas introducir una vulnerabilidad. Esto se hace (generalmente de manera no intencionada) mediante la concatenación de datos no confiables (es decir, datos del usuario, como los valores ingresados en un formulario HTML) en una expresión SQL. Veamos un caso de una secuencia de comandos de inicio de sesión donde los datos que no son de confianza son username
y password
:
//Warning! This is code deliberately made vulnerable to SQL injection.
val sql = "SELECT * FROM users WHERE username = '" + username +
"' AND password = '" + password + "'"
val resultSet = statement.executeQuery(sql)
Aquí es donde puede tener lugar la inyección real: considere qué pasaría si la variable password
tuviera el valor ' OR '1' = '1
.
# 2: la cosa que ejecuta el ataque de inyección SQL
El número # 2 es (generalmente) algo que envía solicitudes HTTP diseñadas con el vector de ataque (como ' OR '1' = '1
) en ellas. Podría escribir un programa que lo haga en cualquier idioma, pero también podría usar un programa existente que envíe solicitudes HTTP. El programa más común es, por sorpresa, un navegador web. La forma más sencilla de probar las vulnerabilidades obvias de SQLi es simplemente ingresar el vector de ataque en un formulario (es decir, ' OR '1' = '1
en el campo de la contraseña), presionar enter y ver qué ocurre.
Si desea automatizar esto, puede escribir un programa en Scala. No le proporcionaré ningún código para esto, pero esta pregunta sobre Desbordamiento de pila debería le ayuda a ponerse en marcha con el envío de solicitudes HTTP con Scala.
Lea otras preguntas en las etiquetas sql-injection