热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

php去掉多字节_PHP多字节编码漏洞小结

如果小结中有理解错误的地方,麻烦大家提出。漏洞本质:php使用php_escape_shell_cmd这个函数来转义命令行字符串时是作为单字节处理的而当

如果小结中有理解错误的地方,麻烦大家提出。漏洞本质:

php 使用 php_escape_shell_cmd这个函数来转义命令行字符串时是作为单字节处理的

而当操作系统设置了GBK、EUC-KR、SJIS等宽字节字符集时候,将这些命令行字符串传递给MySQL处理时是作为多字节处理的先看个简单的例子

header('Content-type: text/html; charset=gbk');

//连接MySQL

$conn = mysql_connect("localhost", "root", "");

//选择数据库

mysql_select_db("test", $conn);

//设置字符集编码

mysql_query("SET CHARACTER SET 'gbk'", $conn);

//创建DEMO表如果不存在

mysql_query("CREATE TABLE IF NOT EXISTS `demo` (

`uid` int(10) NOT NULL AUTO_INCREMENT,

`username` varchar(32) NOT NULL,

`password` varchar(32) NOT NULL,

PRIMARY KEY (`uid`)

) ENGINE=MyISAM DEFAULT CHARSET=gbk AUTO_INCREMENT=1;", $conn);

//插入个测试数据

mysql_query("REPLACE INTO `demo` VALUES('','admin','admin888') ",$conn);

//获取用户输入

$username = isset($_REQUEST['username']) ? $_REQUEST['username'] : '';

//执行查询并且DEBUG

$sql = "SELECT * FROM demo WHERE username = '{$username}' LIMIT 1";

echo "sql: ".$sql."
";

$res = mysql_query($sql, $conn);

$row = mysql_fetch_array($res);

echo "result:
";

var_dump($row);

?>当GPC=OFF时:username未经任何过滤,这是个典型的字符型SQL注入测试地址:http://localhost/gbk.php?username=' or 1%23http://localhost/gbk.php?username=' or 0%23当然很多情况下GPC=OFF时候都会使用一些函数来过滤用户的输入

// 对用户传入的变量进行转义操作

if (!get_magic_quotes_gpc())

{

$username = addslashes($username);

}看上去貌似没问题了,但是由于多字节编码问题,同样还是可以注入的测试地址:http://localhost/gbk.php?username=%df%27使用mysql_real_escape_string函数对用户输入进行转义存在同样的问题目前的很多开源的系统都是通过设置客户端的字符集为二进制来防止多字节编码问题的。

//使用上面这句来替换DEMO中的 mysql_query("SET CHARACTER SET 'gbk'", $conn);

mysql_query("SET character_set_connection=gbk, character_set_results=gbk, character_set_client=binary", $conn);再次测试:http://localhost/gbk.php?username=%df%27OK,这样一来,多字节编码问题就不存在了吗?不见得当使用mb_convert_encoding、iconv对字符集进行错误的转换时候,漏洞再次的出现了(GPC=ON时问题同样存在)例如:

$username = iconv('gbk','utf-8',$username);

$username = mb_convert_encoding($username,'utf-8','gbk');来看下T00ls上看到的ECSHOP 2.6.x/2.7.x GBK版本的漏洞吧漏洞文件在api/checkorder.php line 28

$sql = "SELECT COUNT(*) ".

" FROM " . $ecs->table('admin_user') .

" WHERE user_name = '" . trim($_REQUEST['username']). "' AND password = '" . md5(trim($_REQUEST['password'])) . "'";我们来看下$_REQUEST['username'] 的获取过程

$_REQUEST['username'] = json_str_iconv($_REQUEST['username']);json_str_iconv()这个函数在includes/lib_base.php中定义,其功能是将非UTF-8编码的字符串进行转换,然后return ecs_iconv('utf-8', EC_CHARSET, $str);ecs_inonv这个函数也在 includes/lib_base.php中定义,看下函数吧:

function ecs_iconv($source_lang, $target_lang, $source_string = '')

{

static $chs = NULL;

/* 如果字符串为空或者字符串不需要转换,直接返回 */

if ($source_lang == $target_lang || $source_string == '' || preg_match("/[\x80-\xFF]+/", $source_string) == 0)

{

return $source_string;

}

if ($chs === NULL)

{

require_once(ROOT_PATH . 'includes/cls_iconv.php');

$chs = new Chinese(ROOT_PATH);

}

return $chs->Convert($source_lang, $target_lang, $source_string);

}先是引入了includes/cls_iconv.php这个文件,然后实例化了Chinese这个类,在调用类的Convert的方法见line 127

$string = $this->_convert_iconv_mbstring($this->SourceText, $this->config['target_lang'], $this->config['source_lang']);又调用了另外一个函数_conver_iconv_mbstring见line 278

//这里错误的吧字符集从gbk转为了utf8,所以漏洞产生了

$return_string = @mb_convert_encoding($string, $target_lang, $source_lang);

小编推荐:欲学习电脑技术、系统维护、网络管理、编程开发和安全攻防等高端IT技术,请 点击这里注册账号,公开课频道价值万元IT培训教程免费学,让您少走弯路、事半功倍,好工作升职加薪!

免责声明:本站系公益性非盈利IT技术普及网,本文由投稿者转载自互联网的公开文章,文末均已注明出处,其内容和图片版权归原网站或作者所有,文中所述不代表本站观点,若有无意侵权或转载不当之处请从网站右下角联系我们处理,谢谢合作!



推荐阅读
  • 延迟注入工具(python)的SQL脚本
    本文介绍了一个延迟注入工具(python)的SQL脚本,包括使用urllib2、time、socket、threading、requests等模块实现延迟注入的方法。该工具可以通过构造特定的URL来进行注入测试,并通过延迟时间来判断注入是否成功。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了Java后台Jsonp处理方法及其应用场景。首先解释了Jsonp是一个非官方的协议,它允许在服务器端通过Script tags返回至客户端,并通过javascript callback的形式实现跨域访问。然后介绍了JSON系统开发方法,它是一种面向数据结构的分析和设计方法,以活动为中心,将一连串的活动顺序组合成一个完整的工作进程。接着给出了一个客户端示例代码,使用了jQuery的ajax方法请求一个Jsonp数据。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • 如何在php文件中添加图片?
    本文详细解答了如何在php文件中添加图片的问题,包括插入图片的代码、使用PHPword在载入模板中插入图片的方法,以及使用gd库生成不同类型的图像文件的示例。同时还介绍了如何生成一个正方形文件的步骤。希望对大家有所帮助。 ... [详细]
  • Windows7企业版怎样存储安全新功能详解
    本文介绍了电脑公司发布的GHOST WIN7 SP1 X64 通用特别版 V2019.12,软件大小为5.71 GB,支持简体中文,属于国产软件,免费使用。文章还提到了用户评分和软件分类为Win7系统,运行环境为Windows。同时,文章还介绍了平台检测结果,无插件,通过了360、腾讯、金山和瑞星的检测。此外,文章还提到了本地下载文件大小为5.71 GB,需要先下载高速下载器才能进行高速下载。最后,文章详细解释了Windows7企业版的存储安全新功能。 ... [详细]
author-avatar
蒲哟独CrRz
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有