phpの変数オーバーライドホールの説明

6164 ワード

1.変数が初期化されていない問題(1):wooyun接続1:[link href="WooYun:PHPCMS V 9メンバー表内容随意修正脆弱性"]tenzy[/link]$updateinfo['password']=$newpassword;中の配列はこのような付与値を初期化していません.穴を掘るときにupdateinfoのようなキーワードを検索して初期化するかどうか見てみましょう...そしてregister_global=Onサポートは、updateinfo[amount]のような配列が勝手に自分の残高、点数、会員グループ、VIPなどを修正してメンバーテーブルに格納情報を提出することができる.修正:$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; 
}
は問題ないように見えますが、2次元配列の特性はカバーできます:jfrom[groups]=7、foreachの問題でgroups配列をカバーし、7(Administrator)になります.修復:wooyun接続1のように$updateinfo['password'] = $newpasswordのように値を付与します.配列が2 Dであるかどうかを確認します. 2.コアコード構成問題による変数オーバーライド:Dedecms:例(1):一.PHPスーパーグローバル変数の下にPHPのスーパーグローバル変数があることを理解して、1つの特性を理解することができて、すべて配列です.$GLOBALS、すべてのグローバル変数配列$SERVER、サーバ環境変数配列$GET,GETメソッドによってスクリプトに渡される変数配列$POSTは、POSTメソッドによってスクリプトに渡される変数配列$COOKIE,cookie変数配列$REQUEST、すべてのユーザーが入力した変数配列、$_を含むGET, $_POSTと$COOKIEに含まれる入力内容$FILES、ファイルアップロードに関連する変数配列$ENV,環境変数配列$SESSION、セッション変数配列2:理解$GET変数はPHPを書いてみてください:<?php 
        var_dump($_GET); 
        ?>
訪問http://www.xxx.com /test.php?key=valuearray(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にグローバル変数のキーワードはありますか?POSTは配列なので簡単に迂回できます.foreach($_REQUEST as $_k=>$_v) 
                { 
                if( strlen($_k)>0 && eregi('^(cfg_|GLOBALS)',$_k) ) 
                { 
                        exit('Request var not allow!'); 
                } 
                }
は次に、真の登録変数プロセスに入り、$_から順にGET変数に登録されていますが、私たちのKEYは(_POST)、第1ラウンド遍歴$_GETが変数$_POSTを登録することに成功し、第2ラウンド遍歴$_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); 
                } 
                }
.DEDEDECMS可$_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.html3.Yaseng php変数オーバーライド例:Yaseng 詳しく紹介されています.さまざまな突破があります.Dedecms例2:& _POST[0xHEX 16 ][cfg_dbhost] //GLOBALSは迂回できると言われています.本人のテストは何度も成功しません.いくつかの問題かもしれませんが、偽物かもしれません.
原文住所:http://zone.wooyun.org/content/1872