宽字节 mysql 特性,两个字符是一个汉字, 二次注入,; 分号后面继续
宽字节注入
字符、字符集与字符序
字符(character)是组成字符集(character set)的基本单位,对字符赋予一个数值(encoding)来确定这个字符在该字符集中的位置。
字符序(collation)指同一字符集内字符间的比较规则。
UTF8
由于ASCII表示的字符只有128个,因此网络世界的规范是使用UNICODE编码,但是用ASCI表示的字符使用UNICODE并不高效。因此出现了中间格式字符集,被称为通用转换格式,及UTF
宽字节
GB2312、GBK、GB18030、BIG5、ShiftJS等这些都是常说的宽字节,实际上只有两字节。宽字节带来的安全问题主要是吃ASCII字符(一字节)的现象
数字型
intval() 函数用于获取变量的整数值。
不加的话,会报错
字符型
addslashes()
会有转义
思路:
怎么逃逸单引号的限制??
想到宽字节注入
因为%df的关系,的编码%5c被吃掉了,也就失去了转义的效果直接被带入到mysql中,然后mysql在解读时无视了%a0%5c形成的新字节,那么单引号便重新发挥了效果
%df 好像不行了
宽字节注入只能用%df吗
还可以用汉字绕过,因为一个汉字PHP接受的时候是UTF-8编码,然后是个三字节编码,这个汉字和反斜杠两两配对组成两个汉字然后使单引号逃逸
`
二次注入原理
注入点因为经过过滤处理无法触发sql注入漏洞,比如addslashes函数,将单引号等字符转义变成但是存进数据库后,数据又被还原,在这种情况下,如果发现一个新的注入同时引用了被插入的数据库数据,就可以实现闭合新发现的注入漏洞引发二次注入
二阶注入
1.攻击者在http请求中提交恶意输入
2恶意输入保存在数据库中
3攻击者提交第二次http请求
4为处理第二次http请求,程序在检索存储在数据库中的恶意输入,构造SQL语句
5如果攻击成功,在第二次请求响应中返回结果
利用注册功能点,把我们的sql语句写进去, 保存到对方数据库中,我们再利用查询功能 去触发,存在对方数据库中的 sql语句
注册的时候,写入进去,但在数据库中,会被还原掉
查询一个用户
再去查询页面,去查询44
带出来了
这就是二次注入原理
思路:
先将注入语句插入到数据库,注册、留言板等功能都具有insert数据库的操作然后在使用update的地方触发插入到数据库的注入语句
写的不好,可能我自己也没太理解吧