嗨喽,我知众君期待已久,今日特此再现美文一篇,来来,欢呼声在哪里?
OK,收。回归正传了啊,说起第1回的基本sql注入,等等是谁在喊:第1回的sql注入已然分分钟搞定了。
那行,今日要说的是sql注入中的宽字节注入,帅哥美女们请收起大众的疑惑,坐好小板凳,听我细细说来:
首要,必定要明白何为宽字节,通俗点说:一个汉字用gbk占两个字节,用utf8占三个字节,所说宽字节注入就理解成利用字节区别引起的问题就ok了。
接下来,我要为你们介绍几位大名鼎鼎的名人了,哈,她们分别是addslashes、mysql_real_escape_string、mysql_escape_string、magic_quote_gpc,这是啥?四大天王吗?
nonono,它们为了防止sql注入,会将有些什么单引号了,双引号了哪些对sql有影响的特殊符号进行实体转义,便是加了一个斜杠,这些函数详细转移那些符号,哥们们能够去搜一下,码字很辛苦,此处我就省了。
平白无故为何要介绍她们呢,有无发掘,第1回说的那个基本sql注入已经被这四大屌丝(并非天王)容易搞定了。
咱第1回的成功就这般被搞定了?来,看例子:
这代码大众很熟练了,在第1回的代码基本上加了个addslashes函数,那样效果怎样,请看:
我勒个去,那个单引号给我加了个斜杠,转义了。那接下来怎么搞?两个办法:1,斜杠前加斜杠,相当于转义斜杠,单引号生效。2,去掉斜杠,单引号生效。
我去,好办法,当然实践前必须要明白个道理,这个道理很重要,我通俗的说,大众多读几遍,否则原理就欠好理解了。
其宽字节是利用mysql的特性,mysql它在用gbk编码的时候,它会认为两个字符是一个汉字,且前一个字符的ascii码要大于128。
不睬解?不急,那我再多码点字来解释下,必须要明白ascii码为么要大于128,这个编码大于128会怎么样,先看张图:
这是ascii表的最后一条数据,最后一个是127,亦便是前127个都是字符,超过127怎么办,那欠好意思,我就不可把你当字符了,那当什么,把你当成汉字。
还是刚才那个例子,这次我不输入单引号了,我输入了一个%df%27,输入了个啥?别急,先看下代码:
重视我加的那个mysql_query("set names gbk");,它会设置字符为gbk,它是导致宽字节的始作俑者。看下结果:
斜杠没了,这个单引号此时是生效的。为何,结合刚才让大众多读几遍的那个原理来看:
首要,要明白,咱拜访的url中经常都是一堆%什么的特殊字符,非常多很长的网址,那都是url编码将字符转换的结果。其次%df的ascii的编码是大于128的,非要用%df吗,非亦,只要ascii大于128就可。那样,就变成为了%df\%27了,此时候mysql就把%27\当作汉字了,便是那个繁体字,而单引号就生效了,在url编码中%27是单引号。
那,宽字节是不是有概念了呢,相信兄弟们都懂了。
四大屌丝才说了一个addslashes函数,码字亦码累了,瞧瞧时间亦快下班了,在码一会,其它屌丝下回接着码。
此时此刻,相比非常多人心中都有疑问了,咱们写程序都是utf8啊,谁还用gbk,你的程序要是用的utf8编码,那这个宽字节注入能够忽略,要是gbk,嘿嘿,危险了。
其实宽字节注入很普遍,大众会发掘非常多cms系统都有两个版本,一个是gbk,一个是utf8,有的是为了照顾以前的用户,因此始终在用gbk,有的是专门就弄自己的gbk编码。因此,这个在各大cms中经平常。
当然,有攻便有防,至于防御,在咱们把所有的类型所有码完之后,再来个大大的总结。
那针对咱们今天说的这个addslashes函数怎么做审计呢?
ok,认真了,干货来了:其实非常简单,项目全局搜索以下几个关键字:1,SET NAMES. 2,character_set_client=gbk. 3,mysql_set_chatset(gbk). 从字面就晓得,她们呢都是用来设置字符编码的。
来一条华丽的分割线:
最后,倘若大众喜欢网络三毛,欢迎wx关注,不定时发布关于审计、攻防、安全、渗透方面的知识。