【旧正月なので、過去記事を毎日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 の脆弱性の可能性
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; }); }
脆弱性の証明
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 ライブラリのバージョンに関係します。
当局はまだこの問題に気づいていません。