SQL注入-宽字节注入
原理:
为防止SQL注入,一般都会开启gpc
来过滤特殊字符,但如果数据库设置字节解析与PHP不同,并试用了宽字节字符集,就会导致宽字节注入,从而逃避gpc
。(GBK和Big5等)
列:
环境sqli-labs
第33关。
打开index.php
查看代码:
发现定义了一个check_addslashes($string)
函数,该函数就是将传进来的$string
变量使用addslashes()
进行过滤。
然后我们到页面输入?id=1\
:
可以看到经过check_addslashes()
函数过滤后我们输入的字符会被转义,在\
前面又加了一个\
。
然后我们尝试宽字符注入:
payload:?id=1%df' and 1 --+
和?id=1%df' and 1 --+
发现页面回显不同:
说明宽字符注入成功,我们尝试用宽字符联合注入试一下:
payload?id=-1%df' union select 1,database(),user() --+
:
发现注入成功,可这是为什么呢?
解析:
我们首先要知道:
1,GBK编码,两个字符为一个汉字。
2,\
的URL编码为:%5c
知道这俩就很好理解了,我们输入?id=1%df'
的URL编码为?id=1%df%27
传入到代码层后过滤函数会在'
号前加个\
变成?id=1\'
,经过URL编码后为?id=1%df%5c%27
,之后传到数据库由于数据库使用GBK编码,两个字符为一个汉字,那么他就会以为%df%5c
是一个汉字(%df%5c
为汉字運(yun)
可以认为%df
吧\
号吃掉了),那么最终变为where id='1運'
,这在数据库中是可以执行的,查到的数据为id='1’的数据。