Injeção de SQL-3

1. Por que devemos entender esse conhecimento

2. Princípio

3. Compreensão e prática próprias

4. Caixa do título do CTF





A seguinte declaração pode dizer que não é muito amigável, por isso por favor, comente se palavras sensíveis I, o autor mudaria


diária Tucao: lote de injeção SQL de conhecimento, então eu cabeça dói, mas eu também descobriu que na verdade aprendendo lentamente sql não penso assim Difícil, apenas pensando um pouco aberto, não pode ser limitado, e aprender a injeção de sql realmente não é ansioso.Eu acho que eu aprendi a injeção de sql é realmente ansioso.Não tentei depois de assistir ao vídeo. Não, você pode realmente ir para Du Niang. Agora muitos figurões compartilham esse conhecimento, para que você possa aprender devagar e não coma tofu quente.


Por que devemos entender esse conhecimento

Hoje vou falar sobre os tipos de injeção comuns na injeção de sql: injeção de erro, injeção de erro ainda é boa no CTF, e é bastante problemático, então a maioria dos grandes usa scripts para explodir ou usa artefato sqlmap, eu perdi essa coisa É realmente fácil de usar, mas ainda não o uso muito para galinhas, apenas declarações simples







Princípio

Aqui eu quero acrescentar que ontem os pontos de conhecimento do sql bypass, eu também vi a busca por sql_puzzing hoje, peguei emprestada as palavras daqueles big brother: vi o blog do primo ao lado, encontrei esse bypass
SELECT * FROM `user` WHERE id=1=0=1

Insira a descrição da imagem aqui
É incrível, por que não gerar o valor de id = 1 e por que essa sintaxe não está errada.Depois de
repetidas observações e experimentações pelo velho, descobri que a instrução mysql é realmente muito semelhante a uma linguagem de programação como PHP, e a sintaxe é semelhante à
instrução SQL acima. A seguinte instrução php é a mesma quando é executada (na verdade, não tenho certeza)

$pd=(1==0==1)
If(($pd==true)
SELECT * FROM `user` WHERE id=1
Else
SELECT * FROM `user` WHERE id!=1

Isso deve fazer muito sentido à primeira vista, principalmente como uma galinha, eu só sei sql =, mas esqueça que ele ainda deveria! =
De fato, qual é a dúvida, qual é a utilidade desse desvio, então o efeito Grande
1. Primeiro, ele pode ser estendido indefinidamente, principalmente =, 'É realmente fácil usá-lo se não for filtrado
. 2. Às vezes, você encontra a página que entra e, ou o que não mudou, por isso é considerado que não há injeção. Como ele pode substituir e, ou com # ou ``, assim você descobrirá que a página não foi alterada, esse método não é adequado para
inserir o tópico de hoje

Injeção de erro

Alguns Sql são realmente bons. Se você souber onde estou tendo problemas, informe imediatamente para que você saiba. Homens heterossexuais como eu, mesmo que estejam errados, não sabem onde estão, por isso, se sql é uma garota, seria muito bom. Você me diz o que está errado, então eu o corrigirei, dividido em duas categorias: 1.xpath syntax error 2.concat + rand () + group_by () faz com que a chave primária seja duplicada

erro de sintaxe xpath

função extractvalue
Para entender as brechas, você deve entender a função da função: Protótipo da função: extractvalue (xml_document, Xpath_string) Sintaxe normal: extractvalue (xml_document, Xpath_string); O primeiro parâmetro: xml_document é um formato de cadeia de caracteres, que é o nome do objeto de documento xml. Parâmetros: Xpath_string é uma string no formato xpath. O papel de retornar uma string contendo o valor consultado do xml de destino está no segundo parâmetro. Na verdade, existem muitas vulnerabilidades de string, porque o segundo parâmetro precisa apenas da string de formato xpath. Use a função concat para formar uma nova sequência, concat tem uma vulnerabilidade de execução e a sequência de sintaxe xpath possui um recurso que o erro imprimirá o XPath_string
select extractvalue(1,concat('~',(select database())))

Insira a descrição da imagem aqui
Existem muitos caras grandes na Internet com esses códigos, mas você conhece o CTF e eu entendo. Não me sinto interessante se não o filtrar. Filtre diretamente para ver o que você faz, vire para hexadecimal, você é inteligente. Mas ainda posso filtrar. Não há como fazê-lo. Na verdade, o problema não é grande. Não é a única maneira . A brecha dessa função é que o erro imprimirá o XPath_string e o princípio acima é que o conteúdo no início não está no formato XML A gramática, a filtragem concat encontra o equivalente imediatamente, a filtragem é boa, desde que o conteúdo no início não seja da
sintaxe do formato xml.Nota: extractvalue () pode consultar o comprimento máximo da cadeia de caracteres é 32, portanto, use substring para interceptar

função updatexml
A função updatexml () é semelhante a extractvalue (), que é uma função para atualizar o documento xml. Sintaxe updatexml (documento xml de destino, caminho xml, conteúdo atualizado) De fato, updatexml é equivalente a extractvalue, portanto, a vulnerabilidade é semelhante a 3.

concat + rand () + group_by () causa chaves primárias duplicadas

Sem dúvida, esse ponto de conhecimento é o ponto principal de conhecimento da injeção de erros, e não é fácil de entender, mas pareço entender as funções necessárias: 1.Count 2.Rand 3.Group por 4.Floor Count é, sem dúvida, muito simples. Gerar número aleatório Agrupar por grupo XX por XX A linguagem de programação do piso sabe arredondar para baixo, por exemplo, floor (1.1111) = 1 entende a função da função e, por favor, consulte a tela grande `` `selecione contagem (*) do grupo de usuários por floor (rand (0) * 2); `` `` Veja o código primeiro, não se preocupe, analise-o lentamente, entenda o princípio e depois ignore-o. Simplesmente coloque o código acima em vernáculo e diga que a tabela do usuário passa primeiro pelo floor (rand (0) * 2 ) Essa chave é agrupada e, em seguida, verifique a tabela do usuário que é igual à chave e, em seguida, +1 em pontos de dúvida: 1. Qual é a chave obtida pelo piso (rand (0) * 2) 2. O agrupamento por agrupamento é um passo a passo das estatísticas Análise 1. Solução: 0
select count(*) from user group by id

Insira a descrição da imagem aqui
A tabela mostrará primeiro, para não dizer que não tenho imagem nem verdade.
Primeiro, agrupe por id, pode ser dividido em.
Insira a descrição da imagem aqui
Então, key = {id = 1, id = 2, id = 3}, é
por isso que os resultados após todas as execuções são mostrados Isso não impede que você fique confuso.
Comece a executar a primeira instrução. Primeiro, a tabela virtual está vazia.
Consulte a primeira linha de dados, ou seja, selecione a tabela do usuário e
encontre id = 1 e, em seguida, selecione * da tabela virtual em que id = 1 para
ver se a tabela virtual possui No id = 1
Não OK Insira na contagem = 1 na tabela virtual
Se houver, atualize a contagem + = 1
e assim por diante
Isso é fácil de entender
Ok, agora vamos para a mais difícil

select count(*) from user group by floor(rand(0)*2);

De acordo com as idéias acima,
agora sabemos que key = {0,1}
consulta a primeira linha de dados.No momento, assuma que floor (rand (0) * 2) = 1, ou seja, key = 1
porque não há coluna igual a key, portanto, o msql ele será a chave para um indivíduo, isto é, andar (rand (0) * 2 ) em um valor em vez do nome da classe
para que assim, continue como indicado acima, fazer
olhar para a tabela virtual não tem uma chave (1)
não está ok ! Insira 1 na contagem = 1 na tabela virtual
...
Essa lógica parece correta, por que o erro é relatado? Onde está o meu problema?
Bem, sim, sim, você está errado, apenas uma coisa está errada, floor (rand ( 0) * 2) será executado várias
vezes.É executado uma vez durante a consulta e realmente executado uma vez durante a inserção, e a tabela virtual possui uma chave de inserção característica que é a cadeia principal, ou seja, apenas uma
execução é permitida na tabela. A instrução insert não é a acima, mas insira floor (rand (0) * 2) na contagem = 1
Como isso pode estar errado, não se apresse, primeiro para o piso da tabela de aspectos (rand (0) * 2) está definido como x
x = 1 durante a consulta, não há chave para x = 1 na tabela virtual, portanto, execute a inserção. Nesse momento, independentemente de x se tornar 1 ou 0, a
tabela virtual não possui esses valores, portanto, não reportará um erro
. Não é necessariamente a mesma sorte uma vez, supondo que x = 1 esteja armazenado na tabela virtual, x = 0 durante a consulta ex = 0 não exista na tabela virtual, portanto, neste momento, x se torna 1 e se insere x na contagem = 1, porque a tabela virtual já existe x = 1, x = 1 é a cadeia principal, por isso, inevitavelmente, relatará um erro,
nenhuma imagem é entediante, na
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
primeira vez que você não entender, e leia-a várias vezes.

Agora analise algumas das minhas próprias perguntas

1. Pode ser apenas um piso?
2. Os colchetes Rand podem ser apenas 0?
3. Somente a contagem e o grupo por
podem ser combinados? 4. Apenas o valor do piso (rand (0) * 2) pode ser 0-1 -lo, você não pode fazer um pouco grande?
1. solução: não é necessariamente, arredondado para baixo também é possível, contanto que duas chaves adjacente = inteiro na linha de
solução 2.: não, Rand é números aleatórios, rand ( 0) As sementes de saída terão regularidade e rand () não tem regularidade a seguir, então depende se você é africano ou europeu
. Solução: Sim, no momento, por causa de outras funções de agregação, tentei relatar outros erros de qualquer maneira
4. Apenas deixe key = dois números inteiros adjacentes, não deixe o valor da chave ser muito, caso contrário, é realmente problemático









Caso do título do CTF

Como há menos CTFs encontrados na injeção de erro,
verifique isso. Verifique a redação deste irmão mais velho , não encontrei a pergunta original

Publicado 6 artigos originais · gostei 0 · visitas 116

Acho que você gosta

Origin blog.csdn.net/a1309525802/article/details/105394272
Recomendado
Clasificación