php架構slim架構上存在XXE漏洞(XXE的典型存在形式)

來源:互聯網
上載者:User
【過年了,每天發一篇以前的存貨,一共七篇。】

現代cms架構(laraval/symfony/slim)的出現,導致現今的php漏洞出現點、原理、利用方法,發生了一些變化,這個系列希望可以總結一下自己挖掘的此類cms漏洞。

slim是一個設計思路超前的 知名的php輕架構 ,完美結合了psr7來設計, 至今使用者已超過100w:

在閱讀其源碼的過程中,我發現其存在一個只有在架構式CMS中才會出現的漏洞。

官方網站: http://www.slimframework.com/

漏洞詳情

這個漏洞存在於最新版(3.0)中。 首先用conposer安裝之

composer require slim/slim "^3.0@RC"

看其文檔: http://www.slimframework.com/docs/objects/request.html#the-request-body 擷取POST資料,是利用getParsedBody方法,而這個方法對POST的處理,是按照content-type來區分和解析的:

很典型的問題,在這篇文章裡也提到過: http://zone.wooyun.org/content/19908 有時候架構會幫開發人員一些他可能並不需要的『忙』,比如slimphp這裡,常規的POST的content-type為application/x-www-form-urlencoded,但只要我將其修改為application/json,我就可以傳入json格式的POST資料,修改為application/xml,我就可以傳入XML格式的資料。 這個特性將會導致兩個問題:

  1. WAF繞過
  2. 可能存在的XXE漏洞

WAF繞過這個肯定不用說了,常規的WAF一般只檢測application/x-www-form-urlencoded的資料,一旦修改資料類型則將通殺各大WAF。 XXE是本漏洞的重點。 我們看到解析body的代碼:

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;        });    }

實際上解析代碼是作為回呼函數寫在Request類的構造方法裡了。 可見這裡直接調用了simplexml_load_string解析$input,造成XML實體注入漏洞。 所以,用slim framework 3.0開發的CMS,只要擷取了POST資料,都將受到此XXE漏洞的影響。

漏洞證明

編寫一個最簡單的demo頁面,只有一個擷取POST資訊並輸出的功能:

require 'vendor/autoload.php';$app = new \Slim\App();$app->post("/post", function($request, $response) {    $parsedBody = $request->getParsedBody();    print_r($parsedBody);});$app->run();

搭建在三個白帽裡: 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版本中官方就無視這個問題了。 我猜可能有兩個原因:

  1. 官方注意到了這個問 題,但認為3.0版本需求的php版本在5.5以上,而錯以為5.5以上的php就已經不存在XXE的隱患了。但實際上XML外部實體的解析,和php版本並無關係,而是和編譯時間的libxml庫版本有關。
  2. 官方尚未 注意到這個問題。

感覺前者的可能性較大。 所以解決方案也還是按照2中的方案進行。

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.