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去调用它(诱使一个元素被删除).

时间: 2024-08-01 14:32:42

PHP-5.3.9远程执行任意代码漏洞(CVE-2012-0830) 详解的相关文章

宝马,福特等多款品牌车辆TCUs存漏洞,可导致远程执行任意代码

本文讲的是宝马,福特等多款品牌车辆TCUs存漏洞,可导致远程执行任意代码,近日,三名安全研究人员发现了宝马,福特,英菲尼迪和日产等品牌车辆中使用的远程信息处理控制单元(TCUs)的安全漏洞. 这三名安全研究人员发现的是由大陆集团制造的远程信息处理控制单元(TCU)的安全漏洞.大陆集团总部位于德国汉诺威,世界第四大轮胎制造商,前身是创立于1871年的橡胶制造商,Continental-Caoutchouc und Gutta-Percha Compagnie. 这三名研究人员分别是来自McAfee

Allaire JRUN 2.3远程执行任意命令漏洞

JRun 涉及程序: JRUN 描述: Allaire JRUN 2.3远程执行任意命令漏洞 详细: Allaire 的 JRUN 服务器 2.3上存在一个安全漏洞,允许远程用户把在 WEB 服务器上的任意文件作为JSP代码编译/执行. 如果URL请求的目标文件使用了前缀"/servlet/",则JSP解释执行功能被激活.这时在用户请求的目标文件路径中使用"../",就有可能访问到 WEB 服务器上根目录以外的文件.在目标主机上利用该漏洞请求用户输入产生的一个文件,

Sun Java Web Server 能让攻击者远程执行任意命令&nbsp;

涉及程序: Solaris and Windows NT 描述: Sun Java Web Server 能让攻击者远程执行任意命令 详细: Sun 的 Java Web 服务器存在多个安全问题,允许攻击者远程以 web 服务器权限执行命令. 它的 Web 管理模块监听 9090 端口,通过 http 处理管理命令."com.sun.server.http.pagecompile.jsp92.JspServlet" servlet用来编译并执行JSP文件的,通过增加"/ser

网页脚本注入执行任意代码

网页脚本注入执行任意代码 --突破网页本地脚本验证方法实例 最近为了帮朋友批量查询信息,查询页面上要求输入验证码,查询结果要保存到文件.首先想到的是验证码自动识别,太复杂了.总算让我找到一个非常好的软件--<网页自动操作通用工具>,不但可以通过注入跳过验证码,还能自动批量查询并保存查询结果.现将整个过程写下来分享一下. 基本理论:网页通过浏览器执行js脚本代码,实现对用户输入信息的合法性验证,这里指的是验证码验证.由于代码是在我们的本地浏览器中执行,所以我们完全有办法控制它.一般我们可以通过这

关于动态执行代码(js的Eval)实例详解_javascript技巧

熟悉javascript的朋友对Eval()函数可能都不会陌生,我们可以用它来实现动态代码的执行,我自己甚至写过一个网页专门用来计算算术表达式的,计算能力上比google.baidu的计算器还要好一些,至少精度要高,但是如果超出了四则运算的话,表达式的形式会复杂很,比如以百度给出的例子: log((5+5)^2)-3+pi需要写成Math.log(Math.pow(5+5,2))*Math.LOG10E-3+Math.PI才能用Eval进行计算,对于这一点我还没有想到理想的解决方案.好了,这不是

session-求大神帮帮忙,有一句代码不理解,求详解,万分感谢~return

问题描述 求大神帮帮忙,有一句代码不理解,求详解,万分感谢~return 求大神重点详细地讲解下,try里的那段代码,万分感谢 `` public ZheJiuSheZhi get(int id) { Session sess = this.getSessionFactory().openSession(); try { return (ZheJiuSheZhi) sess.get(ZheJiuSheZhi.class, id); } finally { sess.close(); } }` 解

java struts2 远程执行任意java代码bug漏洞修复

漏洞前提 开启动态方法调用, struts.xml配置 <constant name="struts.enable.DynamicMethodInvocation" value="true" /> 沙盒绕过 通过ognl表达式静态调用获取ognl.OgnlContext的DEFAULT_MEMBER_ACCESS属性,并将获取的结果覆盖_memberAccess属性,这样就可以绕过SecurityMemberAccess的限制. 漏洞详情 https:/

内网漫游之如何使用JavaScript在路由器上执行任意代码

首先,让我们先来了解一下相关的技术背景. 我们都知道NAT(网络地址转换)技术,在路由器上被广泛使用.当你使用NAT路由器时,它会向你的机器自动分配一个广域网IP,以便让你的机器在互联网上唯一且可识别.同时,在你的本地局域网中,它也会随机地向你分配一个局域网IP. 这样,每当来自本地局域网的设备向公网发起请求时,路由器便会详细的记录该请求是由本地局域网中,哪个设备向哪个服务发起的请求.然后,当它成功从目标服务器获得响应时,它则会将其转发回本地局域网中IP所对应的设备.这也意味着,在大多数设置中,

Struts2 又现高危漏洞,黑客分分钟可远程执行任意系统命令【紧急预警】

    由于该漏洞影响范围较广(Struts 2.3.5 - Struts 2.3.31, Struts 2.5 - Struts 2.5.10),漏洞危害程度严重,可造成直接获取应用系统所在服务器的控制权限. 这是什么意思? 黑客可以利用该漏洞通过浏览器在远程服务器上执行任意系统命令,将会对受影响站点造成严重影响,引发数据泄露.网页篡改.植入后门.成为肉鸡等安全事件. 为什么说本次漏洞影响极大? 此前 s2-016 漏洞同样危害非常严重,多数站点已经打补丁,而本次漏洞在 s2-016 补丁后的