ASP vulnerable a SQLi por IIS

Iniciado por RicRed, 14 Febrero 2010, 03:19 AM

0 Miembros y 1 Visitante están viendo este tema.

RicRed

#10
Pero eso seria de un login no de una pagina asp normal esta bien porque se pueden ejecutar comandos por el login en las cajas de texto

Pero lo que quiero es una pagina en ASP normal como por ejemplo:

.asp?id=1 pase a .asp?id=2 y que cuando inserte como por ejemplo:

.asp?id=convert(int,@@version)--

Me devuelva error y con la version de MSSQL ETC...

Un ejemplo es este:

http://r3martinelli.com.br/telas/pagina.asp?id=1 and 1=convert(int,@@version)--

Devuelve eror y su version

Un codigo por localhost en asp

Espero me ayuden

Saludos a todos....

^Tifa^

No quisiera movilizar el tema hacia otro angulo.

Yoyahack, siempre he tenido la duda si es posible enviar una inyeccion SQL usando procedimientos almacenados dentro del motor  :rolleyes:  estaba intentando sacarle esta info a Napk pero no llegue a ninguna conclusion... y incluso se hablo de las magic quotes.. yo desconozco si es efectivo o no las magic quotes, pero me gustaria saber hacia el lado de los procedimientos almacenados dentro del motor... si pudieras conversar conmigo del tema lo apreciaria.

Un saludo  ;)

WHK

Las magic quotes no te salvan de una inyección SQL ya que depende mucho el caso de como esté construida la query y como se realiza la consulta desde el motor interpretador del lenguaje WEB y el servidor SQL.

Por ejemplo si un campo es numérico y tienes magic quotes activado o utilizas htmlentities entonces sucede esto:

Código (php) [Seleccionar]
$sql = 'select * from noticias where id = '.$_GET['id'];

En este caso no se necesitan comillas para realizar una query y sucede de forma muy similar en asp, también cuando insertas strings sin encerrarlos en comillas entonces puedes inyectar código SQL con tan solo escribir un espacio en blanco.

La función en php mysql_real_escape_string() filtra varios carácteres dependiendo de la configuración del mismo servidor y el charset por defecto:
CitarEscapes special characters in the unescaped_string , taking into account the current character set of the connection so that it is safe to place it in a mysql_query(). If binary data is to be inserted, this function must be used.

mysql_real_escape_string() calls MySQL's library function mysql_real_escape_string, which prepends backslashes to the following characters: \x00, \n, \r, \, ', " and \x1a.

This function must always (with few exceptions) be used to make data safe before sending a query to MySQL.

Magic quotes puede salvar en el caso de que el valor esté encerrado en comillas pero en el caso de ser numérico es inutil porque si le pones comillas te lanza error al buscar en una columna de tipo numérico.

http://foro.elhacker.net/nivel_web/como_evitar_la_inyeccion_sql-t252384.0.html

La inyección SQL se produce porque php envía la query en forma de string al servidor, no la estructura internamente como lo hace la clase mysqli.

No se que tipo de protecciones nativas tenga asp, supongo que debe haber alguna.

^Tifa^

Ok, mi duda radica con el procedimiento almacenado dentro de la DB sea cual sea la DB.

Tengo esta tabla por ejemplo:

Código (sql) [Seleccionar]

mysql> select * from ejemplo;
+--------------------+------+
| nombres            | id   |
+--------------------+------+
| Pepess             |    3 |
| Marta Sanchez Mina |    2 |
| Luis Sanchez       |    1 |
| Pedro Pito         |    4 |
| Pepe OR 1=1        |    1 |
+--------------------+------+
5 rows in set (0.00 sec)


Y dentro del motor creo un procedimiento almacenado para sacar datos de esta tabla:

Código (sql) [Seleccionar]

mysql> create procedure proceso(in nombre char(30), in numero integer)
    -> begin
    -> select * from ejemplo where nombres = nombre and id = numero;
    -> end;
    -> /
Query OK, 0 rows affected (0.00 sec)


Ahora intento pasarle algo al procedimiento para inyectarle codigo:

Código (sql) [Seleccionar]

mysql> call proceso('Pepess or 1=1',3);
Empty set (0.02 sec)

Query OK, 0 rows affected (0.02 sec)

mysql> call proceso('Pepess'||'or'||1=1,3);
Empty set (0.02 sec)

Query OK, 0 rows affected, 2 warnings (0.02 sec)



Sin embargo si le paso los datos que realmente existen:

Código (sql) [Seleccionar]

mysql> call proceso('Pepess',3);
+---------+------+
| nombres | id   |
+---------+------+
| Pepess  |    3 |
+---------+------+
1 row in set (0.00 sec)



Alguna sugerencia???

WHK

Digamos que tienes el procedimiento:
Código (sql) [Seleccionar]
CREATE procedure proceso(IN nombre char(30), IN perteneciente integer)
SELECT * FROM clientes WHERE nombres = nombre AND perteneciente_vendedor = numero;


Ahora tienes dos tablas, la tabla clientes y la de vendedores.
Digamos que cada vendedor puede ver los datos solamente de sus propios clientes, entonces hace algo así:
Código (sql) [Seleccionar]
$sql = "call proceso('".$_POST['user']."', 3);";

Donde 3 es el id del vendedor, entonces el vendedor con identificación 3 obtendrá todos los datos del cliente pedro de esta forma:
index.php?nombre=pedro
Si este intenta obtener los datos de un cliente que no le pertenece como vendedor entonces debería retornar un valor vacio.
En este caso se puede hacer una inyección SQL para poder obtener los datos de cualquier cliente sin la necesidad de que te pertenezca:
index.php?nombre=pablo', 1); --

Las inyecciones sql pueden ser mas dificiles porque talves el atacante ya no pueda obtener los datos desde schema u obtener datos de otras tablas pero si puede lograr bypasear sistemas de accesos.
Todo depende de la query, por ejemplo smf tiene o tenía una inyección sql en base64 donde se la variable inyectada se repetía en dos ocasiones sobre la misma query, entonces tenías que hacer que la finalización de la consulta pudiera ser compatible con el inicio de la primera sin corromper toda la query xD y tenías que adaptarte a los saltos de linea también, etc.
Cada query puede ser vulnerada, una mas que otra, siempre y cuando no estén diseñadas en el lenguaje WEB correctamente, usando (int)$var en php para valores numéricos por ejemplo ya que aunque procedimiento si distingue el valor integer eso no impide que el usuario pueda inyectar código ya que el lenguaje web envía la query al servidor mysql en formato de texto plano sin una estructura que php pueda controlar a exepción de algunas clases que si lo hacen, unas de forma mas seguras que otras pero no es la solución.

No puedes prevenir una inyección realizando procedimientos aunque si se la haces mas dificil y mas aun cuando es blind, tampoco utilizando clases que manejen la query como un objeto, una buena programación sin inyecciones sql es mas simple de lo que se cree y por eso puse el último enlace en el post anterior:

http://foro.elhacker.net/nivel_web/como_evitar_la_inyeccion_sql-t252384.0.html

Ahora en asp, cgi perl, python, etc no se que funciones tendrán para hacer querys seguras pero en php si hay y es una sola.

RicRed

Buenas a todos, no tendran un asp vulnerable a sql por localhost?

Saludos.

Ari Slash


^Tifa^

No niego que no  ;)

Pero me quedo con el procedimiento almacenado despues de evaluar de que manera se puede bypassear uno de estos... que es practicamente imposible. Sin embargo las funciones estas de escape_string y similares... hay maneras posibles de bypassearlas.

Me quedo con el procedimiento  ;)

Nakp

tifa, que no xD no hay forma de bypassear esa funcion... lo que pasa es que tienes que aplicar la funcion a absolutamente todos los datos que recibas, y... algunos ponen 15 y olvidan 1, es lo que les cuesta la owneada xD

como dije en el otro post, lo mas cómodo a nivel de código es usar las prepared statements que vienen siendo como procedimientos del lado del script (aplicable tambien a asp)
Ojo por ojo, y el mundo acabará ciego.

RicRed

Quien va a resolver mi duda.

Ayudenme por favor con mi duda, estan solucionando el tema del otro, que haga otro post con su duda, o no sabe nadie digan el que no sabe y ya


SALUDOS A TODOSSSSSSSSSSSSSSSSSSSSSSSSSS.