SQL 宽字节注入详解

今天继续给大家介绍渗透测试相关知识,本文主要内容是SQLMAP插件tamper介绍。

免责声明:
本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后果自负!
再次强调:严禁对未授权设备进行渗透测试!

一、字节编码与宽字节简介

在计算机中,对字母、汉字、其他语种(例如阿拉伯语、拉丁语等)以及其他特殊符号的存储需要使用编码。当某个字符编码的大小为一个字节时,我们称这个字符编码为窄字节,而当一个字符的编码大小为两个及以上字节时,我们称这个字符编码为宽字节。
英语有26个英文字母,再加上一些特殊符号占用也不是很多,因此用窄字节类型的字符编码就可以表示,而常用的汉字就有1000多个,用一个字符无法表示,这样就必须使用宽字节。
常见的宽字节编码有GBK、GB2312等。

二、宽字节注入原理

宽字节注入的产生,就源于编码问题。在站点搭建过程中,数据库的存储需要指定编码,而PHP网站的显示也需要设置编码,当PHP网站与数据库的编码不一致时,就会在一些字符的解析上出现差异,这也就产生了宽字节注入的漏洞。如果站点PHP使用的是UTF-8的编码而数据库使用的是GBK的编码,则很大概率上存在宽字节注入的问题。
宽字节注入漏洞可以绕过站点对引号进行转义的防护。为了防止SQL注入漏洞,站点有时会在代码中加入如下函数:addslashes()、mysql_real_escape_string()、mysql_escape_string()。这些函数可以对我们输入的内容进行转义,转义的本质是在引号前面添加一个斜杠“\”,而斜杠“\”的本质(编码)又是%5C。如果数据库的编码是GBK的编码,那么两个字节被认为是一个字符,因此我们就可以通过构造合适的payload,使得斜杠%5C与前面的字符编码组合,从而绕过对后面单引号的过滤。
常见的宽字节注入payload为%DF%27,在这里,%27为单引号的字符编码。如果addslashes()等函数检测到引号,并在前面添加斜杠“\”,那么上面的payload就变成了%DF%5C%27,那么由于数据库使用的是GBK编码(一种宽字节编码),因此认为%DF%5C是一个汉字,这样我们的引号就能够正常发挥作用了。

三、宽字节注入实战

下面,我们就来进行宽字节注入的实战。
在这里,我们使用sqli_labs的第32关进行实验。我们首先来看一下sqli_labs的第32关代码,如下所示:
在这里插入图片描述
从上图中可以看出,我们上传的id参数经过了check_addslashes()函数的过滤,因此我们输入的引号会被转义,如下所示:
在这里插入图片描述
从上图中可以看出,我们输入的引号被进行了转义处理,如果我们输入如下payload:

http://127.0.0.1/sqli/Less-32/?id=-1%27%20union%20select%201,2,3--+

则由于引号被转义,因此无法执行成功,如下所示:
在这里插入图片描述
在这里,我们考虑使用宽字节注入,就可以构造如下所示的payload:

http://127.0.0.1/sqli/Less-32/?id=-1%df%27%20union%20select%201,2,3--+

在上述payload中,用%df%27来代替了单纯的单引号,该payload结果如下所示:
在这里插入图片描述
从上图中可以看出,我们的payload执行成功,使用SQL宽字节注入绕过了对单引号的转义。
原创不易,转载请说明出处:https://blog.csdn.net/weixin_40228200

猜你喜欢

转载自blog.csdn.net/weixin_40228200/article/details/126512107
今日推荐