宽字节注入%df的理解
Posted tpaer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了宽字节注入%df的理解相关的知识,希望对你有一定的参考价值。
宽字节注入是sql注入的一种手段,利用mysql使用GBK编码(因为GBK占用2个字节,而ascii占用1个字节),将两个字符看作一个汉字,从而消除转义字符\\。(当某字符的大小为一个字节时,称其字符为窄字节当某字符的大小为两个字节时,称其字符为宽字节。所有英文默认占一个字节,汉字占两个字节。)
以下是个人总结对%df的理解
为什么使用%df
不一定使用%df,但前一个字节ascii码要大于128才到汉字的范围。
为什么那么多人都用%df
and被php转义后就是%df
逃逸过程
php.ini中有一个get_magic_quotes_gpc功能,在开启时所有的 ' (单引号), " (双引号), \\ (反斜线) and 空字符会自动加上转义符\\。
以'单引号为例,如何使\\'中的'逃逸出来:
?id=1%df' and 1=1--+
%df'=>%df\\'(单引号会被加上转义字符\\)
%df\\'=>%df%5c'(\\的十六进制为%5c)
%df%5c'=>縗'(GBK编码时会认为这时一个宽字节)
'成功逃逸,sql语法正确
sqlmap中同时也存在宽字节绕过的脚本unmagicquotes.py,使用方式如下
sqlmap -u "ip" --tamper="unmagicquotes.py" --batch
宽字节注入
/*珍惜少年时博客 转载请注明出处。*/
51cto关于宽字节介绍很好的一篇文章:http://www.2cto.com/article/201209/153283.html
关于宽字节注入的PPT:宽字节注入.PPT
测试代码及数据库出处(http://www.cnblogs.com/lcamry/articles/5625276.html):
宽字节注入原理:
GBK 占用两字节
ASCII占用一字节
PHP中编码为GBK,函数执行添加的是ASCII编码,MYSQL默认字符集是GBK等宽字节字符集。
输入%df和函数执行添加的%5C,被合并成%df%5C。由于GBK是两字节,这个%df%5C被MYSQL识别为GBK。导致本应的%df\\变成%df%5C。%df%5C在GBK编码中没有对应,所以被当成无效字符。
%DF’ :会被PHP当中的addslashes函数转义为“%DF\\\'” ,“\\”既URL里的“%5C”,那么也就是说,“%DF\'”会被转成“%DF%5C%27”倘若网站的字符集是GBK,MYSQL使用的编码也是GBK的话,就会认为“%DF%5C%27”是一个宽字符。也就是“縗’”
例如:http://www.xxx.com/login.php?user=%df’ or 1=1 limit 1,1%23&pass=
其对应的sql就是:
select * fromcms_user where username = ‘運’ or 1=1 limit 1,1#’ and password=”
以下是一次实例宽字节注入:
注入点:http://103.238.227.13:10083/index.php?id=1
提交 %bf’ 出现错误,由此可见存在宽字节注入。
http://103.238.227.13:10083/index.php?id=1%df\' order by 2%23 ======>推出有两个字段数 将中间段换做注入语句即可。
然后再将sql修改
以上是关于宽字节注入%df的理解的主要内容,如果未能解决你的问题,请参考以下文章