SQL注入详解(宽字符注入) 第二集
时间:2016-11-26 13:40 来源:转载 作者:sqler 点击:次
前言 建议没看第一集的童鞋可以先看第一集:SQL注入漏洞详解 第一集 0x01 前言 又回来了,今天讲讲宽字节注入。 0x02 简介 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而导致的注入漏洞。具体原理如下: 0x03 使用GBK编码
[AppleScript] 纯文本查看 复制代码
当我们正常请求这个网站的时候,数据库执行的是 select * from news where id = '1' ![]() 我们按照上节课讲的加个单引号,我们看是什么样子 ![]() 看到,我们输入的变成了 select * from news where id = '1\'' ,在mysql里面,反斜杠\是转义符,相当于,把我们输入的1' 拿到数据库有没有匹配的项。 那这样我们是不是没有办法注入了? 那么本节课的重点就来了。因为数据库使用的是GBK的编码,\的编码是%5c 我们可以使用%df来吃掉它,那什么叫吃掉呢? %df%5c在GBK编码中是属于一个字符"運",我我们输入id=1%df%27的时候,程序检测到有单引号(%27),就默认在它前面加了一个转义符\(%5c) 数据库查询的就是 select * from news where id = '1%df%5c%27' 之前说过,%df%5c = 運 这样我们的%27也就是单引号就逃出转义了,我们又是可以构造注入语句了 ![]() 我们来测试一下 ![]() 现在这种写法已经很少了,有些程序员有这个安全意识,就把代码改成了这样 GBK转UTF-8:
[AppleScript] 纯文本查看 复制代码
我们来看看,关键的代码
[AppleScript] 纯文本查看 复制代码
原理其实跟前言里第2条是一样的,我们输入%df%27时首先经过上面提到的单引号转义变成了%df%5c%27(%5c是反斜杠\),然后%df%5c 正好属于gbk的汉字编码范围,经过iconv转换到utf-8编码转换后变成了汉字“運”,从而吞掉了反斜杠使得单引号逃脱出来。 ![]() 0x04 utf-8转gbk 测试代码
[AppleScript] 纯文本查看 复制代码
这里我们就要用点逆向思维了 这里我们思考下“錦”这个字,它的utf-8编码是e98ca6,它的gbk编码是e55c,而上面提到过反斜杠\正好为5c。 所以如果我们将title设置为:錦’,首先经过addlashes函数或GPC对单引号转义变为:錦\’,然后会经过icnov函数会对”錦”转化为 gbk编码,最后就是:%e5%5c%5c%27。反斜杠被转义了(%5c%5c),从而单引号逃逸出来就会引发注入漏洞。 ![]() 实验一下,我们看到报错 分析一下报错信息 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''\xE5\\''' at line 1 ''\xE5\\''' \xE是属于一个字符,这就多出了一个\,反斜杠是转义符,\\',这样的话,转义符就转义了第二个\,导致单引号逃出来,我们就可以继续注入了 ![]() (责任编辑:蜗蜗侠) |