ღ Miranda

MySQL枚举数据库模式

在MySQL的注入攻击中,枚举数据库并提取数据也遵循一种层次化方法,首先提取数据库名称,然后转向表,列,最后是数据。

查询用户名可以用以下两种:


如果没有管理员权限,但MySQL版本高于5.0,可以用information_schema注入获得数据库信息:

会得到:

schema_name
sys
performance_schema
mysql
information_schema
shop

检索数据库后,就要想办法提取表名,可以用以下方式:

得到表名:

table_schema table_name
shop items
shop user

当然也可以枚举出除了系统数据库以外所有数据库的表名:

这个user表看起来有点意思,我们可以进一步枚举列名:

可以枚举出列名:

column_name
id
first_name
last_name
passwd

如果Web应用允许UNION操作,那么可以通过information_schema查到所有有关password的列:

可以得到:

table_schema table_name column_name
mysql servers Password
mysql slave_master_info User_password
mysql user password_expired
mysql user password_last_changed
mysql user password_lifetime
shop user passwd

可以直接枚举内容:

得到:

id first_name last_name passwd
1 user1 mm 123456
2 user2 mm password
3 user3 mm 567890

可见,在information_schema库中table_schema代表库名,table_name是表名,column_name是列名,这个数据库是十分重要的。


information_schema不仅包含数据库结构,还包含用户权限等信息:

会得到:

grantee privilege_type is_grantable
‘root’@’localhost’ SELECT YES
‘root’@’localhost’ INSERT YES
‘root’@’localhost’ UPDATE YES
‘root’@’localhost’ DELETE YES

information_schema只适用于MySQL5后的版本,面对早期版本只能暴力破解表名和列名,不过也可以通过一些技巧获得数据:

还有一点要注意,在UNION查询时,UNION后面返回列数目要和前面查询返回列数相同,不然会报错:

会返回:

first_name last_name
user1 mm
user1 123456
user2 password
user3 567890

如下查询就会报错,因为原本返回两列,可UNION返回了三列:

发表评论

电子邮件地址不会被公开。