vlambda博客
学习文章列表

​ 【SQL注入必学基础】--宽字节注入




0X01 知识背景


1


 编码:

二进制:计算机内部是由集成电路这种电子部件构成的,电路只可以表示两种状态——通电、断电,也就是使用二进制存储数据。因为这个特性,计算机内部只能处理二进制。那为什么我们能在计算机上看到字母和特殊字符呢?

 ASCII码:如果我们用一个二进制数字表示一个字符,比如说用“0100 0001”来表示A。根据这个对应关系,我们制作一个表格,这个表格里一个二进制数字对应一个字符。这个表格也就是ASCII码表(百度可查)。如此~计算机就可以表示英文大小写字母了。

因为ASCII码能表示的字符只限于美式英语,为了满足世界上各个国家使用计算机的语言需求出现了GBK、unicode、utf-8,用这些编码方式使得各个国家的语言都能在计算机中表示。



2


转义

转义:所有的ASCII码都可以用“\”加数字(一般是8进制数字)来表示。而C中定义了一些字母前加"\"来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等,就称为转义字符,因为后面的字符,都不是它本来的ASCII字符意思了。

     总而言之,编码与转义就是为了在计算机中通用表示各国文字以及使用特殊字符。有了这些就可以在计算机中表示各国语言,世界各地的计算机用户即可以以愉快的使用计算机啦!!

编码转义相关的更详细的内容点击:

编码:https://www.cnblogs.com/goldsunshine/p/10775528.html

转义:https://blog.csdn.net/itzyjr/article/details/102867808




3


宽字节

 GB2312、GBK、GB18030、BIG5、Shift_JIS等这些都是常说的宽字节,实际上只有两字节,但是这比起ASCII编码方式只用一个字节来说,是多了一倍啦!宽字节带来的安全问题主要是是ASCII字符(一字节)的现象,即将两个ASCII字符误认为是一个宽字节字符。



4


addslashes函数:

​ 【SQL注入必学基础】--宽字节注入

这个函数强制在字符串后面加一个转义符("\"),在WEB代码中起到过滤的作用,也就是去掉不合法的单引号、双引号等,防止闭合,从而一定程度防止注入。


    

0X02  注入原理

前提:


 

MYSQL数据库使用GBK编码



实现原理:


 

  • 由于安全意识的提高,网站开发时会使用addslashes() 函数对输入的参数进行强行转义,使得一般的闭合字符被addslashes() 函数添加的 "\"转义,从而不能闭合,使得注入失败。

  • 由于ASCII编码使用一个字节,GBK编码使用两个字节。PHP语言编码为GBK,MYSQL编码也使用GBK编码。那么GBK这样占用字节较多的就叫宽字节编码。

  • 由于宽字节注入是利用mysql的一个特性,mysql在使用GBK编码的时候,会认为两个字符是一个汉字(前一个ASCII码要大于128,才到汉字的范围,所以使用的字符不一定只有 %df’),示例如下图:

    ​ 【SQL注入必学基础】--宽字节注入




    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  练习题演示

这里咱们就以sqlib32关演示了,后面这道题就留给大家自己做了哦~~

首先来看看源码:


​ 【SQL注入必学基础】--宽字节注入


这里很明显可以看到,参数ID被使用check_addslashes()函数转义了,假如只是用单引号闭合肯定是会失败的,不妨一试!


写入payload:

http://192.168.227.151:86/Less-33/?id=1  

页面正常显示:


​ 【SQL注入必学基础】--宽字节注入


使用单引号闭合,试一下!这里可以看到我们的单引号是被添加了“\”,查询字符串被变成了 “ 1\’ ”,也就是单引号失效了。这样情况下是不能成功注入的

​ 【SQL注入必学基础】--宽字节注入

​ 【SQL注入必学基础】--宽字节注入


相反,如果有方法让单引号成功逃逸出来,那么讲道理,咱们的注入就可成功!

输入payload:

192.168.227.151:86/Less-33/?id=1%df' and 

updatexml(1,concat(0x7e,database(),0x7e),1)  -- -


​ 【SQL注入必学基础】--宽字节注入


成功爆出数据库名!


还有一篇文章不要忘记看哟~~~



​ 【SQL注入必学基础】--宽字节注入

「安全武器库」 知识星球

​ 【SQL注入必学基础】--宽字节注入


「安全武器库」 知识星球 是一个网络安全各类安全脚本\工具整合的星球!主要分享、整理、原创编辑等网络安全相关工具以及脚本。

知识星球原定价:50元/年服务时间为一年,自加入日期顺延一年)。

新年福利目前仅需:30元/年(服务时间为一年,自加入日期顺延一年)。

如何加入:扫描下方二维码,扫码付费即可加入


信安旅程


扫描上方二维码 | 获取更多精彩内容