sqli-labs:less-32(宽字节注入)

2023-10-29

 

宽字节注入

产生原因:

1、mysql 在使用 GBK 编码的时候,会认为两个字符为一个汉字,例如%aa%5c 就是一个汉字(前一个 ascii 码大于 128 才能到汉字的范围)

2、mysqli_real_escape_string() 函数转义在 SQL 语句中使用的字符串中的特殊字符。

mysqli_real_escape_string(*connection,escapestring*)
connection 必需。规定要使用的 MySQL 连接
escapestring 必需。要转义的字符串。编码的字符是 NUL(ASCII 0)、\n、\r、\、'、" 和 Control-Z。

返回已经转义的字符串。

3、addslashes() 函数返回在预定义的字符前添加反斜杠的字符串。

预定义字符是:

  • 单引号(')

  • 双引号(")

  • 反斜杠(\)

  • NULL

提示:该函数可用于为存储在数据库中的字符串以及数据库查询语句准备合适的字符串。

注释:默认情况下,PHP 指令 magic_quotes_gpc 为 on,对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。不要对已经被 magic_quotes_gpc 转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。


addslashes(string)

利用条件:

如果在使用PHP连接MySQL的时候,又设置了“set character_set_client = gbk" 时又会导致一个编码转换的注入问题,也就是我们所熟悉的宽字节注入。当存在宽字节注入漏洞时(存在addslashes等函数转义),注入参数里带入%df%27(解码为�’),即可把程序中过滤的 \ ( %5c)吃掉。

利用方法

PHP 自带一些转义特殊字符的函数,如addslashes()mysql_real_escape_string()mysql_escape_string()等,这些函数可用来防止 SQL 注入。

id=1'or'1'='1,单引号本用来闭合语句,这些函数会自动转义这些闭合的单引号,在这些单引号前面加上转义符\,变为1\'or\'1\'=\'1,如此在 SQL 查询中是一个普通的字符串,不能进行注入。

而网站在过滤'的时候,通常的思路就是将'转换为\',因此我们在此想办法将'前面添加的\去掉,一般有两种思路:

  • %bb吃掉``\ 如果程序的默认字符集是GBK`等宽字节字符集,就有可能产生宽字节注入,绕过上述过滤。 若在 PHP 中使用`mysql_query("set names gbk")`将默认字符集设为`GBK`,而使用`addslashes()`转义用户输入,这时如果用户输入`%bb%27`,则`addslashes()`会在`%27`前面加上一个`%5c`字符,即转义字符`\。 而 MySQL 在使用GBK编码时,会认为两个字符为一个汉字,%bb%5c是一个宽字符(前一个 ASCII 码大于 128 才能到汉字的范围),也就是,也就是说%bb%5c%27=籠',这样单引号就未被转义能闭合语句,从而产生 SQL 注入。%bb并不是唯一一个可以产生宽字节注入的字符,理论上%81-%FE均可。

  • 过滤\'中的\ 构造%bb%5c%5c%27`,`addslashes()`会在两个`%5c`和`%27`前都加上`\%5c,变为%bb %5c%5c %5c%5c %5c%27,但宽字符集认为%bb%5c是一个字符即,则变为%bb%5c %5c%5c %5c%5c %27籠\\\\',四个\正好转义为两个\,即'未被转义。这也是 bypass 的一种方法。

出现这个漏洞的原因是在PHP连接MySQL的时候执行了如下设置:

set character_set_client = gbk

告诉MySQL服务器客户端来源数据编码是GBK,然后MySQL服务器对查询语句进行GBK转码导致反斜杠\被%df吃掉。 而一般都不是直接设置character_set_client=gbk,通常的设置方法是SET NAMES 'gbk',但其实SET NAMES 'gbk'不过是比character_set_client gbk多干了两件事而已,即

mysql_query( "SET NAMES gbk");

SET NAMES 'gbk'等同于如下代码:

character_set_client 客户端使用的编码,如GBK, UTF8 比如你写的sql语句是什么编码的。
character_set_results 查询返回的结果集的编码(从数据库读取的数据是什么编码的)。
character_set_connection 连接使用的编码

这同样也是存在漏洞的。

下面对宽字节注入进行一个简单测试。 测试代码如下:

<?php
$conn=mysql_connect('localhost', 'root', '123456');
mysql_select_db("test", $conn);
mysql_query("SET NAMES 'gbk'", $conn);
$uid=addslashes($_GET['id']);
$sq1="SELECT * FROM userinfo where id=' $uid'";
$result=mysql_query($sq1, $conn);
print_r('当前SQL语句: '.$sql.'<br />结果: ');
print_r (mysql_fetch_row(Sresult));
mysql_close() ;
​

当提交/1.php?id=%df' union select 1,2,3,4%23时,成功注入的效果如图4-3所示。 在这里插入图片描述 在代码审计中,对宽字节注入的挖掘方法也比较简单,只要搜索如下几个关键字即可:

SET NAMES

character_set_client=gbk

mysql_set_charset('gbk')

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Less-32 **Bypass addslashes()**</title>
</head>

<body bgcolor="#000000">
<div style=" margin-top:70px;color:#FFF; font-size:23px; text-align:center">Welcome&nbsp;&nbsp;&nbsp;<font color="#FF0000"> Dhakkan </font><br>
<font size="5" color="#00FF00">


<?php
//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");

function check_addslashes($string)
{
    $string = preg_replace('/'. preg_quote('\\') .'/', "\\\\\\", $string);          //escape any backslash
    $string = preg_replace('/\'/i', '\\\'', $string);                               //escape single quote with a backslash
    $string = preg_replace('/\"/', "\\\"", $string);                                //escape double quote with a backslash
      
    
    return $string;
}

// take the variables 
if(isset($_GET['id']))
{
$id=check_addslashes($_GET['id']);
//echo "The filtered request is :" .$id . "<br>";

//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp);

// connectivity 

mysql_query("SET NAMES gbk");
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

	if($row)
	{
  	echo '<font color= "#00FF00">';	
  	echo 'Your Login name:'. $row['username'];
  	echo "<br>";
  	echo 'Your Password:' .$row['password'];
  	echo "</font>";
  	}
	else 
	{
	echo '<font color= "#FFFF00">';
	print_r(mysql_error());
	echo "</font>";  
	}
}
	else { echo "Please input the ID as parameter with numeric value";}
        
        

?>
</font> </div></br></br></br><center>
<img src="../images/Less-32.jpg" />
</br>
</br>
</br>
</br>
</br>
<font size='4' color= "#33FFFF">
<?php

function strToHex($string)
{
    $hex='';
    for ($i=0; $i < strlen($string); $i++)
    {
        $hex .= dechex(ord($string[$i]));
    }
    return $hex;
}
echo "Hint: The Query String you input is escaped as : ".$id ."<br>";
echo "The Query String you input in Hex becomes : ".strToHex($id). "<br>";

?>
</center>
</font> 
</body>
</html>





 

看了源码:

转义了",',\

而且输入?id=1'     ?id=1"     ?id=1\

返回页面都是一样的

输入?id=1%df'

报错

说明存在注入。

?id=1%df%27--%20#
?id=-1%df%27union select 1,database(),3--%20#
接着就是一般union注入了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sqli-labs:less-32(宽字节注入) 的相关文章

  • 如何处理PDO异常[重复]

    这个问题在这里已经有答案了 我正在尝试与PDOphp 上的类 但我在找到处理错误的正确方法时遇到了一些麻烦 我编写了以下代码
  • 确定 PHP 到目前为止执行了多长时间

    我需要确定 PHP 函数到目前为止已经运行了多长时间 有哪些选项可以确定某些 PHP 代码的运行时间 我正在使用 zend 框架 Call microtime true 函数以毫秒分辨率获取当前时间
  • 无法从 Web 主机本身以外的任何地方连接到任何 Web 主机的 MySQL 数据库

    我有 2 个不同的虚拟主机 pagodabox 000webhost 都是免费的 并且我已经设置了localhost与MySQL 我已经在他们三个上安装了 wordpress 它们在自己的域中工作得很好 即 什么时候localhostwor
  • 统计数据库中的注册用户数

    我想反映在我的网站上注册的人数 只有我拥有的代码不起作用 它让我知道它不可能 转换为字符串 另外 当我将其设置为在 HTML 中调用的函数时 我收到 connection 未定义的错误 require once connect php sq
  • Laravel 5.7:维护模式的自定义刀片模板,但不是 503.blade.php

    每次php artisan down开启后 Laravel 显示 503 页面 好的 我可以通过创建名为的新文件来自定义它503 blade php inside resources views errors 关键是 我在任何时候都不认为维
  • 如何从文件中获取整个函数

    好的 我现在正在逐行阅读一个文件 我知道文件中的每个函数名称 因为它是在 XML 文档中的其他位置定义的 应该是这样的 function function name 其中 function name 是函数的名称 我从 XML 文档中获取所
  • Mysql关于重复键更新+子查询

    使用这个问题的答案 需要 MySQL INSERT SELECT 查询具有数百万条记录的表 https stackoverflow com questions 662877 need mysql insert select query fo
  • 不区分大小写的 array_unique

    我正在尝试编写几行代码来创建一个不区分大小写的数组唯一类型函数 这是我到目前为止所拥有的 foreach topics as value lvalue strtolower value uvalue strtolower value if
  • MySQL 将表的校验和存储在另一个表中

    语境 我们有包含大量表的大型数据库 他们中的大多数 99 都使用innodb 我们希望有一个日常流程来监视哪个表已被修改 当他们使用 innodb 的值时Update time from SHOW table STATUS from inf
  • SQL 查询结果为字符串(或变量)

    是否可以将SQL查询结果输出到一个字符串或变量中 我的php和mysql不好 假设我有数据库 agents 其中包含列 agent id agent fname agent lname agent dept 使用此查询 sql SELECT
  • Chart.js - 使用 mysql 和 php 从数据库获取数据

    我正在尝试将静态数据转换为使用数据库结果 我将使用MySQL and PHP 示例代码 var randomScalingFactor function return Math round Math random 100 var lineC
  • Symfony 4 生产模式错误处理页面内存耗尽

    我将我的项目设置为prod模式在 env除了自定义错误页面之外的所有内容似乎都有效 我将此作为我的 404 树枝模板 templates bundles TwigBundle Exception error404 html twig inc
  • 类 Doctrine\Common\Collections\ArrayCollection 不是有效的实体或映射的超类

    我有三个实体 特征值 php
  • WordPress 子主题覆盖父主题包括

    我正在创建 WordPress 子主题 需要覆盖某些小部件模板 我正在尝试使用此方法来覆盖父主题调用 覆盖主题功能的正确方法 http www venutip com content right way override theme fun
  • 一次用 \r\n & \n & \r 分解字符串? [复制]

    这个问题在这里已经有答案了 我想按行分割字符串 但我希望它基于所有主要使用的换行符 n r n r 并返回一个包含每一行的数组 您可以使用正则表达式和preg split http php net preg split反而 lines pr
  • 如何下载临时文件

    我正在尝试创建一个简短的 PHP 脚本 该脚本采用 JSON 字符串 将其转换为 CSV 格式 使用fputcsv 并使该 CSV 可作为下载的 csv 文件使用 我的想法是使用tmpfile 不用担心 cronjobs 或磁盘空间不足 但
  • 使用多个 WHERE 子句更新 Codeigniter 中的批次

    我查看了 CI 用户指南来了解如何处理update batch 并且它似乎只接受一个索引来匹配要更新的行 但在我的例子中 我需要指定两个索引 例如lang and id page我一起用作索引 这样的lang en id page 115是
  • 为什么 0.5 mod 0.1 在不同的编程语言中结果不同?

    我有一个关于模数的问题 模运算求一个数除以另一个数的余数 我原本期望 0 5 0 1 0 的结果 但是当我在 PHP 或 net 中运行它时 我得到 0 1 我运行的 php 代码是 var dump fmod 0 5 0 1 在 net中
  • 如何缩短 PHP if 语句?

    我有一个 if 语句 我需要将单个字符串与许多不同的选项进行比较 我在下面发布的代码非常清楚地表明了我的意思 我知道有两种方法可以做到这一点 但另一种甚至更长 那么 是否有任何函数可以以更短的方式实现类似的功能 我的要求可能看起来很愚蠢 但
  • MySqlConnectionStringBuilder - 使用证书连接

    我正在尝试连接到 Google Cloud Sql 这是一个 MySql 解决方案 我能够使用 MySql Workbench 进行连接 我如何使用 C 连接MySqlConnectionStringBuilder 我找不到提供这三个证书的

随机推荐

  • QT对话框去掉帮助和关闭按钮

    建了一个对话框 我不想把边框去掉 只想去掉关闭按钮 setWindowFlags windowFlags Qt WindowCloseButtonHint Qt WindowContextHelpButtonHint 结果那个问号的按钮去掉
  • 使用ExcelJS快速处理Node.js爬虫数据

    什么是ExcelJS ExcelJS是一个用于处理Excel文件的JavaScript库 它可以让你使用JavaScript创建 读取和修改Excel文件 以下是ExcelJS的一些主要特点 支持xlsx xlsm xlsb xls格式的E
  • 【剑指Offer59 - I】滑动窗口的最大值

    题目描述 2021 3 26 给定一个数组 nums 和滑动窗口的大小 k 请找出所有滑动窗口里的最大值 示例 输入 nums 1 3 1 3 5 3 6 7 和 k 3 输出 3 3 5 5 6 7 解释 滑动窗口的位置 最大值 1 3
  • Laravel collection break continue

    背景 Laravel框架中循环我们都推荐使用 collect 进行循环 但是如果我们想要在循环中 break 或者 continue 直接break或者continue 语法层面会直接报错 那么怎么才能实现上述所要的效果呢 其实在循环中 r
  • 基于MIV的神经网络变量筛选----基于BP神经网络的变量筛选

    基于MIV的神经网络变量筛选 基于BP神经网络的变量筛选 清空环境变量 clc clear 产生输入 输出数据 设置步长 interval 0 01 产生x1 x2 x1 1 5 interval 1 5 x2 1 5 interval 1
  • 黑苹果不能收到系统更新通知修复

    问题现象 最近黑苹果12 6 升级到 13 1 后 13 2 系统发布后 检查系统更新 显示当前系统为最新版本 没有收到系统更新通知 解决方案 OpenCore Configurator 编辑器 把misc security secureB
  • 动态规划python实现

    什么叫动态规划问题 考虑一个场景 当你有去沙漠旅行 你有一个背包和一些物品 背包有最大承受重量 物品也有重量和价值 而物品种类很多 不可能全都装在背包里 如何去选取价值总量最高的物品组合呢 物品价值表 物品名 价值 water 10 boo
  • Scala基础介绍

    Scala是一门主要以Java虚拟机 JVM 为目标运行环境 并将面向对象和函数式编程有机的结合在一起 因为Scala运行于JVM上 所以Scala可以访问任何Java类库 并且能够与Java框架进行互操作 Scala既有动态语言的灵活简洁
  • Javacv在Windows下正常运行,在Linux上报异常~Could not initialize class org.bytedeco.javacv.FFmpegFrameGrabber

    1 问题描述 今天来分享一个违背Java跨平台的问题 在学习Java第一课老师肯定就是吹嘘Java如何强大 如何跨平台 如何一次编译 到处执行 本文就遇见了在本地windows环境开发没有问题 在Linux的服务器上运行各种异常 这不是有点
  • NodeJs session中间件 及应用(简单的登录与登出)

    session中间件用于为了保存用户数据提供一个session管理器 虽然session中的数据与cookie分开保存 但是session中的数据经过加密处理后默认保存在一个cookie中 因此 在使用session中间件之前必须使用cok
  • layui 中的一些问题

    使用layui 版本号2 4 5 在引入js css之后 1 水平导航栏二级菜单一直不能显示 解决办法 最后发现layui all js引入不能放
  • 有趣的数据结构算法2——快速排序

    有趣的数据结构算法2 快速排序 题目复述 题目分析 具体实现代码 GITHUB下载连接 题目复述 数据排序算法是一类常见算法 其适用范围深入编程的方方面面 常见的数据排序算法有冒泡排序 堆排序 简单选择排序等等 各个适用范围不同 快速排序由
  • 13-Error接口错误处理以及go Module

    Error接口和错误处理 Go语言中的错误处理和其他语言不一样 它把错误当成一种值来处理 更强调判断错误 处理错误 而不是一股脑的catch错误 error接口 Go语言中把错误当成一种特殊的值来处理 不支持其他语言的try catch 捕
  • 【matlab】常用快捷键汇总

    记录自己常用的快捷键 冲冲冲 命令行窗口的常用快捷键 上下光标键 调用Matlab最近使用过的历史命令 便于快速重新执行 编辑器的常用快捷键 Ctrl R 快速注释代码段 拖动鼠标选中需要注释的代码行 Ctrl T 快速取消注释代码段 ht
  • Linux命令之tftp常用参数说明

    tftp 文件传输 实际操作 put 上传 get 下载 mode 文件传输模式 connect 连接 quit 退出 参数 g 下载文件 p 上传文件 l 本地文件名 r 远程主机文件名 常用命令 tftp g r a 10 0 0 1
  • ROS2 驱动思岚G4雷达(ydlidar)- Rviz显示

    记录G4雷达的配置 系统环境为 Ubuntu22 04 配置步骤 1 安装雷达SDK 2 构建 G4 雷达 ROS2 项目工程文件 3 使用Rviz可视化界面显示 1 安装雷达SDK 1 1 安装CMake YDLidar SDK需要CMa
  • 从服务器上复制文件复制不出来的,从远程服务器上复制文件

    从远程服务器上复制文件 内容精选 换一换 问题描述 将在x86平台上经过sh加密的XXX sh x文件复制到基于鲲鹏的服务器中 无法执行 例如 将test sh x从x86平台复制鲲鹏平台云服务器执行 test sh x回显内容如下 问题原
  • 毕设分享javaWeb的网络考试系统的设计与实现

    文章目录 1 项目简介 2 实现效果 3 系统设计 4 关键代码 5 论文概览 6 最后 1 项目简介 Hi 各位同学好呀 这里是L学长 今天向大家分享一个今年 2022 最新完成的毕业设计项目作品 毕设分享javaWeb的网络考试系统的设
  • C#this关键字的四种用法

    用法一 this代表当前类的实例对象 namespace Demo public class Test private string scope 全局变量 public string getResult string scope 局部变量
  • sqli-labs:less-32(宽字节注入)

    宽字节注入 产生原因 1 mysql 在使用 GBK 编码的时候 会认为两个字符为一个汉字 例如 aa 5c 就是一个汉字 前一个 ascii 码大于 128 才能到汉字的范围 2 mysqli real escape string 函数转