远程过程调用失败0x800706be_WordPress5.0 远程代码执行分析
本文作者:七月火
2019年2月19日,RIPS 團(tuán)隊官方博客放出 WordPress5.0.0 RCE 漏洞詳情,漏洞利用比較有趣,但其中多處細(xì)節(jié)部分并未放出,特別是其中利用到的 LFI 并未指明,之后網(wǎng)絡(luò)上很多所謂的漏洞分析文章,多數(shù)對 LFI 并未分析,遂想一探究竟,并將自己的分析過程記錄下來。
環(huán)境搭建
我們直接從 WordPress 官網(wǎng)下載 5.0 版本代碼,搭建成功后先不要登錄,因為從 3.7.0 版本開始, WordPress 在用戶登錄時,會在后臺對小版本的改變進(jìn)行更新,這樣不利于我們分析代碼。我們可以通過將 AUTOMATIC_UPDATER_DISABLED 設(shè)置成 true ,來禁止 WordPress 后臺自動更新(在 wp-config.php 文件開頭添加 define('AUTOMATIC_UPDATER_DISABLED', true); 即可)。
漏洞分析
路徑穿越漏洞
該漏洞通過路徑穿越和本地文件包含兩個漏洞的組合,最終形成遠(yuǎn)程代碼執(zhí)行。我們先來看路徑穿越問題。通過構(gòu)造如下數(shù)據(jù)包,我們即可在數(shù)據(jù)庫中插入一個惡意的路徑:
上圖中的 post 數(shù)據(jù):
&action=editpost&meta_input[_wp_attached_file]=2019/03/demo.jpeg#/../../../../themes/twentynineteen/demo.jpeg
下面我們找到具體文件,審計代碼。我們可以看到在 wp-admin/post.php 文件中,當(dāng) $action=editpost 的時候,會調(diào)用 edit_post 方法。在 edit_post 方法中,我們看到可控的 $post_data 變量,其數(shù)據(jù)來源于 $_POST ,緊接著將可控的 $post_data 變量傳入 wp_update_post 方法,具體代碼如下:
在 wp_update_post 方法中,我們看到其調(diào)用了 wp_insert_post 方法,該方法會將我們構(gòu)造的惡意路徑傳入 update_post_meta 方法中,具體代碼如下:
可以看到 update_post_meta 方法調(diào)用了 update_metadata 方法,而該方法調(diào)用了 wpdb 類的 update 方法,并將我們構(gòu)造的惡意路徑更新到數(shù)據(jù)庫中。其具體代碼如下:
更新前后, Mysql 中攻擊者上傳的圖片對應(yīng)的元信息變化如下:
至此,我們只是完成了將惡意路徑插入數(shù)據(jù)庫中,接下來我們還要讓它發(fā)揮作用。在 WordPress 中,用戶所上傳的圖片,會被保存至 wp-content/uploads/ 目錄下。而程序獲取圖片時,有兩種方法。第一種直接在 wp-content/uploads/ 目錄下尋找;第二種則是在上一種方式無法獲取圖片時,從 http://localsite/wp-content/uploads/meta_value 下載,這里的 meta_value 就是上面我們可控的地方。
接著我們再把目標(biāo)轉(zhuǎn)移到 WordPress 的裁剪圖片功能,通過該功能結(jié)合上面數(shù)據(jù)庫中的可控的圖片路徑,我們即可實現(xiàn)將上傳的圖片移動到任意路徑下。我們構(gòu)造如下數(shù)據(jù)包:(這個數(shù)據(jù)包可以在保存裁剪好的圖片時抓到,補上相應(yīng)參數(shù)即可)
上圖中的 post 數(shù)據(jù):
_ajax_nonce=29a195c152&postid=28&do=save&action=crop-image&cropDetails[x1]=0&cropDetails[y1]=0&cropDetails[width]=1200&cropDetails[height]=1200&cropDetails[dst_width]=1200&cropDetails[dst_height]=1200&id=28
跟到具體的代碼中,我們發(fā)現(xiàn)當(dāng) action=crop-image 時,程序會調(diào)用 wp_ajax_crop_image 方法對圖片進(jìn)行裁剪,具體代碼如下:
在 wp_ajax_crop_image 方法中,根據(jù) POST 中的 id 來校驗 ajax 請求數(shù)據(jù)以及判斷是否有權(quán)限編輯圖片,然后將 $_POST['cropDetails'] 中的數(shù)據(jù)傳入 wp_crop_image 方法,開始裁剪圖片,具體代碼如下:
接著我們就來到了漏洞的核心函數(shù) wp_crop_image ,由上面的代碼可知,傳入該函數(shù)的參數(shù)均來源于 POST 數(shù)據(jù),程序先根據(jù) $_POST['id'] 從數(shù)據(jù)庫中獲取圖片路徑(下圖 第5行 ),然后判斷圖片是否存在,不存在,則使用 URL 形式獲取圖片(下圖 第8-9行 )。接著選擇用于處理圖片的拓展(下圖 第16行 ),其中 Imagick 的優(yōu)先級高于 GD ,然后開始裁剪。被裁剪的圖片被命名為 'cropped-' . basename( $src_file ) ,然后為其創(chuàng)建目錄(下圖 第20-23行 ),最后調(diào)用 save 方法存入圖片。
本地文件包含漏洞
分析完路徑穿越漏洞,我們再來看看本地文件包含漏洞。由于 RIPS 官方對這個漏洞的描述一筆帶過,我們便要自己來尋找。我們直接全局搜索 _wp_page_template 關(guān)鍵字,可以發(fā)現(xiàn)如下代碼:
根據(jù)注釋內(nèi)容可知, get_page_template_slug 函數(shù)會根據(jù)傳入的 $post 變量,從數(shù)據(jù)庫中查詢并返回其對應(yīng)的模板文件名。而在 WordPress 程序運行最初,就會選擇相應(yīng)的模板文件名,并包含它,具體代碼如下:
而且在查閱代碼時,發(fā)現(xiàn) get_single_template 函數(shù)和 get_page_template 函數(shù)都調(diào)用了 get_page_template_slug 函數(shù)。由于沒有找到 get_page_template 函數(shù)的觸發(fā)點,這里暫時值分析 get_single_template 函數(shù)。
為了觸發(fā)該函數(shù),我們需要先在添加多媒體文件處上傳一個 txt 文件,然后和上面修改 _wp_attached_file 值類似,在更新文件信息處抓包并構(gòu)造如下數(shù)據(jù)包:
上圖中的 post 數(shù)據(jù):
...&action=editpost&post_type=attachment&post_ID=8&save=Update&post_name=123&meta_input[_wp_page_template]=cropped-demo.jpeg
數(shù)據(jù)最終會調(diào)用 get_single_template 函數(shù),并調(diào)用 get_page_template_slug 函數(shù)根據(jù)上面數(shù)據(jù)包中 post_ID 的值獲取模板文件名(下圖 第7行 ),接著調(diào)用 get_query_template 函數(shù),并最終將模板文件名返回到 wp-includes/template-loader.php 文件中,然后 include 包含。
PS:上圖的 load_template 方法其實也存在包含代碼,但是這里沒進(jìn)入核心函數(shù)(沒進(jìn)入下圖 第15行 ),其代碼如下:
遇到的坑
如果沒有開啟、配置 Apache 的 rewrite 模塊,會導(dǎo)致上面的 LFI 失敗(點擊 查看附件頁面 會直接 404),解決方法如下:
總結(jié)
最后用一張流程圖來總結(jié)一下本次漏洞的觸發(fā)過程吧,流程圖如下:
參考
WordPress 5.0.0 Remote Code Execution:
https://blog.ripstech.com/2019/wordpress-image-remote-code-execution/
WordPress 5.0 RCE 詳細(xì)分析:
https://paper.seebug.org/822/
Wordpress 5.0.0 遠(yuǎn)程代碼執(zhí)行漏洞分析與復(fù)現(xiàn):
https://paper.seebug.org/825/
WordPress 如何獲取頁面對應(yīng)的 page 模板 id 或者名稱:
http://www.mr-fu.com/4101/
總結(jié)
以上是生活随笔為你收集整理的远程过程调用失败0x800706be_WordPress5.0 远程代码执行分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑动态屏保_8款电脑软件,每一款都能让
- 下一篇: 谷歌浏览器同步功能无法加载_谷歌浏览器C