PHP 變數覆蓋漏洞

2022-06-20 15:39:13 字數 3849 閱讀 8364

php中的變數覆蓋漏洞

變數覆蓋----自定義的引數值替換原有變數值的情況稱為變數覆蓋漏洞

經常導致變數覆蓋漏洞場景有:開啟了全域性變數註冊、$$ 使用不當、extract() 函式使用不當、parse_str() 函式使用不當、import_request_variables() 使用不當等。

在 php5.3 之前,預設開啟;php5.3 預設關閉,php5.6 及 5.7 已經被移除

register_globals全域性變數設定開啟時,傳遞過來的值(post/get/cookie)會被直接註冊為全域性變數而使用,這會造成全域性變數覆蓋

小例子:

<?php 

if ($_get["username"] == "1ndex" and $_get["password"] == "1ndex")

if(!$authorized)

else

?>

register_globals=off時,只能通過提交正確的賬號密碼才可成功登陸,也就是register_globals=on時,可以無需賬號密碼通過驗證,只需要將變數authorized設定為即可,可為或者register_globals=off時,該方法無效

首先看到這裡:

<?php 

$a = "test";

$test = "who am i";

echo($$a);

?>

最終輸出結果是什麼?? --who am i$$a也可以寫成$,解析後就是$test也就是最終結果who am i看到這樣乙個題:

<?php 

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

}$id = isset($id) ? $id : 2;

if($id == 1)

?>

我們怎麼樣取得flag?很顯然,需要包含flag檔案

直接get/post傳參id=1即可,當執行$$_key = $_value;時,$_key="id"$$_key等價於$id,就終結果也就是$id = 1,定義了id引數,並賦值為1,也就導致了包含flag檔案

extract()函式從陣列中將變數匯入到當前的變數表。該函式使用陣列鍵名作為變數名,使用陣列鍵值作為變數值。

小例子:

<?php 

$a = array('nickname' => '1ndex');

extract($a);

echo $nickname;

?>

//執行結果為輸出 1ndex

extract(array[,flag][,prefix])三個引數:

prefix

注意 prefix 僅在 flags 的值是 extr_prefix_same,extr_prefix_all,extr_prefix_invalid 或 extr_prefix_if_exists 時需要。 如果附加了字首後的結果不是合法的變數名,將不會匯入到符號表中。字首和陣列鍵名之間會自動加上乙個下劃線。

flags引數預設為extr_overwrite,即如果有衝突,覆蓋已有的變數

小題目:

<?php 

extract($_get);

if(isset($mypwd))

}?>

答案:parse_str()函式把字串解析成多個變數。其作用就是解析字串並註冊成變數,在註冊變數之前不會驗證當前變數是否存在,所以直接覆蓋掉已有變數

注意:當magic_quotes_gpc = on,那麼在parse_str()解析之前,變數會被addslashes()轉換(也就是會被轉義,加反斜線)。

parse_str(string[,array]),兩個引數分別為:

小例子:

<?php 

$str = "first=value&arr=foo+bar&arr=baz";

parse_str($str, $output);

echo $output['first']; // value

echo $output['arr'][0]; // foo bar

echo $output['arr'][1]; // baz

?>

小題目:

<?php 

error_reporting(0);

if(empty($_get['id'])) else else

}?>

利用phphash比較缺陷(php在處理雜湊字串時,會利用!===來對雜湊值進行比較,它把每乙個以0e開頭的雜湊值都解釋為0,所以如果兩個不同的密碼經過雜湊以後,其雜湊值都是以0e開頭的,那麼php將會認為他們相同,都是0),所以,只需要找乙個字串雜湊後以oe開頭即可。

最終答案:127.0.0.1/blfg.php?id=a[0]=s878926199a

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

import_request_variables(string[,prefix]),兩個引數分別為:

小例子:

<?php 

$auth='0';

import_request_variables('g');

if($auth== 1)else

?>

答案:127.0.0.1/blfg.php?auth=1

PHP變數覆蓋漏洞小結

變數覆蓋漏洞是需要我們需要值得注意的乙個漏洞,下面就對變數覆蓋漏洞進行乙個小總結。變數覆蓋指的是可以用我們自定義的引數值替換程式原有的變數值,通常需要結合程式的其他功能來實現完整攻擊。那麼它是如何引起的?其實,大多數變數覆蓋漏洞是函式使用不當導致的。比如extract 函式和parse str 還有...

php之變數覆蓋漏洞講解

1.變數沒有初始化的問題 1 wooyun連線1 link href wooyun phpcms v9 member表內容隨意修改漏洞 tenzy link updateinfo password newpassword 裡面的陣列沒有初始化類似這樣的賦值,我們在挖洞的時候搜尋類似updateinf...

變數覆蓋漏洞

變數覆蓋指的是可以用我們自定義的引數值替換程式原有的變數值 經常引發變數覆蓋漏洞的函式有 extract parse str 和import request variables 函式 一 使用函式不當 1.extract 函式 該函式有三種情況會覆蓋掉已有變數 第一種情況是第二個引數為extr ov...