ホームページ > バックエンド開発 > PHPチュートリアル > PHP フレームワークのスリム アーキテクチャには XXE の脆弱性があります (XXE の典型的な形式)

PHP フレームワークのスリム アーキテクチャには XXE の脆弱性があります (XXE の典型的な形式)

WBOY
リリース: 2016-06-23 13:16:52
オリジナル
1160 人が閲覧しました

【旧正月なので、過去記事を毎日1記事、計7記事投稿していきます。 】

最新の cms フレームワーク (laraval/symfony/slim) の出現により、今日の PHP 脆弱性の出現ポイント、原理、利用方法にいくつかの変化が生じています このシリーズでは、私が発見したそのような cms 脆弱性についてまとめていきたいと思います。

Slim は高度な設計アイデアを備えたよく知られた PHP 軽量フレームワークであり、これまでに 100 万人を超えるユーザーがいます。はフレームワークベースの CMS 専用の抜け穴であり、 にのみ現れます。

公式 Web サイト: http://www.slimframework.com/

脆弱性の詳細

この脆弱性は最新バージョン (3.0) に存在します。 まず、composer を使用してインストールします

composer には、slim/slim "^3.0@RC" が必要です

POST を取得するには、そのドキュメントを参照してください: http://www.slimframework.com/docs/objects/request.html#the-request-body data は getParsedBody メソッドを使用し、このメソッドは content-type に従って POST を区別して解析します。

この投稿でも言及されている非常に典型的な問題です: http://zone.org/content/ 19908 フレームワークは、必要のない「ヘルプ」を開発者に提供することがあります。たとえば、slimphp では、通常の POST の content-type は application/x-www-form-urlencoded です。 application/jsonに変更するとPOSTデータをjson形式で渡すことができ、application/xmlに変更するとXML形式でデータを渡すことができます。 この機能は次の 2 つの問題を引き起こします:

WAF のバイパス

XXE の脆弱性の可能性
  1. 言うまでもなく、従来の WAF は通常、データ型が指定された場合、application/x-www-form-urlencoded データのみを検出します。が変更されると、すべての主要な WAF が強制終了されます。 XXE がこの脆弱性の焦点です。 本文を解析するコードが表示されます:
  2. public function __construct($method, UriInterface $uri, HeadersInterface $headers, array $cookies, array $serverParams, StreamInterface $body, array $uploadedFiles = [])    {        $this->originalMethod = $this->filterMethod($method);        $this->uri = $uri;        $this->headers = $headers;        $this->cookies = $cookies;        $this->serverParams = $serverParams;        $this->attributes = new Collection();        $this->body = $body;        $this->uploadedFiles = $uploadedFiles;        if (!$this->headers->has('Host') || $this->uri->getHost() !== '') {            $this->headers->set('Host', $this->uri->getHost());        }        $this->registerMediaTypeParser('application/json', function ($input) {            return json_decode($input, true);        });        $this->registerMediaTypeParser('application/xml', function ($input) {            return simplexml_load_string($input);        });        $this->registerMediaTypeParser('text/xml', function ($input) {            return simplexml_load_string($input);        });        $this->registerMediaTypeParser('application/x-www-form-urlencoded', function ($input) {            parse_str($input, $data);            return $data;        });    }
    ログイン後にコピー
  3. 実際、解析コードは Request クラスのコンストラクター内のコールバック関数として記述されます。 $input を解析するために simplexml_load_string が直接呼び出され、XML エンティティ インジェクションの脆弱性が引き起こされていることがわかります。 したがって、スリムフレームワーク 3.0 で開発された CMS は、POST データを取得する限り、この XXE 脆弱性の影響を受けます。

脆弱性の証明

POST 情報を取得して出力する関数が 1 つだけある最も単純なデモ ページを作成します:

require 'vendor/autoload.php';$app = new \Slim\App();$app->post("/post", function($request, $response) {    $parsedBody = $request->getParsedBody();    print_r($parsedBody);});$app->run();
ログイン後にコピー

3 つのホワイト ハットが組み込まれています: http://520fdc0ca2c37864f.jie.sangebaimao.com/

通常のリクエスト:

XXE 脆弱性をトリガーし、/etc/passwd を読み取ります:

脆弱性修正

slimphp2 では、公式がこれに対していくつかの処理を行っています:

/**     * Parse XML     *     * This method creates a SimpleXMLElement     * based upon the XML input. If the SimpleXML     * extension is not available, the raw input     * will be returned unchanged.     *     * @param  string                  $input     * @return \SimpleXMLElement|string     */    protected function parseXml($input)    {        if (class_exists('SimpleXMLElement')) {            try {                $backup = libxml_disable_entity_loader(true);                $result = new \SimpleXMLElement($input);                libxml_disable_entity_loader($backup);                return $result;            } catch (\Exception $e) {                // Do nothing            }        }        return $input;    }
ログイン後にコピー

バージョン 3.0 で公式が無視した理由はわかりません。問題。 理由は 2 つあると考えられます:

公式はこの問題に気づいていますが、バージョン 3.0 で必要な PHP バージョンは 5.5 以降であると信じており、5.5 以降の PHP には XXE の隠れた危険性がないと誤解しています。しかし実際には、XML 外部エンティティの解析は PHP のバージョンとは関係なく、コンパイル時の libxml ライブラリのバージョンに関係します。

当局はまだこの問題に気づいていません。
  1. 私は前者の可能性が高いような気がします。 したがって、解決策は引き続き 2 の解決策に従うことになります。

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