SQL宽字节注入学习

学习mysql的宽字节注入

首先需要知道一些编码的知识:

ANSI 编码

为了扩充ASCII编码,以用于显示本国的语言,不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准;这些使用2个字节来代表一个字符的各种汉字延伸编码方式成为ANSI编码

GB2312

GB2312是ANSI编码中的一种,是一个简体中文字符集

高字节从A1到F7, 低字节从A1到FE

GBK

对于人名、古汉语等方面出现的罕用字,GB 2312不能处理,这导致了后来GBK及GB 18030汉字字符集的出现

GBK采用双字节表示,首字节在81-FE 之间,尾字节在40-FE 之间

URL编码

感觉学那么长时间了,这个知识有时候还是会感到很迷,记一下

URL有一些组成成分,以特殊字符来标志隔开,比如&是“与、和”的意思,?后面跟的是参数部分,\是分割目录的字符……

再例如,在百度输入框输入“你好”,然后回车,会显示含有“你好”关键字的各种文章,url此时为:

https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu
&wd=%E4%BD%A0%E5%A5%BD&rsv_pq=8bf8a071000022ab&rsv_t=d8a9pgwstMQ
JuWgI48JEK5gL8433%2Bnxs8tWzpruDQJ7A%2F7fA9YG5Fl7CqCY&rqlang=cn&rsv_enter=1&rsv_sug3=7&rsv_sug1=6&rsv_sug7=101&rsv_sug2=0&inputT=1229&rsv_sug4=2331

可以看到,输入的“你好”被编码为%E4%BD%A0%E5%A5%BD,因此,可以直接修改这个url里面wd的值即可完成查询

但,要想修改url然后百度url中的特殊字符呢?例如让wd=&这样会怎样呢?经测试,发现又回到了百度主页,并没有进行搜索

这就凸显了url编码的作用,即将任何不是简单七位ASCII(比如汉字)进行url编码,也包括url中的特殊字符

那么,在进行get注入时为什么不能直接用#也就明白了:

#是url中的锚部分,即代表网页中的一个位置,比如,
http://www.example.com/index.html#print就代表网页index.html的print位置。浏览器读取这个URL后,会自动将print位置滚动至可视区域。

因此,输入#,浏览器就会认为这是一个锚标志,就不会将其传到服务器端;但将其编码成%23再放到参数部分传过去,服务器接收端就会接收%23并将其转换为#,就把它当成注释符了

宽字节注入

一些字符及其url编码:

'  : %27
\  : %5c

有时候,服务器端会对单引号以及反斜杠进行过滤:输入',会转换成\',输入\,会转换成\\;添加反斜杠就会使后面的单引号或反斜杠失去作用

当mysql使用GBK编码时,就认为两个字节为一个汉字;例如,在进行get注入时,输入%dd%27后,服务端接收到,会在%27即单引号前添加反斜杠,而urlencode("\'")=%5c%27,此时形成了%dd%5c%27,而%dd%5c会被认为是一个汉字,则绕过了反斜杠的作用,从而使单引号起了作用,便可进行注入