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
看到這樣乙個題:我們怎麼樣取得flag?很顯然,需要包含<?php
foreach (array('_post','_get') as $_request)
}$id = isset($id) ? $id : 2;
if($id == 1)
?>
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
}?>
php
的hash
比較缺陷(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...