sql注入(二)--联合查询及实际用途

预备

假设先前已存在两个表create_test和goods:
sql注入(二)--联合查询及实际用途
sql注入(二)--联合查询及实际用途

练习

问题1:已知goods中id等于2的字段内容,且已知还存在表create_test,想要通过goods中id=2来导出create_test中的内容:

sql注入(二)--联合查询及实际用途
解决:使用联合查询:
sql注入(二)--联合查询及实际用途
局限:前提是这两个表的列数必须相同(该处均为3列)。

问题2:如何查询不同列数的两个表,下例中为联合查询另一个表(该表为4列):

sql注入(二)--联合查询及实际用途
解决:
实战1:也可以通过如下语句,来猜测确定goods表中的列数 ,(注意此处默认不知道sqltest的列数及其中的内容),当select后面为n个任意数字,代表选中n列,不管在sqltest表中是否存在这些内容:
sql注入(二)--联合查询及实际用途
实战2 在已知goods表的列数情况下,进一步 猜测sqltest的列名 ,例如图一为在第二个位置猜测sqltest中有一个列名为name,则如果真实存在,会在联合语句中name替代的位置(这里是替代第二个,而在sqltest中name实际位于第一列),显示所有name的内容;图二为猜测了sqltest中不存在的列名:
sql注入(二)--联合查询及实际用途
sql注入(二)--联合查询及实际用途
实战3 也可以插入一个函数来 查看该数据库的版本 (该版本为8.0.11)
sql注入(二)--联合查询及实际用途

问题3:若网站将union过滤时,想要猜测另一张表(sqltest)的每一个列名

解决:
实战4 可以 通过and 加 exists函数来对其列名进行猜测 (若存在name列,虽然无法显示,但是会成功运行;下面则是猜测stu_ID,由于不存在该列名,因此导致前半句select * from goods where id = 2也无法顺利执行从而报错),作用类似于and 1=1
sql注入(二)--联合查询及实际用途
实战5 可能网站过滤了union字段,但是可能没有过滤大小写的问题,即在网站url中输入的union可以修改为Union,uNion,UNION等,即: 绕过 -------原理:url中区分了大小写,而sql语句在执行时不区分大小写