宽字节注入原理
一个
GBK
汉字占两个字节,每个字节有自己的取值范围,如果设置GBK编码后,遇到连续两个字节,都符合
GBK
取值范围,会自动解析为一个汉字。Addslashes函数防止
sql
注入,将传入参数值进行转义。例如将
'转义为 \'
,这样我们在注入的时候闭合单引号就会变成
id='1\',这样会导致闭合失败从而注入失败。
绕过方式:
输入
%df'
(%27)
,本来会转义
'
为
\'
,但
\ (%5c)
遇上
%df
,两者会合起来被解析成一个汉字
(
運
)
,这样变成
id='1運'
,在
MYSQL
中效果等同于
id= '1'(
隐式类型转换
)
,因而成功绕过。
注入过程
1.判断是否存在漏洞
这里注入时不管是正确还是错误语句页面都回显数据,我初步判断存在漏洞且可能是字符型
2.判断注入类型
这里提示我们输入的变成了1\','被转义为了\',被转义后数据库不会认为他是单引号的作用,而将其视为一个普通字符,就起不到引起单引号缺失的作用。
这时我们为了使其回复单引号的作用我们就可以使用%df让其和转以后得\组成%df%5c也就是我们的運这个繁体字。当然不一定要使用%df,只要是能和%5c组成一个字使其失去转义功能就可以。
引起了单引号报错,确定了存在单引号闭合这个,我们就可以继续后续查询,在一开始输入id=1时页面可以回显数据,那么我就可以使用联合注入的步骤来继续后续查询。
3.联合查询
3.1猜列数
最后猜中是3列
3.2判断回显位
2,3位是回显位
3.3查询数据库名
security
3.4查询表名
在查询表名时,发现出现了报错,查看报错发现table_schema='security'的两个单引号也被转义了,那么我们就换一种方式表达数据库名,可以用ascii码值表示
我们使用工具转换,将16进制的替换上去,就查询了表名
后续查询举一反三即可,分享就到这里