宽字节注入原理_sqlmap宽字节注入

宽字节注入原理_sqlmap宽字节注入在mysql中,用于转义的函数有addslashes,mysql_real_escape_string,mysql_escape_string等,还有一种情况是magic_quote_gpc,不过高版本的PHP将去除这个特性。首先,宽字节注入与HTML页面编码是无关的,笔者曾经看到<metacharset=utf8>就放弃了尝试,这是一个误区,SQL注入不是XSS。虽然他们中编码的成…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

在mysql中,用于转义的函数有addslashes,mysql_real_escape_string,mysql_escape_string等,

还有一种情况是magic_quote_gpc,不过高版本的PHP将去除这个特性。

首先,宽字节注入与HTML页面编码是无关的,笔者曾经看到

<meta charset=utf8>

就放弃了尝试,这是一个误区,SQL注入不是XSS。虽然他们中编码的成因相似,不过发生的地点不同。

很多网上的材料都说程序使用了宽字节来处理程序,却又不指出具体是指什么程序。本文就介绍一下具体

漏洞发生的原理与简单的利用。在这里我们限定使用的语言是PHP5.4,数据库MYSQL5.6。

涉及到的一些概念

字符、字符集与字符序

字符(character)是组成字符集(character set)的基本单位。对字符赋予一个数值(encoding)

来确定这个字符在该字符集中的位置。

字符序(collation)指同一字符集内字符间的比较规则。

UTF8

由于ASCII表示的字符只有128个,因此网络世界的规范是使用UNICODE编码,但是用ASCII表示的字符使用UNICODE并不高效。

因此出现了中间格式字符集,被称为通用转换格式,及UTF(Universal Transformation Format)。

宽字节

GB2312、GBK、GB18030、BIG5、Shift_JIS等这些都是常说的宽字节,实际上只有两字节。

宽字节带来的安全问题主要是吃ASCII字符(一字节)的现象。

MYSQL的字符集转换过程

1. MySQL Server收到请求时将请求数据从character_set_client转换为character_set_connection;

2. 进行内部操作前将请求数据从character_set_connection转换为内部操作字符集,其确定方法如下:

• 使用每个数据字段的CHARACTER SET设定值;

• 若上述值不存在,则使用对应数据表的DEFAULT CHARACTER SET设定值(MySQL扩展,非SQL标准);

• 若上述值不存在,则使用对应数据库的DEFAULT CHARACTER SET设定值;

• 若上述值不存在,则使用character_set_server设定值。

将操作结果从内部操作字符集转换为character_set_results。

重点:宽字节注入发生的位置就是PHP发送请求到MYSQL时字符集使用character_set_client设置值进行了一次编码。

PHP测试代码:

b6c494739269bbcf6062f4348b83cbbe.gif

<!DOCTYPE html><meta charset=”gbk”><!–仅用于基础的显示,换成utf8也行就是不好看–><?php

error_reporting(0);$conn =mysql_connect(‘127.0.0.1′,’root’,”);mysql_select_db(‘mysql’,$conn);mysql_query(“set names gbk”);//不安全的编码设置方式$res =mysql_query(“show variables like ‘character%’;”);//显示当前数据库设置的各项字符集while($row =mysql_fetch_array($res)){var_dump($row);}$user =addslashes($_GET[‘sql’]);//mysql_real_escape_string() magic_quote_gpc=On addslashes() mysql_escape_string()功能类似$sql =”SELECT host,user,password FROM user WHERE user='{$user}'”;echo $sql.'</br>’;if($res =mysql_query($sql)){while($row =mysql_fetch_array($res)){var_dump($row);}}else{echo “Error”.mysql_error().”<br/>”;}?>

b6c494739269bbcf6062f4348b83cbbe.gif

http://localhost/xl.php?sql=root%df%27%20or%201=1%23

是可以执行成功的!

307fb8d37ba9a3111da2956972697278.png

URL解码sql=rootß’ or 1=1#

解析过程:

b6c494739269bbcf6062f4348b83cbbe.gif

$_GET[‘sql’]经过addslashes编码之后带入了‘\’

1、root%df%5C%27%20or%201=1%232、带入mysql处理时使用了gbk字符集%df%5c->運成功的吃掉了%5c%27->‘单引号成功闭合

b6c494739269bbcf6062f4348b83cbbe.gif

执行了插入的sql语句。

怎么吃的:

GBK编码,它的编码范围是0x8140~0xFEFE(不包括xx7F),在遇到%df(ascii(223)) >ascii(128)时自动拼接%5c,

因此吃掉‘\’,而%27、%20小于ascii(128)的字符就保留了。

补充:

GB2312是被GBK兼容的,它的高位范围是0xA1~0xF7,低位范围是0xA1~0xFE(0x5C不在该范围内),因此不能使用编码吃掉%5c。

其它的宽字符集也是一样的分析过程,要吃掉%5c,只需要低位中包含正常的0x5c就行了。

安全过滤

上文中代码使用了mysql_query(“set names gbk”)来设置编码,其实在mysql中是推荐mysql_set_charset(“gbk”);函数来进行编码设置的,

这两个函数大致的功能相似,唯一不同之处是后者会修改mysql对象中的mysql->charset属性为设置的字符集。

同时配套的过滤函数为mysql_real_escape_string()。上面代码中列出了几个过滤的函数,他们之间的区别就是mysql_real_escape_string()

会根据mysql对象中的mysql->charset属性来对待传入的字符串,因此可以根据当前字符集来进行过滤。

同理可得

由上文可得宽字节注入是由于转编码而形成的,那具有转编码功能的函数也成了漏洞的成因。

转码函数

mb_convert_encoding()

iconv()

以下用iconv()来演示,修改上面的代码:

b6c494739269bbcf6062f4348b83cbbe.gif

<!DOCTYPE html><meta charset=”gbk”><?php

error_reporting(0);$conn =mysql_connect(‘127.0.0.1′,’root’,”);mysql_select_db(‘mysql’,$conn);mysql_set_charset(“utf8″);//推荐的安全编码$user =mysql_real_escape_string(($_GET[‘sql’]));//推荐的过滤函数$user =iconv(‘GBK’,’UTF-8′,$user);$sql =”SELECT host,user,password FROM user WHERE user='{$user}'”;echo $sql.'</br>’;$res =mysql_query($sql);while($row =mysql_fetch_array($res)){var_dump($row);}?>

b6c494739269bbcf6062f4348b83cbbe.gif

e849c239c9c6f23c191fda38cb5abeae.png

http://localhost/xl.php?sql=root%e5%27or%201=1%23

同样可以执行成功,编码解析的过程依然如上。

总结一下漏洞成因:

代码一

1、使用了不安全的字符集设置函数与过滤函数。

2、漏洞发生在PHP请求mysql时使用character_set_client值进行一次转码。

代码二

1、使用了推荐的设置函数与过滤函数。

2、解析错误发生在iconv()函数转码时,GBK转向UTF8吃掉了“\”

3、PHP请求mysql时转码安全。

另外:

当改变编码方向时

这种情况下需要两个参数来配合注入。

例如:

http://localhost/xl.php?sql=root%e9%8c%a6¶=%20or%201=1%23

d3c8cd7aa67737215ce3bc592702c0ec.png

总结:

宽字节注入跟HTML页面编码无关。

Mysql编码与过滤函数推荐使用mysql_real_escape_string(),mysql_set_charset()。

转编码函数同样会引起宽字节注入,即使使用了安全的设置函数。

参考文献

mysql字符集的设置:http://www.laruence.com/2008/01/05/12.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/182150.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 转录组fpkm是什么意思_fpkm值越大表达量

    转录组fpkm是什么意思_fpkm值越大表达量在转录组测序(RNA-Seq)中,基因的表达量是我们关注的重点。基因表达量的衡量指标有:RPKM、FPKM、TPM。RPKM:ReadsPerKilobaseMillion;说实话,这个英文说

    2022年8月3日
    41
  • pycharm2021年激活码刚出【2021.7最新】

    (pycharm2021年激活码刚出)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~TR0L…

    2022年3月22日
    58
  • Linux上端口开放常用命令[通俗易懂]

    Linux上端口开放常用命令[通俗易懂]场景系统部署在linux服务器后常需要开发指定的端口。在linux怎样对端口进行操作。注:博客:https://blog.csdn.net/badao_liumang_qizhi关注公众号霸道的程序猿获取编程相关电子书、教程推送与免费下载。实现#查看想开的端口是否已开:firewall-cmd–query-port=8888/tcp#添加指定需要开放的端口:firewall-cmd–add-port=8888/tcp–permanent#重载入添加的端口:

    2025年8月30日
    5
  • 分别以递归调用和迭代的方法求数列_迭代算法和递归算法

    分别以递归调用和迭代的方法求数列_迭代算法和递归算法对于数列,递归和迭代的联系非常紧密。a0,a1,a2,…,an−1,ana_0,a_1,a_2,…,a_{n-1},a_na0​,a1​,a2​,…,an−1​,an​数列就是一串数字,数列来源于生活,有用的数列中蕴含着规则。要完整描述一个数列,方法有二:通项公式an=f(n)a_n=f(n)an​=f(n)递推公式其中通项公式是最一般的情况。由通项公式可以求得任意一…

    2025年9月3日
    7
  • java之父

    java之父《Java》之父——詹姆斯·高斯林和麦克·舍林丹也加入了帕特里克的工作小组。他们和其他几个工程师一起在加利福尼亚州门罗帕克市沙丘路的一个小工作室里面研究开发新技术,瞄准下一代智能家电(如微波炉)的程序设计,SUN公司预料未来科技将在家用电器领域大显身手。团队最初考虑使用C语言,但是很多成员包括SUN的首席科学家比尔·乔伊,发现C和可用的API在某些方面存在很大问题。工作小组

    2022年7月7日
    31
  • C++ 使用system()实现锁定屏幕「建议收藏」

    C++ 使用system()实现锁定屏幕「建议收藏」除了使用函数“LockWorkStation()”实现锁定屏幕,参考:http://www.cnblogs.com/Satu/p/8183081.html此外,也可以使用函数“system()”来实现。IDE:Code::Blocks16.01操作系统:Windows7x641#include<windows.h>23intmain(…

    2022年7月21日
    15

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号