0、前言
最近要为了自动化审计搜集所有PHP漏洞,在整理注入的时候,发现宽字节注入中使用iconv造成的漏洞原理没有真正搞懂,网上的文章也说得不是很清楚,于是看了荣哥(lxsec)以前发的一篇http://www.91ri.org/8611.html,加上我们两个人的讨论,最终有了这一篇深入的研究成果。
1、概述
主要是由于使用了宽字节编码造成的。
什么是字符集?
计算机显示的字符图形与保存该字符时的二进制编码的映射关系。
如ASCII中,A(图形)对应编码01000001(65)。
对于MYSQL数据库来说,涉及字符集的地方大致分为存储和传输时,即:
(1)存储在服务器端的数据是何种编码
(2)客户端和服务器交互的时候数据传输使用的编码。
2、MYSQL服务器端存储字符集
在MYSQL服务器端进行数据存储时,允许在以下的级别设置字符集:
(1)服务器端字符集(character_set_server)
(2)库字符集
(3)表字符集
(4)字段字符集
优先级为:字段----->表------->库-------->服务器
对应的语法是:
Create table test(
name varchar(20) charset gbk,
number varchar(10),age int
)engine=innodb charset=utf-8 ;
3、客户端与服务器交互数据传输的字符集
存储时的字符集已经确定了,不会影响交互阶段的字符集