产生原因:
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 <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注入了
文章浏览阅读1.2w次,点赞7次,收藏41次。一、什么是慢查询慢查询,顾名思义,执行很慢的查询。有多慢?超过long_query_time参数设定的时间阈值(默认10s),就被认为是慢的,是需要优化的。慢查询被记录在慢查询日志里。慢查询日志默认是不开启的。如果需要优化SQL语句,就可以开启这个功能,它可以让你很容易地知道哪些语句是需要优化的。1️⃣show variables like 'slow_query_log';查询是否开启慢查询日志【开启慢查询sql:set global slow_query_log = 1/on;】【关闭慢查询sq_慢查询
文章浏览阅读1.7k次,点赞2次,收藏7次。shiro 通过redis实现session共享共享Session目的在分布式服务的工程中,一个服务器断了,负载均衡服务器会把请求分配给其他的服务器,如果设置了session共享,就不需要用户再次登录了.shiro实现session共享的原理默认的情况下,shiro的session是在服务器上的,当该服务器宕掉了,session就不存在了,用户必须重新登录,如果我们把shiro的session存到redis服务器上,就可以实现session共享了.如何实现?如果我们想通过redis实现shiro_shiro simplesession
文章浏览阅读6.2k次,点赞10次,收藏27次。虽然已经11月了,离数学建模成绩出来已经很久,但是之前一直忙着做项目,忘记写了,然后简单讲一下经历 ,比赛是中秋放假那三天,别人回家的回家,我们交了300块在实验室里面肝,唉,作孽啊。讲一下前提哈,我们学校今年特别dog,往年一般都会有暑假的数学建模培训,虽然没啥用,但起码有啊,今年他就没了,他就没了。。。。你信嘛,然后结果出来我们学校很理所应当地没有一个队伍拿国奖。我运气好,勉强拿了个省二,还..._2019数学建模b题“同心协力”
文章浏览阅读1.8w次。版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://pp99nn.blogbus.com/logs/46943583.htmljavascript在浏览器本地和与服务器通讯方面都有优异的表现。使用javascript对本地文件进行操作实际上是有一点技术后退的感觉。毕竟桌面应用程序微软的、java的已经相当成熟了。不过用javascript做点小程序来处理本地事务,在没有java或者MFC开发环境的时候还是很方便的。_ts读取本地txt
文章浏览阅读2k次,点赞3次,收藏9次。数字图像处理(冈萨雷斯)——第二章数字图像基础一、视觉感知要素1.1人眼的结构1.2亮度适应和辨别二、光和电磁波谱三、图像感知和获取四、图像取样和量化五、像素间的一些基本关系六、数字图像处理所用数学工具介绍一、视觉感知要素虽然数字图像处理这一领域建立在数学和概率公式表示的基础上,但人的直觉和分析在选择一种技术而不选择另一种技术时会起核心作用,这种选择通常是基于主观的视觉判断做出的。1.1人眼的结构人眼分辨细节的能力与当前电子传感器是可以类比的眼睛由三层膜包裹:角膜与巩膜外壳、脉络膜和视网膜。_数字图像处理电子书
文章浏览阅读2.4k次。https://github.com/limneos/classdump-dyld/blob/master/iphoneheaders/iOS7.0.3/System/Library/Internet%20Plug-Ins/QuickTime%20Plugin.webplugin/FigPluginView.h_classdumpdyld
文章浏览阅读96次。2016年8月6日 星期六 --出埃及记 Exodus 16:6So Moses and Aaron said to all the Israelites, "In the evening you will know that it was the LORD who brought you out of Egypt,摩西,亚伦对以色列众人说,到了晚上,你们要知道是耶和华将你们从埃及地领出..._出埃及记16
文章浏览阅读1.8k次,点赞4次,收藏7次。已剪辑自: https://www.cnblogs.com/lsm-boke/p/12657791.html一、架构**架构即软件架构,**是有关软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计。软件体系结构是构建计算机软件实践的基础,简单来说,软件架构是一个系统的草图,是一种设计方案,将客户的不同需求抽象成为抽象组件,各个组件之间的连接则明确和相对细致地描述组件之间的通讯。在实现阶段,这些抽象组件被细化为实际的组件,比如具体某个类或者对象。_比较架构模式,设计模式,惯用法的区别和联系
文章浏览阅读1.1k次,点赞4次,收藏23次。总之,词嵌入是一种有助于RNN模型理解文本语义的技术,而RNN则用于在文本生成任务中考虑文本的顺序和上下文信息,从而生成连贯的文本。文本挖掘是从文本数据中提取有用信息的过程,通常包括文本预处理、特征提取和建模等步骤。:选择合适的机器学习或深度学习算法,根据任务类型进行建模,例如文本分类、情感分析、主题建模等。:使用标注好的数据集训练模型,并使用评估指标(如准确度、F1分数、均方误差等)来评估模型性能。函数将使用RNN模型生成文本,它会根据先前生成的文本以及上下文信息来预测下一个单词。_文本挖掘
文章浏览阅读2.7k次。oracle 11g2 一个数据文件在同一个时刻仅属于同一个表空间,仅属于同一个数据库。TEMP文件是一类在临时表空间中被使用的特殊数据文件。 当数据库创建或重用i一个数据文件——操作系统文件被重用和初始化——被一个规则的二进制零所填充。这些初始化不会发生在临时文_如何使用oracle创建表空间,数据文件命名为
文章浏览阅读2.4k次,点赞3次,收藏14次。script>name : '烟雨平生',age : 20,sex : "男"_json语法
文章浏览阅读140次。本教程是关于Maya中Python编辑基础核心技术训练视频教程,时长:超过20小时,大小:3.1 GB,MP4高清视频格式,教程使用软件:Maya,附源文件,作者:Geordie Martinez,共8个章节,语言:英语。分享Autodesk Maya是美国Autodesk公司出品的世界顶级的三维动画软件,应用对象是专业的影视广告,角色动画,电影特技等。Maya功能完善,工作灵活,易学易用,制作效..._learn python inside maya