sqlilabs2
sqlilabs第五关
这次的和之前四关就很不一样了,虽然还是单引号的字符型注入,但是
这个you are in 就很尴尬,除了报错,不然都是you are in。。。。
所以要怎么办呢
这个时候就要知道什么叫盲注了
盲注就是在 sql 注入过程中,sql 语句执行的选择后,选择的数据不能回显 到前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注
盲注有三类
•基于布尔 SQL 盲注
•基于时间的 SQL 盲注
•基于报错的 SQL 盲注
先从布尔sql盲注说起吧
首先是sql注入截取字符串常用函数
首先是mid()函数
此函数为截取字符串的一部分
语法:MID(column_name,start,[length])
eg: str=”123456” mid(str,2,1) 结果为2
例子:
(1)MID(DATABASE(),1,1)>’a’,查看数据库名第一位,MID(DATABASE(),2,1)查看数据库名第二位,依次查看各位字符。
(2)MID((SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0xxxxxxx LIMIT 0,1),1,1)>’a’此处column_name参数可以为sql语句,可自行构造sql语句进行注入。
substr()函数
Substr()和substring()函数实现的功能是一样的,均为截取字符串。
string substring(string, start, length)
string substr(string, start, length)
参数描述同mid()函数,第一个参数为要处理的字符串,start为开始位置,length为截取的长度。
例子:
(1) substr(DATABASE(),1,1)>’a’,查看数据库名第一位,substr(DATABASE(),2,1)查看数据库名第二位,依次查看各位字符。
(2) substr((SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE T table_schema=0xxxxxxx LIMIT 0,1),1,1)>’a’此处string参数可以为sql语句,可自行构造sql语句进行注入
Left()函数
Left()得到字符串左部指定个数的字符
Left ( string, n ) string为要截取的字符串,n为长度。
Sql用例:
(1) left(database(),1)>’a’,查看数据库名第一位,left(database(),2)>’ab’,查看数据库名前二位。
(2) 同样的string可以为自行构造的sql语句。
同时也要介绍ORD()函数,此函数为返回第一个字符的ASCII码,经常与上面的函数进行组合使用。
例如ORD(MID(DATABASE(),1,1))>114 意为检测database()的第一位ASCII码是否大于114,也即是‘r’
资料来源:https://www.cnblogs.com/lcamry/p/5504374.html
length()函数
可以用来判断字符数
eg:length(database())>5,这个数据库的名称是否大于五个字符
资料先放着吧,感觉还是要运用了记忆力会比较深
然后回到题目来:
此时我们使用length判断数据库名称的长短
使用指令and length(database())>=8 画面返回
但是当我 为and length (database())>9的时候
返回了这玩意,说明是错的,也就是这个数据库的字符数是8,想一下我就觉得是security。
我们接下来去试试
方法一
substr((string, start<,length>)
这里有一种方法是利用 substr(database(),1,1)=’s’ 这个函数来一个个试
发现是可以的,说明第一个字母就是s,然后接下来继续去试,发现就是security
方法2
这里有一种方法是利用burp suite工具:
下面是学习过程
proxy 和代理相关
intercept截断
默认Intercept is on 按钮出于开启状态 也就是说默认代理截断功能是打开的.此时所有的请求都会被截断,只有手动Forward之后请求才会被发出去
Http history(http请求历史)
所有经过burp suite 的请求 都会被记录到http history中. 上面是请求概要信息 下面是请求详细信息
websookets history
有的web时没有界面的,是用一个长链接 类似于api的方式来传输数据 burp suite也是可以截获这类信息的
api是一个通道,是一个接口,负责一个程序和其他软件的沟通,本质是预先定义的函数,就是类似于预设。
options(配置选项)
Proxy Listeners(侦听端口设置)
点击next 就会生成一张证书 选择路径保存. 然后导入到浏览器,就可以实现https的访问 资料来自:https://www.cnblogs.com/php09/p/10412687.html 学习博客:https://blog.csdn.net/qq_35544379/article/details/76696106弄这个弄得我想吐,我在抓sqlilabs的本地包的时候,一直抓不到 ,我以为是burp的问题,原来是浏览器的问题,人傻了,我试了几个方法,好像修改火狐浏览器的一个高级选项是最有效的,这样你使用localhost输入的时候也可以抓到了
我发现一件事,我再用
1 | ?id=1'and substr(database(),1,1)='s' --+ |
这个语句的时候,我就在想,我首先知道这个数据库的名称有多长,然后对每个字母单独加一个burp里面的变量符,这样,我是不是就免去了一个个去试的麻烦呢?
接下来验证一下
根据前面我的做题,我们知道,这个数据库名字的长度肯定是8个字符
首先是这样 然后
先clear 再分别对每个a进行add 我发现这个方法是不行的,但是我的思路是OK的,因为我发现他有另外一个功能,我接下来直接放图就一目了然了
就这样,然后点击star attack就可以,但是我发现这个add from list中选择8个字母好像没有所有排序,所以。。。。。可能还有更好地方法?,那反正这一步大概就是这样了
接下来是判断他的库名:库名其实还是要使用substr来判断他的库名 其实就是在前三关查询的基础上 加了一个substr 语句是这样的
1 | ' and substr((select table_name from information_schema.tables where table_schema='security'limit 0,1 ),1,1) = 'e' --+ //这边有一点需要说明的是为什么需要加这个limit 0,1 我们知道一个库中可以有很多表,按我的理解是,你如果没有加这个limit0,1 那么数据库以为你要查询的数据数每个表的,也就是说这个语句变成,每个表的第一个字母是e,而不是我们想要的,第一个表的首字母为e。 |
这边补充一下limit n,m的功能和意思
limit的使用格式为limit m,n,其中m是指记录开始的位置,从0开始,表示第一条记录,n是指取n条记录
例如:limit 0,1 表示从第一条记录开始,取一条记录,在上面那个语句中的意思就是,从第一个表开始取,去一个表的名称
localhost:81/sqli-labs-php7-master/Less-5/?id=1’ and substr((select table_name from information_schema.tables where table_schema=’security’ limit 0,1),1,1)=’e’ –+
然后根据之前的经验就是emails 其实也没啥太大区别,后续就是替换substr当中的语句,替换为
select column_name from information_schema.columns where table_name =’emails’
还有什么一个字符的就不多说了。
其实不一定要用substr 还有其他很多命令,我在下面的关卡看看能不能使用,不能使用的话,后续再整理
第六关
确实和之前一样,但是这边是双引号的报错
解题思路和上一次一样,这次我们换换其他指令看看效果:
我去查了一下 报错函数是否都需要加and 我是没找到具体说明,但我看每个在使用的时候都有加一个and的
接下来我们先用left
其实和substr也差不多,不过 left是规定从左边起,而substr还能规定从哪里开始从哪里结束
记代码一样打一下