php審計基礎四 變數覆蓋

2021-07-23 02:06:19 字數 2451 閱讀 3083

(1)extract()函式:

extract() 函式從陣列中將變數匯入到當前的符號表。

該函式使用陣列鍵名作為變數名,使用陣列鍵值作為變數值。針對陣列中的每個元素,將在當前符號表中建立對應的乙個變數。

當**是:

<?php

$b=3;

$a=array('b'=>'1');

extract($a);

print_r($b);

b的值被覆蓋,輸出的值變成1

當缺陷**為:

<?php

$b=3;

$a=$_get["a"];

extract($a);

print_r($b);

當瀏覽器傳入:http://localhost:8000/fugai.php?a[b]=10000 時

b的值被覆蓋,輸出值變成 10000

當extract的第二個引數變為:extr_skip,即:extract($a,extr_skip);

就可以不覆蓋變數的值了

當extract的第二個引數為extr_refs變數也會被覆蓋

當實驗**為

<?php 

$b=3;

$a=array('b'=>'1');

extract($a, extr_refs);

print_r($b);

輸出為1

當實驗**為:

<?php 

$b=3;

$a=$_get['a'];

extract($a, extr_refs);

print_r($b);

當輸入test.php?a[b]=123時

輸出為123

(2)parse_str函式

parse_str() 函式把查詢字串解析到變數中。

注釋:如果未設定 array 引數,則由該函式設定的變數將覆蓋已存在的同名變數。

當**是:

<?php

$b=3;

$a="b=200";

parse_str($a);

print_r($b);

b的值同樣會被覆蓋,然後b輸出200

當缺陷**為:

<?php

$b=3;

$a=$_get["a"];

parse_str($a);

print_r($b);

當瀏覽器訪問這樣的url:http://localhost:8000/fugai.php?a=b=10000 時,就會把b的值覆蓋,從而輸出 10000

(3)import_request_variables:

import_request_variables 函式可以在 register_global = off 時,把 get/post/cookie 變數匯入全域性作用域中。

將 get/post/cookie 變數匯入到全域性作用域中。如果你禁止了 register_globals,但又想用到一些全域性變數,那麼此函式就很有用。

ps:這個只用於:php4.1到5.4之間

當缺陷**為:

<?php

$b=1;

import_request_variables('gp');

print_r($b);

在瀏覽器傳入http://localhost:8000/fugai.php?b=22

就會覆蓋b的值

(4)$$變數覆蓋

php 的引用允許你用兩個變數來指向同乙個內容

考慮乙個**:

$a="abc"; 

$b =&$a;

echo $a;//這裡輸出:abc

echo $b;//這裡輸出:abc

$b="efg";

echo $a;//這裡$a的值變為efg 所以輸出efg echo $b;//這裡輸出efg

這裡的$a和$b都指向同乙個變數了

在考慮乙個缺陷**:

$a=1;

foreach (array('_cookie','_post','_get') as $_request)

}echo $a;

當瀏覽器傳遞訪問:http://localhost:8000/fugai.php?a=555

輸出的的值為555

為什麼會導致變數覆蓋呢?重點在$$符號,從**中我們可以看出$_key為cookie,post,get中的引數,比如提交?a=1,則$key的值為a,而還有乙個$在a的前面,結合起來則是$a=addslashes($_values);所以這樣會覆蓋已有的變數$a的值

在這段**之前的變數都可以覆蓋掉

PHP審計基礎

php核心配置 register globals 全域性變數註冊開關 設定為on時,把get post的變數註冊成全域性變數 php 5.4.0中移除 allow url include 包含遠端檔案 設定為on時,可包含遠端檔案 php 5.2後預設為off allow url fopen 開啟遠...

PHP變數覆蓋

register globals用來註冊全域性變數 當register globals全域性變數設定開啟時,傳遞過來的值會被直接註冊為全域性變數而使用,這會造成全域性變數覆蓋 新版本沒有這個東西了,大概在5.2版本以後就消失了php version 5.2 parse str name bill a...

PHP 變數覆蓋 extract

這個函式 是因為看了下 phpcms 前台 getshell 發現這些函式果然乙個都不能漏。該函式官方文件 在此 多翻官方文件,好多人跟我說過這個習慣 原因 無非是 變數覆蓋,至於 能造成什麼危害 就看下邊 怎麼寫了。int extract array array int flags extr ov...