O que, um comando invadiu diretamente o banco de dados!

O que, um comando invadiu diretamente o banco de dados!

sqlMap

shigenRecentemente 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 sqlMapconectar 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

sqlmap se conecta diretamente ao banco de dados

Sondando um único URL

Aqui, shigené escrita spring bootuma interface , que é usada especialmente sqlMappara 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 ido 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!

obter todos os dbs

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 shigenvertigem.

Dei uma olhada nas informações geradas pelo console payload. Seus parâmetros são: id= 2 and 5685=5685e este é apenas um caso. sqlmapDurante a execução, ele injetará muitas dessas whereinstruções que são sempre seguidas de condições.

detecção de URL

Este é um caso óbvio, sempre adicionando andcondiçõ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 sqlMapa 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ó, seataas quatro tabelas!

obter todas as estruturas da tabela

Mais habilidades de casos de uso shigencontinuarã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 sqlMapmuito, 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. mybatisOu mybatis plusa camada inferior é tratada assim:

  1. Geração de espaço reservado: MyBatis usará o nome #{id}do parâmetro ide 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, , :2etc.
  2. 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 shigenjuntos, cada dia é diferente!

Acho que você gosta

Origin blog.csdn.net/weixin_55768452/article/details/132536861
Recomendado
Clasificación