sql注入的进阶

在使用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页面上,其他信息的输出同理。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值