sql报错注入用法及详解

一、floor注入

语句:

select count(*),concat(database(),floor(rand(0)*2)) as x from information_schema.tables group by x

核心语句:

select count(*),floor(rand(0)*2) from test.user group by floor(rand(0)*2);

原理核心:

1、group by 执行的顺序优先于 select。

2、group by作用

        1)创建临时表。

        2)在语句的每次执行中 验证是否需要给临时表创建新的key。

3、floor(rand(0)*2) 产生的随机值是固定的 011011...,并且是共享的数据,每次执行都往后一位取值。

4、在一次查询中,rand可能会被执行2次, 在group by中会被执行一次,在select中可能又会被执行一次,如果group by判定需要插入新的key到临时表 则select 里的rand()需要被执行,然后添加到临时表里并且基数+1,如果group by判定不需要插入新的key到临时表,则不需要执行rand(),直接计数+1

推演:

生成的值 :011011

第一次执行

执行group by floor(rand(0)*2)取出的key是0,查找临时表里不存在0这个key,那么开始执行select count(*),floor(rand(0)*2) from test.user 这里从floor(rand(0)*2)取出的key是1,然后则直接插入1这个key到临时表里,并且count计数器直接+1。(到这里为止生成值的用掉了01)

第二次执行

执行group by floor(rand(0)*2)取出的key是1,查找临时表里存在1这个key,那么直接执行count(*)操作,数量+1。(到这里为止生成值的用掉了011)

第三次执行

执行group by floor(rand(0)*2)取出的key是0,查找临时表里不存在0这个key,那么开始执行select count(*),floor(rand(0)*2) from test.user这里从floor(rand(0)*2)取出的key是1,然后则直接插入1这个key到临时表里。此时报错,因为1这个key早已被插入到临时表里了(到这里为止生成值的用掉了01101)

二、xpath报错注入

  • updatexml()
    • 核心语句

    • select * from test.user where id = 1 and (updatexml(1,concat(0x7e,database()),3));
    • 函数updatexml(XML_document,XPath_string,new_value) : 
      • 第三个参数:string格式,替换查找到的符合条件的数据,可以随便写。

      • 第二个参数:代表路径,Xpath格式的字符串例如//title【@lang】,报错的关键,当这个参数错误时则会报错(xpath syntax)

      • 第一个参数:是string格式,为XML文档对象的名称,可以随便写。

      •  concat(0x7e,database()) 由于0x7e是~,不属于xpath语法格式,因此报出xpath语法错误,同理0x7e可以随意代理,只要不是@ / . 这三个字符以及他们的16进制编码就行。

  • extractvalue()
    • 核心语句

    • select * from test.user where id = 1 and (extractvalue(1,concat(0x7e,database())));
    • 函数:extractvalue(XML_document,xpath_string) 

      • 第一个参数:string格式,为XML文档对象的名称 ,可以随便写。

      • 第二个参数:xpath_string(xpath格式的字符串),报错的关键,当这个参数错误时则会报错(xpath syntax)

    • 由于0x7e就是~不属于xpath语法格式,因此报出xpath语法错误。原理同updatexml

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值