sql注入之宽字节注入

Bugku上看到一道这方面的题,从网上看了不少资料,谈一谈自己的认识。

    题目链接:                  103.238.227.13:10083/

     sql注入之宽字节注入_第1张图片

 

               当我们在地址栏输入单引号时页面并没有报错,

sql注入之宽字节注入_第2张图片

        说明单引号应该被过滤了,转义为 \'  防止注入 

                查看源代码

                     字符编码为gb2312   

            注意: html中的编码并不影响测试,本题应该是作为提示。 html编码改成utf-8依然会实现注入

      字符编码为gb2312  该编码存在注入漏洞   可以绕过  \' 过滤

      尽管现在呼吁所有的程序都使用unicode编码,所有的网站都使用utf-8编码,来一个统一的国际规范。但仍然有很多,包括国内及国外(特别是非英语国家)的一些cms,仍然使用着自己国家的一套编码,比如gbk,作为自己默认的编码类型。也有一些cms为了考虑老用户,所以出了gbk和utf-8两个版本。   

 

通常来说,一个gbk编码汉字,占用2个字节。一个utf-8编码的汉字,占用3个字节。

GBK 向下与 GB 2312 兼容 ,可以理解为gbk是gb2312的扩展版本 。编码汉字时16进制范围可能不同。

gbk 首字节对应0×81-0xFE,尾字节对应0×40-0xFE(除0×7F),刚好涵盖了转义符号\对应的编码0×5C。

0xD50x5C 对应了汉字“诚”,URL编码用百分号加字符的16进制编码表示字符,于是 %d5%5c 经URL解码后为“诚”。

例如: 构造攻击

    url提交为:www.baidu.com/test.php?username=aaa&passwrod=bbb %d5属于首字节大于128 可以构造范围内的任意ascii码

    www.baidu.com/test.php?username=aaa%d5' %20or%201=1%23&password=bbb      %20为空格 %23为注释符号#号            

    url解码后 username=aaa 0xd5 0×27 0×20 or 0×20 1=1 0×23

    数据库调用过滤函数转义字符单引号0x27 变成0x5c0x27 0x5c为 / 字符

    gbk编码 0x5c0x27被认为是一个汉字 诚

强调一下 只要是前一个字符为大于(ascii码)128即可 0x5c被通用 可以构造不同的16进制

此时 查询语句就为 select * from user where username=aaa诚' or 1=1 #&password=bbb

即 select * from user where username=aaa诚' or 1=1 永真 成功注入

当然 utf-8编码不会出现这种情况 字符范围和字节数不同

我们再看sql注入这道题

当我们在url输入 %df' 时页面报错

sql注入之宽字节注入_第3张图片

 

繁体字被写入语句 所以开始构造,我们首先order by

 

sql注入之宽字节注入_第4张图片

页面正常

继续

sql注入之宽字节注入_第5张图片

 

开始联合查询

sql注入之宽字节注入_第6张图片

库名为sql5 继续联合查询

sql注入之宽字节注入_第7张图片

得到flag !

 

你可能感兴趣的:(CTF)