php 5.3.9 漏洞,PHP-5.3.9远程执行任意代码漏洞(CVE-2012-0830) 详解

这个新的修复方法初衷是好的, 但是却带来一个严重的问题(5.3.10中已经修复), 这个问题最初是由Stefan Esser发现的. 请看之前(5.3.9)最终的修复方案(php_register_variable_ex):

代码如下

while (1) {

if (zend_symtable_find(symtable1, escaped_index, index_len + 1, (void **) &gpc_element_p) == FAILURE

|| Z_TYPE_PP(gpc_element_p) != IS_ARRAY) { //(3)

if (zend_hash_num_elements(symtable1) <= PG(max_input_vars)) { // (4)

if (zend_hash_num_elements(symtable1) == PG(max_input_vars)) {

php_error_docref(NULL TSRMLS_CC, E_WARNING, "Input variables exceeded %ld. ...", PG(max_input_vars)); // (1)

}

MAKE_STD_ZVAL(gpc_element);

array_init(gpc_element);

zend_symtable_update(symtable1, escaped_index, index_len + 1, &gpc_element, sizeof(zval *), (void **) &gpc_element_p);

}

//......

}

//.....

symtable1 = Z_ARRVAL_PP(gpc_element_p); // (2)

goto plain;

}< li>

注意到, 如果此时注册一个数组变量(在GET中类似于: a[]=2), 并且此时这个变量刚好是第max_input_vars个变量的时候, 会触发一个警告(1), 此时一切正常.

但是, 如果此时还是注册一个数组变量,但是这个变量已经是第max_input_vars + 1个变量的时候, 那么此时gpc_element_p将成为一个未初始化的指针, 而因为现在逻辑会继续走, 也就会走到(2)号位置, 导致解引用了一个未初始化的指针. 于是, Boomb~

那么, 到目前位置, 我们就可以使用这样的特性来对5.3.9做Ddos了. 如果Server开启了Core Dump的话, 这个效果会非常明显.

然而, 这个问题还会导致一个更严重的问题:

还是上面的代码, 在最外层有一个循环, 这个循环起作用的时刻在注册类似于a[b]=2的pair对的时候, 循环将会执行俩次, 第一次插入a[], 第二次往a[]中插入b. 然后再让我们注意下(3), 如果在目的数组中找不到一个想要的元素, **或者这个元素不为数组**, 则也会直接导致流程留到(2), 于是问题就出现了.

对于这样的POST串(默认max_input_vars是1000):

1=1&1=2&..........&999=1&x="我是恶意的string"&x[0]=

会发生什么事情呢?

让我来一步一步描述下:

1. 从1到999没什么问题, 都被正常插入

2. x是1000个元素, 所以触发警告, 也没有问题, x被插入

3. x[0]插入的时候, (3)号语句判断发现不是Arrary于是进入if体, 但是此时(4)号语句失败, 于是流程最终流到了(2)

4. 此时, gpc_element_p指向x, 也就是那个我们伪造的字符串….

现在让我们看看关键的数据结构, zval:

代码如下

struct _zval_struct {

/* Variable information */

zvalue_value value; /* value */

zend_uint refcount__gc;

zend_uchar type; /* active type */

zend_uchar is_ref__gc;

};< li>

然后看zvalue_value:

代码如下

typedef union _zvalue_value {

long lval; /* long value */

double dval; /* double value */

struct {

char *val;

int len;

} str;

HashTable *ht; /* hash table value */

zend_object_value obj;

} zvalue_value;< li>

zvalue_value是一个联合体, 于是我们构造的字符串区域的内存, 就会被当做一个Hashtable结构体:

代码如下

typedef struct _hashtable {

uint nTableSize;

uint nTableMask;

uint nNumOfElements;

ulong nNextFreeElement;

Bucket *pInternalPointer; /* Used for element traversal */

Bucket *pListHead;

Bucket *pListTail;

Bucket **arBuckets;

dtor_func_t pDestructor; //注意这个

zend_bool persistent;

unsigned char nApplyCount;

zend_bool bApplyProtection;

#if ZEND_DEBUG

int inconsistent;

#endif

} HashTable;< li>

在Hashtable结构体中, 有一个pDestructor, 这个指针指向一个函数, 当这个Hashtable中有元素要被清除的时候, 就会调用它…

也就是说, 你可以随心所欲的设置一个地址(pDestructor), 然后让PHP去调用它(诱使一个元素被删除).

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/529370.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java中随机数边界问题,java 简单Dice问题(随机数的运用)

[java]代码库/*** Dice Write a program that simulates rolling two dice using the following* steps: 1. Prompt the user for the number of sides for two dice. 2. “Roll” the* dice three times by generating a random number between 1 (inclusive) and the* number…

php 正则替换 ubb,php实现过滤UBB代码的类

本文实例讲述了php实现过滤UBB代码的类。分享给大家供大家参考。具体如下&#xff1a;PHP代码如下&#xff1a;class Day{function ubb($Text) { /// UBB代码转换//$Texthtmlspecialchars($Text);//$Textereg_replace("\r\n","",$Text);$Textereg_rep…

java单词测试,java单词 - 在线打字测试(dazi.kukuw.com)

java单词贡献者&#xff1a;15533470608类别&#xff1a;英文 时间&#xff1a;2018-08-04 22:32:16 收藏数&#xff1a;20 评分&#xff1a;0返回上页举报此文章请选择举报理由&#xff1a;广告/谣言/欺诈政治敏感色情/违法信息垃圾文章其他收藏到我的文章改错字public static…

java vector list,Java基础之:List——ArrayList Vector

Java基础之&#xff1a;List——ArrayList & VectorArrayList简单介绍ArrayList实现了List接口&#xff0c;底层是一个数组&#xff0c;并实现了可变的功能。底层属性(transient Object[] elementData;)在序列化时&#xff0c;忽略该属性。ArrayList实现了List接口&#xf…

java建立线性表的链式结构,数据结构学习----线性表的链式表示(Java实现)

线性表接口LList&#xff1a;package com.clarck.datastructure.linked;/*** 线性表接口LList&#xff0c;描述线性表抽象数据类型&#xff0c;泛型参数T表示数据元素的数据类型** author clarck**/public interface LList {/*** 判断线性表是否空* return*/boolean isEmpty();…

php prepare 批量,PreparedStatement批处理

PreparedStatement批量更新关键代码 无 import java.sql.Connection;import java.sql.PreparedStatement; //...String sql "insert into employee (name, city, phone) values (?, ?, ?)";Connection connection new getConnection();PreparedStatement pPrepa…

钉钉 php 推送,微信模板推送,钉钉信息推送

上午的时候看到有朋友需要微信推送&#xff0c;正好我也需要&#xff0c;之前一直用 Server 酱的&#xff0c;但是最近用不了&#xff0c;想找一个替代品&#xff0c;一开始准备选择钉钉&#xff0c;除了打卡&#xff0c;我很少使用钉钉&#xff0c;邮件提醒是备用方案&#xf…

java repaint 重画图形,学习笔记:WINDOWS的图形重绘基础

OnPaint()与OnDraw()的区别&#xff1a;OnPaint是WM_PAINT的消息响应函数&#xff0c;在MFC的基类里OnPaint函数调用了OnDraw()函数。OnPaint函数另外还调用了OnPrepareDC()函数。如果在窗口子类覆盖了OnPaint函数&#xff0c;当MFC调用我们重写的OnPaint函数时&#xff0c;就调…

php定义数据表类,phpwind中的数据库操作类

phpwind中的数据库操作类2021-01-22 20:12:15141/*来源&#xff1a;phpwind.net*/ClassDB{var$query_num0;functionDB($dbhost,$dbuser,$dbpw,$dbname,$pconnect0){$this->connect($dbhost,$dbuser,$dbpw,$dbname,$pconnect);}functionconnect($dbhost,$dbuser,$dbpw,$dbnam…

涡轮机叶片matlab强度分析论文,一种基于MATLAB及Pro_E的涡轮建模方法

自动化与控制与二一种基于&#xff2d;&#xff21;&#xff34;&#xff2c;&#xff21;&#xff22;及&#xff30;&#xff52;&#xff4f;&#xff0f;&#xff25;的涡轮建模方法王智明(中海油服油田技术事业部北京&#xff11;&#xff10;&#xff11;&#xff11;&am…

基于matlab的传热学虚拟实验开发,基于MATLAB的传热学课程虚拟实验软件的开发

215教育现代化2018 年 12 月第 49 期 教育信息技术 基于 MATLAB 的传热学课程虚拟实验软件的开发 周永利&#xff0c;李友荣&#xff0c;石万元&#xff0c;张力元&#xff0c;杨晨&#xff0c;卞煜&#xff0c;王国强&#xff0c;李俊&#xff0c;包键 ( 重庆大学 低品位能源利…

java做 binggo,Linux启动与停止spring boot工程的脚本示例

在springboot项目启动有三种方式&#xff1a;1、运行主方法程序2、使用命令mvn spring-boot:run 在命令行运行3、使用 mvn packpage打包位jar文件以后&#xff0c;使用java -jar yourapp.jar命令行运行一般我们在开发的时候经常使用的是前面两种运行方式&#xff0c;在部署实施…

php计划任务 框架,计划任务的使用 ThinkCMF内容管理框架,做最简约的ThinkPHP开源软件...

1、先不管是是否是独立分组&#xff0c;必须在Application\common\项目名下的Conf文件夹内创建2个文件一个是tags.php(项目默认有&#xff0c;直接加入需要执行的代码即可) 一个是 crons.php。注意这两个文件名为thinkphp标准文件名&#xff0c;不可以改变tages.php内容是&…

php按文章评论数排序,zblog获取分类文章排序按指定的时间排序、评论数量排序、浏览数量排序...

Zblog PHP在1.8版本的时候想要调用多个分类的文章&#xff0c;并且按照自己的需求去排序是很简单的事情&#xff0c;很多博友也利用这个方法进行最新文章排行、热门评论文章排行等等操作&#xff0c;现在随着ZblogPHP版本的升级&#xff0c;已经封装了数据库语句&#xff0c;导…

蚁群算法matlab vrp问题车辆限重,蚁群算法MATLAB解VRP问题

Excel exp12_3_2.xls内容&#xff1a;ANT_VRP函数&#xff1a;function [R_best,L_best,L_ave,Shortest_Route,Shortest_Length]ANT_VRP(D,Demand,Cap,iter_max,m,Alpha,Beta,Rho,Q)%% R_best 各代最佳路线%% L_best 各代最佳路线的长度%% L_ave 各代平均距离%% Shortest_Rout…

java线程6种状态转换,Java线程的生命周期和各种状态转换详解

在Java中&#xff0c;任何对象都有生命周期&#xff0c;线程也不例外&#xff0c;它也有自己的生命周期。当Thread对象创建完成时&#xff0c;线程的生命周期便开始了&#xff0c;当线程任务中代码正常执行完毕或者线程抛出一个未捕获的异常(Exception)或者错误(Error)时&#…

window10怎么卸载php,window_win10怎么卸载程序?win10卸载程序教程,当win10正式版发布以后,不少 - phpStudy...

win10怎么卸载程序&#xff1f;win10卸载程序教程当win10正式版发布以后&#xff0c;不少用户将电脑升级为Windows10系统后&#xff0c;不知道该如何卸载程序&#xff0c;本篇将为大家带来win10卸载程序教程&#xff0c;希望能够帮助到大家。win10怎么卸载程序方法一&#xff1…

matlab里dcgain,制系统的时域分析

一个动态系统的性能常用典型输入作用下的响应来描述。响应是指零初始值条件下某种典型的输入函数作用下对象的响应&#xff0c;控制系统常用的输入函数为单位阶跃函数和脉冲激励函数(即冲激函数)。在MATLAB的控制系统工具箱中提供了求取这两种输入下系统响应的函数。一、时域分…

php 添加音乐,PHP网站插入音乐

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼你找对地方了&#xff0c;我是IT之家大神光卡蒋一欣。我把代码发给你&#xff0c;直接运行即可entrance\01.gif......\........\02.gif......\........\03.jpg......\........\04.jpg......\........\05.jpg......\........\06.jpg…

在oracle数据库中显示异常,Oracle数据库出现ORA-01034错误的解决方案

类型&#xff1a;数据库类大小&#xff1a;42.1M语言&#xff1a;中文 评分&#xff1a;5.0标签&#xff1a;立即下载使用Oracle数据库的朋友经常会碰到的错误ORA-3113 "end of fileon communication channel" 就是这样的一个&#xff0c;我们可以简单的把这个错误理…