O que, um comando invadiu diretamente o banco de dados!
shigen
Recentemente estudei uma ferramenta de penetração sqlMap
. É uma ferramenta popular de código aberto para automatizar ataques de injeção de SQL e testes de penetração. Ele foi projetado especificamente para detectar e explorar vulnerabilidades de injeção de SQL em aplicativos da web. SQLMap possui um rico conjunto de recursos para detectar e explorar automaticamente vulnerabilidades de injeção de SQL, obter informações confidenciais de um banco de dados e executar várias operações de banco de dados, como extrair, modificar ou excluir dados. Ele oferece suporte a uma variedade de sistemas de gerenciamento de banco de dados (DBMS), incluindo MySQL, Oracle, SQLite, Microsoft SQL Server e muito mais. Várias técnicas de injeção também são suportadas, incluindo injeção baseada em erro, injeção de consulta federada, injeção cega booleana e injeção cega temporal. Ao usar essas técnicas, ele pode descobrir e explorar automaticamente vários tipos de vulnerabilidades de injeção de SQL.
Seu endereço oficial está aqui: endereço do código sqlmap
sqlmap se conecta diretamente ao banco de dados
A seguir está um caso em que utilizo para me sqlMap
conectar ao banco de dados e obter as informações de versão do banco de dados.
python3 sqlmap.py -d 'mysql://root:[email protected]:3306/security' -f --banner
Sondando um único URL
Aqui, shigen
é escrita spring boot
uma interface , que é usada especialmente sqlMap
para testes:
@GetMapping(value = "findById2")
public Result<User> findById2(@RequestParam(value = "id", defaultValue = "1", required = false) String id) {
User user = userMapper.findById2(id);
return Result.ok(user);
}
Acredito que esse código não seja difícil de ler, minha interface é obter id
o parâmetro desse tipo de string, e consultar os dados do banco de dados para retorná-lo.
O framework ORM do banco de dados é adotado mybatis plus
, e também coloquei meu código para operar a parte do banco de dados aqui:
@Select("select * from user where id = ${id}")
User findById2(@Param("id") String id);
Acredito que parceiros cuidadosos já descobriram o problema!
Por favor, suba ao palco em seguida sqlMap
!
python3 sqlmap.py -u 'http://127.0.0.1:9000/penetration/findById2?id=20' -dbs
Testemunhe o momento do milagre
Vou direto aos meus resultados!
O console gera todos os meus bancos de dados locais e é preciso e completo! Não é assustador. A primeira vez que não acreditei muito, pensei que fosse shigen
vertigem.
Dei uma olhada nas informações geradas pelo console payload
. Seus parâmetros são: id= 2 and 5685=5685
e este é apenas um caso. sqlmap
Durante a execução, ele injetará muitas dessas where
instruções que são sempre seguidas de condições.
Este é um caso óbvio, sempre adicionando and
condições após condições, para que o SQL possa consultar os dados tanto quanto possível, provocando e sondando loucamente.
==> Preparing: select * from user where id = ?
==> Parameters: 20) AND 6535=9250 AND (2651=2651(String)
Mas --dbs
é apenas sqlMap
a ponta do iceberg de comandos ou funções, também possui estas funções poderosas:
Enumeration:
These options can be used to enumerate the back-end database
management system information, structure and data contained in the
tables
-a, --all Retrieve everything
-b, --banner Retrieve DBMS banner
--current-user Retrieve DBMS current user
--current-db Retrieve DBMS current database
--passwords Enumerate DBMS users password hashes
--dbs Enumerate DBMS databases
--tables Enumerate DBMS database tables
--columns Enumerate DBMS database table columns
--schema Enumerate DBMS schema
--dump Dump DBMS database table entries
--dump-all Dump all DBMS databases tables entries
-D DB DBMS database to enumerate
-T TBL DBMS database table(s) to enumerate
-C COL DBMS database table column(s) to enumerate
Não vou levar todo mundo para tentar um por um, vou mostrar um caso aqui --tables
: na verdade, todas as tabelas de dados do meu banco de dados local foram escaneadas, veja só, seata
as quatro tabelas!
Mais habilidades de casos de uso shigen
continuarão a ser compartilhadas, bem-vindo 评论 点赞 在看 关注
, para que você não perca muitos produtos secos!
** Mencione também silenciosamente: SQLMap é uma ferramenta poderosa, mas você precisa obedecer às leis e à ética ao usá-la. Afinal, você conhece o valor dos dados se acidentalmente se ocupar em uma agência! **Além disso, os dados estão fora do ar agora, as pessoas (serviço em nuvem) têm monitoramento, verificam os dados, as pessoas (serviço em nuvem) têm registros, não há onde se esconder!
pós-escrito
Você acha que o artigo termina aqui? Também quero compartilhar uma pergunta: como a vulnerabilidade do meu código foi descoberta e atacada diretamente no banco de dados? Não posso culpar sqlMap
muito, então os bancos de dados do mundo não são seguros, a questão é aqui ${id}
.
foco
${id}
É um método de substituição de string, que incorpora diretamente o valor do parâmetro na instrução SQL, o que apresenta riscos de segurança.#{id}
É um método de espaço reservado de parâmetro pré-compilado, o valor do parâmetro é passado através do espaço reservado e a ligação do parâmetro é realizada pelo driver de banco de dados, que é mais seguro e confiável.
Os parâmetros pré-compilados aqui são um pouco parecidos com os que aprendemos no início prepareStatement
. mybatis
Ou mybatis plus
a camada inferior é tratada assim:
- Geração de espaço reservado: MyBatis usará o nome
#{id}
do parâmetroid
e gerará espaços reservados correspondentes de acordo com os diferentes fornecedores de banco de dados. Por exemplo, para um banco de dados MySQL, os espaços reservados podem ser?
; para um banco de dados Oracle, os espaços reservados podem ser:1
, ,:2
etc. - Vinculação de parâmetro: MyBatis vinculará o valor do parâmetro ao espaço reservado gerado. Este processo é concluído pelo driver de banco de dados subjacente. O driver de banco de dados lida com esses espaços reservados usando uma instrução preparada (PreparedStatement) e vincula com segurança os valores dos parâmetros aos espaços reservados.
Portanto, muitas especificações de empresas, incluindo o Alibaba java开发手册
, estipulam claramente: o uso de placeholders #{}
.
O texto acima é todo o conteúdo de hoje, e shigen
juntos, cada dia é diferente!