在使用union联合查询之前,需要了解union的原理,union是连接两个select的查询语句,会创建两个select表,输出的结果会拼接在一起,所以这两个表需要列数一致(数据库规定),才可以进行查询-----------------所以在使用union之前,需要id=xx所在表的列数,那么就是使用order by判断
判断列数后,union后的select才可以设置查询的列数,union select 1,2,3,4(使用1,2,3,4代替任意的字段)
1、order by ---获取字段数原理
order by--在数据库中是排序的意思
例如:在数据中正常执行select * from app,则得到如下信息
执行排序,则得到如下信息:
对比上述信息,得知对第一列字段进行了排序,那么如果执行order by 5,则会产生错误,因为当前数据库app,不存在第五列数据,则无法进行排序。
那么当进行sql注入时,通过http://x.x.x.x/1.jsp?id=1 order by x的方式可以推测出当前数据库存在几列。
2、union查看回显点
union select用于多个条件的查询,那么为何可以查看回显点呢?
回显点的意思:就是判断页面中的那些位置的数据来自于数据库,例如web页面中的某一个动态图片,来自于数据库,那么这个图片对应的字段值可能为picture.
数据库通过web页面返回的地方是有限的(不像数据库中命令执行,可以任意输出),所以需要找到那些位置可以输出数据,方便后续的攻击。
判断回显点一般用的是union select 1,2,3,4(1,2,3,4...具体有多少列,需要根据order by的结果而定)
-----数据库中直接执行select 1,2,3,3 from app,会出现左图结果,表的字段值和内容都填充了输入的1,2,3,3。
那么在一个正常的查询中,写入union select 1,2,3,4,能看到多了一行1 2 3 4,
实际的业务中,例如http://x.x.x.x/1.jsp?id=1 union select 1,2,3,4查询效果和上图差不多,但是web只能返回一个select语句查询的结果,则只返回了id=1的数据 i a NULL(这个其实就是web的返回结果,只不过在一个html页面中,不知道具体哪些位置的数据是从数据库返回的)。
那么如果执行id=-1 union select 1,2,3,4,则只返回select 1,2,3,4对应的结果,通过查看页面上的显示数字,即可以判断哪些数据来自于数据库查询结果
此时2 3 4就会返回到页面中(正常输出的应该是i a NULL ,此时输出的是2 3 4),一眼就能看出哪些地方是数据库的返回数据
对应能输出的地方,替换成sql语句,例如:select * from app where id=-1 union select 1,2,user(),version();
----对应的数据,也会返回到web页面上,其他信息的输出同理。