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

PHP-5.3.9远程执行任意代码漏洞

还记得我之前说的PHPHashCollisionsDdos漏洞吧?最初的时候,开发组给出的修复方案,采用的是如果超过max_input_vars,就报错(E_ERROR),继而导致PHP...
还记得我之前说的PHP Hash Collisions Ddos漏洞吧? 最初的时候,开发组给出的修复方案,采用的是如果超过max_input_vars,就报错(E_ERROR),继而导致PHP出错结束,而后来,为了更加轻量级的解决这个问题,我们又改善了一下,变成了如果超过max_input_vars,就发出警告(E_WARNING),并且不再往目的数组添加,但是流程继续,然后我们发布了5.3.9.

这个新的修复方法初衷是好的,但是却带来一个严重的问题(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; 
}

注意到,如果此时注册一个数组变量(在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; 
};

然后看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;

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;

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

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


本文地址:

转载随意,但请附上文章地址:-)

推荐阅读
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 本文内容为asp.net微信公众平台开发的目录汇总,包括数据库设计、多层架构框架搭建和入口实现、微信消息封装及反射赋值、关注事件、用户记录、回复文本消息、图文消息、服务搭建(接入)、自定义菜单等。同时提供了示例代码和相关的后台管理功能。内容涵盖了多个方面,适合综合运用。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了brain的意思、读音、翻译、用法、发音、词组、同反义词等内容,以及脑新东方在线英语词典的相关信息。还包括了brain的词汇搭配、形容词和名词的用法,以及与brain相关的短语和词组。此外,还介绍了与brain相关的医学术语和智囊团等相关内容。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • Echarts图表重复加载、axis重复多次请求问题解决记录
    文章目录1.需求描述2.问题描述正常状态:问题状态:3.解决方法1.需求描述使用Echats实现了一个中国地图:通过选择查询周期&#x ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • Python字典推导式及循环列表生成字典方法
    本文介绍了Python中使用字典推导式和循环列表生成字典的方法,包括通过循环列表生成相应的字典,并给出了执行结果。详细讲解了代码实现过程。 ... [详细]
author-avatar
亲家你要干啥
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有