php之變數覆蓋漏洞講解

2021-09-06 19:30:17 字數 4396 閱讀 9403

1.變數沒有初始化的問題(1):

wooyun連線1:[link href="wooyun: phpcms v9 member表內容隨意修改漏洞"]tenzy[/link] 

$updateinfo['password'] = $newpassword;裡面的陣列沒有初始化類似這樣的賦值,我們在挖洞的時候搜尋類似updateinfo這樣的關鍵字看看 

是否初始化,如果沒有。。。且register_global=on支援 

可以提交 

updateinfo[amount]這樣的陣列隨意修改自己的餘額、點數、會員組、vip等一切存放在member表的資訊. 

修復:$updateinfo = array();

變數沒有初始化的問題(2):

wooyun連線2:[link href="wooyun: stcms的乙個sql注射"]zvall[/link] 

裡面說明了繞過程式的防禦,這個是導致注入的乙個因素. 更多因素是因為where變數沒有初始化! 

case 'list': 

$totalnum = $mysql->numtable("member", $where);

where沒初始化 導致可執行任意sql語句 

修復:在類呼叫前加上$where='';

我們在挖洞的時候搜尋類似where這樣的關鍵字看,看看是否初始化. 

變數沒有初始化的問題(3): 

wooyun連線3: [link href="wooyun: joomla變數覆蓋導致註冊提權漏洞"]牛奶坦克[/link] 

// 這個地方獲取使用者註冊資訊,post進來的jform陣列,但是沒有詳細指定 

$requestdata = jrequest::getvar('jform', array(), 'post', 'array'); 

$data = (array)$this->getdata(); 

// 遍歷出註冊資訊 

foreach ($temp as $k => $v)

看似沒問題的可是二維陣列的特性可以覆蓋住: 

jfrom[groups]=7,利用foreach的問題覆蓋掉groups陣列,變成7(administrator)。

修復:像wooyun連線1那樣$updateinfo['password'] = $newpassword類似這樣賦值。 或者檢查陣列是否為二維。 

2.核心**配置問題引發變數覆蓋:

dedecms:例子(1): 

一. 了解php超級全域性變數

下面是php的超級全域性變數,可以了解乙個特性,全是陣列。 

$globals, 所有全域性變數陣列 

$_server, 伺服器環境變數陣列 

$_get,通過get方法傳遞給指令碼的變數陣列 

$_post, 通過post方法傳遞給指令碼的變數陣列 

$_cookie,cookie變數陣列 

$_request,所有使用者輸入的變數陣列,包括$_get, $_post和$_cookie所包含的輸入內容 

$_files,與檔案上傳相關得變數陣列 

$_env,環境變數陣列 

$_session,會話變數陣列 

二:理解$_get變數

可以寫個php來看看: 

<?php 

var_dump($_get); 

?>

訪問/test.php?key=value

得到array(1)

ok,看到這裡應該明白了,$_get就是個陣列,我們用get方法可以傳乙個陣列。 

再訪問 

/test.php?key[arr1]=value

得到array(1) }

我們通過get方法傳入了乙個巢狀陣列。 

到這裡其實問題就出來了,很多php安全資料都沒提過get傳巢狀陣列的這個特性,偶爾在幾個exploit裡看到 - -! 

三. 深入跟進dedecms全域性變數註冊漏洞

真正理解了$_get變數後,我們來深入跟進這個漏洞產生的真正原因,模擬一下漏洞的全過程: 

提交乙個巢狀陣列: 

/test.php?_post[globals][cfg_dbname]=x 

array(1) } }

假如資料傳入了dedecms程式,在第一層過濾,dedecms會檢查$_request裡有沒有全域性變數的關鍵字,但我們的key 

是_post且是個陣列,所以輕鬆繞過。 

foreach($_request as $_k=>$_v) 

}

接著進入真正的註冊變數流程,按順序是先從$_get變數註冊的,我們的key是(_post),第一輪遍歷$_get成功註冊 

了變數$_post,第二輪遍歷$_post成功註冊了變數$globals ! 

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

= _runmagicquotes($_v); 

}

到這裡漏洞的原因就清楚了,程式通過$_get註冊了$_post,通過$_post註冊了$globals! 

四. 領悟漏洞後的修補

完全領悟這個漏洞後,就會知道怎麼修補了。 

1. 可以看看discuz是怎麼做的,當發現key的第乙個字元存在_就不註冊變數。 

foreach(array('_cookie', '_post', '_get') as $_request) != '_' && $$_key = daddslashes($_value); 

} }

2. dedecms可以用下面的方法臨時修補,當遍歷$_post註冊變數,發現變數名存在globals就會阻止註冊變數。 

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

$ = _runmagicquotes($_v); 

} }

例子exp:織夢**後台/login.php?dopost=login&validate=dcug&userid=賬號&pwd=密碼& _post[globals] 

[cfg_dbhost]=mysql外鏈ip&_post[globals] [cfg_dbuser]=mysql的賬號&_post[globals][cfg_dbpwd]=mysql的密碼& _post[globals] 

[cfg_dbname]=自己的dedecms的資料庫

dedecms:例子(2): 突破官網補丁(雞助)

0x5sec

為什麼超全域性變數$_request沒有讀取到$_cookie的引數呢?這個是php 5.3以後php.ini預設設定 

request_order = "gp",所以***!如果你修改request_order = "gpc",$_request應該就可以接受到引數了! 

所以如果php是大於5.3的,變數覆蓋漏洞應該可以再次利用!

checkrequest($_request);//這裡檢查變數是否合法 漏洞缺陷!$_cookie的引數根本不鳥他。。。 

更多連線: 

3.yaseng php變數覆蓋例項:

yaseng 介紹得很詳細了,各種突破. 

對於dedecms例子2中:有部分人說& _post[0xhex 16進製制][cfg_dbhost] //globals這樣能繞過? 本人測試多次不成功,可能是某些問題,也可能 

是假的. 

PHP 變數覆蓋漏洞

php中的變數覆蓋漏洞 變數覆蓋 自定義的引數值替換原有變數值的情況稱為變數覆蓋漏洞 經常導致變數覆蓋漏洞場景有 開啟了全域性變數註冊 使用不當 extract 函式使用不當 parse str 函式使用不當 import request variables 使用不當等。在 php5.3 之前,預設...

PHP變數覆蓋漏洞小結

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

變數覆蓋漏洞

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