Índice
1. Funções relacionadas à serialização e desserialização do Python
3. Explicação detalhada dos exemplos de métodos mágicos
Em quarto lugar, a geração de vulnerabilidades de segurança de desserialização
5. Exemplos de perguntas reais
6. CTF-CISCN Norte da China-JWT&Desserialização
Seven, ferramenta de automação de auditoria de código - bandit
1. Funções relacionadas à serialização e desserialização do Python
- pickle.dump(obj, file): salva o objeto em um arquivo após a serialização .
- pickle.load(arquivo): leia o arquivo e desserialize o conteúdo serializado no arquivo em um objeto.
- pickle.dumps(obj): Serialize o objeto em um fluxo de bytes em formato de string .
- pickle.loads(bytes_obj): Deserialize um fluxo de bytes em formato de string em um objeto.
2. Método mágico do Python
- __reduce__() : Chamado ao desserializar.
- __reduce_ex__() : Chamado ao desserializar.
- __setstate__() : Chamado ao desserializar.
- __getstate__() : Chamado ao serializar.
3. Explicação detalhada dos exemplos de métodos mágicos
< __reduzir__ >
1. Código.
2. Resultados em execução.
< __setstate__ >
1. Código.
2. Resultados em execução.
< __getstate__ >
1. Código.
2. Resultados em execução.
Em quarto lugar, a geração de vulnerabilidades de segurança de desserialização
1. Código.
2. Resultados em execução.
3. Quando alteramos o código que chama a calculadora para "ipconfig", podemos ver que o comando foi executado com sucesso ao executar o código.
4. Resumo:
O método mágico executa e chama o código a seguir. Se o código a seguir for controlável, pode haver uma vulnerabilidade de desserialização.
5. Exemplos de perguntas reais
1. Introdução ao ambiente:
Use o aplicativo da web construído pelo Python-fask para obter as informações do usuário atual e exibi-las. Ao obter as informações do usuário, desserialize os dados do usuário para obter a falha de segurança causada por isso!
2. Trechos de código.
3. Abra.
4. Ideia de ataque:
Implante o valor do usuário no cookie e o valor do usuário são os dados serializados maliciosos gerados.
5. Construa exp.
6. Execute para obter o código serializado.
7. Sabe-se no código fonte que ele irá realizar uma decodificação em base64, então precisamos codificar o código de serialização obtido acima. Faça as seguintes modificações no código.
8. Execute novamente o código serializado codificado.
9. Pegue o pacote de dados e adicione o seguinte conteúdo no pacote de dados.
10. Depois de colocar a bolsa, você pode ver que a calculadora aparece com sucesso.
6. CTF-CISCN Norte da China-JWT&Desserialização
1. Ao solicitar:
Encontre LV6 -> compre e modifique a lógica de pagamento -> modifique o valor jwt para ignorar as restrições administrativas -> explodir a chave jwt -> reorganize o valor jwt para se tornar administrador -> compre e entre no centro de membros -> código-fonte para encontrar o código-fonte de compactação de arquivo -> Código Python Nanji Deserialization -> Construir para ler o código do sinalizador para serialização e impressão -> Enviar para aquisição.
2. Local de teste:
- Ponto de teste 1: autenticação JWT
- Ponto de teste 2: desserialização de auditoria de código Python
3. Encontre e abra o ambiente do campo de tiro.
4. Após a abertura, a página é a seguinte.
5. Você pode ver que o objetivo é comprar v6.
6. Como é dividido em várias páginas, você pode usar scripts para rastrear e encontrar v6.
7. O código usado para rastreamento é mostrado na figura abaixo.
8. Você pode ver que se encontra na página 180.
9. Após clicar em Comprar, você será redirecionado para a página de login.
10. Após o cadastro, clique em Comprar novamente e você verá que passou para a página seguinte.
11. Mas depois de clicar em liquidação, ele pula para a página seguinte.
12. Isso ocorre porque nosso depósito não é suficiente para comprar v6.
13. Clicamos em Settlement novamente e capturamos o pacote.
14. Altere 0,8 (desconto) no pacote de dados acima para um número super pequeno.
15. Depois de liberar o pacote, recebi o seguinte resultado de retorno.
16. Depois de pegar novamente o pacote de dados, notamos o valor JWT no pacote de dados.
17. Colamos no site oficial e descriptografamos para obter os seguintes resultados.
18. Use um script para quebrar a chave.
19. Preencha a chave quebrada e altere o nome de usuário para admin para obter um novo valor JWT.
20. Cole no pacote de dados e coloque o pacote novamente.
21. Pode-se ver que o site foi executado com sucesso desta vez.
22. Mas quando clicamos no botão abaixo para nos tornarmos um grande membro, a página não responde.
23. Neste momento, depois de visualizar o código-fonte da página da web, você pode ver o seguinte conteúdo.
24. Depois de baixá-lo e descompactá-lo, abra-o e você poderá ver o seguinte conteúdo.
25. Pode-se saber que é o código original do site, vamos analisá-lo após abri-lo.
26. Usamos diretamente a função de pesquisa para pesquisar conteúdo relacionado à serialização.
27. Após o posicionamento, você pode ver a função que chama a serialização.
28. Após a análise, sabe-se que é codificado por python2, então usamos python para construir a carga útil.
29. Após a execução, você pode ver que a carga foi construída com sucesso.
30. Altere o valor para a carga útil que acabamos de gerar.
31. Depois de mudar, clique em um botão novamente para se tornar um membro grande e você verá que a bandeira foi obtida com sucesso.
Seven, ferramenta de automação de auditoria de código - bandit
1. Referência:
Plug-ins de teste — Documentação do Bandit
2. Instalação: pip install bandit
- linux
Após a instalação, ele estará no diretório bin atual do Python
Use: bandit -r Diretório do código-fonte a ser auditado
- janelas
Após a instalação, o script estará no diretório Python atual
Use: bandit -r diretório do código-fonte a ser auditado
3. Exemplos práticos.