【SQL注入必学基础】--宽字节注入
0X01 知识背景
二进制:计算机内部是由集成电路这种电子部件构成的,电路只可以表示两种状态——通电、断电,也就是使用二进制存储数据。因为这个特性,计算机内部只能处理二进制。那为什么我们能在计算机上看到字母和特殊字符呢?
ASCII码:如果我们用一个二进制数字表示一个字符,比如说用“0100 0001”来表示A。根据这个对应关系,我们制作一个表格,这个表格里一个二进制数字对应一个字符。这个表格也就是ASCII码表(百度可查)。如此~计算机就可以表示英文大小写字母了。
转义:所有的ASCII码都可以用“\”加数字(一般是8进制数字)来表示。而C中定义了一些字母前加"\"来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等,就称为转义字符,因为后面的字符,都不是它本来的ASCII字符意思了。
总而言之,编码与转义就是为了在计算机中通用表示各国文字以及使用特殊字符。有了这些就可以在计算机中表示各国语言,世界各地的计算机用户即可以以愉快的使用计算机啦!!
编码转义相关的更详细的内容点击:
编码:https://www.cnblogs.com/goldsunshine/p/10775528.html
转义:https://blog.csdn.net/itzyjr/article/details/102867808
GB2312、GBK、GB18030、BIG5、Shift_JIS等这些都是常说的宽字节,实际上只有两字节,但是这比起ASCII编码方式只用一个字节来说,是多了一倍啦!宽字节带来的安全问题主要是是ASCII字符(一字节)的现象,即将两个ASCII字符误认为是一个宽字节字符。
0X02 注入原理
前提:
MYSQL数据库使用GBK编码
实现原理:
由于安全意识的提高,网站开发时会使用addslashes() 函数对输入的参数进行强行转义,使得一般的闭合字符被addslashes() 函数添加的 "\"转义,从而不能闭合,使得注入失败。
由于ASCII编码使用一个字节,GBK编码使用两个字节。PHP语言编码为GBK,MYSQL编码也使用GBK编码。那么GBK这样占用字节较多的就叫宽字节编码。
由于宽字节注入是利用mysql的一个特性,mysql在使用GBK编码的时候,会认为两个字符是一个汉字(前一个ASCII码要大于128,才到汉字的范围,所以使用的字符不一定只有 %df’),示例如下图:
PHP中编码为GBK,函数执行添加的是ASCII编码(添加的符号为“\”),MYSQL默认字符集是GBK等宽字节字符集。如上图所示%df’被PHP转义,单引号被加上反斜杠\,变成了%df’,其中\的十六进制是%5C,那么现在%df’=%df%5C%27,如果程序的默认字符集是GBK等宽字节字符集,则MYSQL用GBK编码时,会认为%df%5C是一个宽字符,也就是縗,也就是说:%df\’ = %df%5c%27=運’,有了单引号闭合就可以注入了(说白了就是从addslashes函数中逃逸出来)。
如何从addslashes函数逃逸出来?
\前面再加一个\(或单数个),变成\ \ ',这样\被转义了,'逃出了限制
把\弄没
使用十六进制绕过
0X03 练习例题
sqllib第32关
功放世界CTF:
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1
提示:1、此题目存在注入。在爆的数据库名,爆表名是可使用十六进制绕过addslashes函数。
0X04 练习题演示
首先来看看源码:
写入payload:
页面正常显示:
输入payload:
192.168.227.151:86/Less-33/?id=1%df' and
updatexml(1,concat(0x7e,database(),0x7e),1) -- -
成功爆出数据库名!
还有一篇文章不要忘记看哟~~~
「安全武器库」 知识星球
「安全武器库」 知识星球 是一个网络安全各类安全脚本\工具整合的星球!主要分享、整理、原创编辑等网络安全相关工具以及脚本。
知识星球原定价:50元/年(服务时间为一年,自加入日期顺延一年)。
新年福利目前仅需:30元/年(服务时间为一年,自加入日期顺延一年)。
如何加入:扫描下方二维码,扫码付费即可加入
信安旅程
扫描上方二维码 | 获取更多精彩内容