sql注入--9宽字节注入
宽字节注入
简介
宽字节注入就是因为gbk编码方式需要两个ascii组合来解码,所以很形象的叫做宽字节。
原理
当传递一个参数id=1‘得时候,当我们输入这个单引号,会被认为是非法字符,会被过滤函数添加“\”给过滤掉,所以我们想要程序接受我们传递得参数中包含单引号,那么就需要把这个转义字符“\”干掉,那如何才能干掉呢?当http协议传输得时候,是要经过url编码的,如果这个编码完成后,传递到服务器时,我们可以在单引号前加上一个%81这样得编码,最后这样解码得时候,这个%81就会和“/”对应得编码相结合按照gbk编码要求去解码,最后只剩下个单引号。
通俗解释:输入id=1’ (参数不一定是id) --> ’ 会被过滤函数添加 \ 给过滤掉
不被过滤掉的方法就是去除 \
注入条件
1.数据库查询设置为GBK编码
2.使用了addslashes(),mysql_real_escape_string(),mysql_escape_string()之类的转义函数
附:GBK编码表
https://www.qqxiuzi.cn/zh/hanzi-gbk-bianma.php
靶场利用
sqli-labs-master中的less-36
注意事项
当我们注入时,写入语句中含有类似于 where table_schema=database() and table_name =’ users ’ 时,语句中的单引号也会被过滤函数过滤掉。
1.通过16进制绕过过滤
将字符转换成16进制输入
2.通过使用嵌套查询绕过过滤
where table_schema=database() and table_name = (select table_name from informaton_schema.tables where table_schema=database() limit 0,1)