《Wordpress4.2.3提權與SQL注入漏洞(CVE-2015-5623)分析》要點:
本文介紹了Wordpress4.2.3提權與SQL注入漏洞(CVE-2015-5623)分析,希望對您有用。如果有疑問,可以聯(lián)系我們。
DEDECMS教程Check point也很快發(fā)出了分析,我也來分析與復現(xiàn)一下最新的這個漏洞.
DEDECMS教程0x01 GP混用造成的越權漏洞
首先,說明一下配景.wordpress中用戶權限分為訂閱者、投稿者、作者、編輯和管理員.DEDECMS教程權限最低的是訂閱者,訂閱者只有訂閱文章的權限,wordpress開啟注冊后默認注冊的用戶就是訂閱者.國內很多知名網(wǎng)站,如Freebuf,用戶注冊后身份即為“訂閱者”.
DEDECMS教程我們先看到一個提權漏洞,通過這個提權漏洞,我們作為一個訂閱者,可以越權在數(shù)據(jù)庫里插入一篇文章.
DEDECMS教程Wordpress檢查用戶權限是調用current_user_can函數(shù),我們看到這個函數(shù):
DEDECMS教程
DEDECMS教程調用的has_cap辦法,跟進
DEDECMS教程
DEDECMS教程再次跟進map_meta_cap函數(shù):
DEDECMS教程
DEDECMS教程可以見到,這個函數(shù)是真正檢查權限的.出錯誤的代碼在檢查’edit_post’和’edit_page’的部分:
DEDECMS教程
DEDECMS教程可見,這里當$post不存在的時候,直接break出switch邏輯了,后面所有檢查的代碼都沒有執(zhí)行.
DEDECMS教程$post是要編輯的文章的ID,也就是說,如果我要編輯一篇不存在的文章,這里不檢查權限直接返回.
DEDECMS教程正常情況下是沒有問題的,因為不存在的文章也沒有編輯一說了.
DEDECMS教程我們再看到后臺編輯文章的部分:/wp-admin/post.php
DEDECMS教程
DEDECMS教程這里首先獲取$_GET[‘post’],找不到才獲取$_POST[‘post_ID’],也就是可以說此時的$post_ID是來自GET的.
DEDECMS教程但我們后面調用current_user_can函數(shù)時傳入的post_ID卻是來自POST的:
DEDECMS教程
DEDECMS教程這里就是一個邏輯問題,當我們在GET參數(shù)中傳入正確的postid(這樣在get_post的時候不會產(chǎn)生錯誤),而在POST參數(shù)中傳入一個不存在的postid,那么就能夠繞過檢查edit_post權限的步驟.
DEDECMS教程但是這個邏輯錯誤暫時不能造成嚴重的危害,因為實際上編輯文章的代碼在edit_post函數(shù)中,而這個函數(shù)取的post_ID來自$_POST.
DEDECMS教程0x02獲取_wpnonce繞過CSRF防御
DEDECMS教程wordpress對于CSRF漏洞的防御措施是使用_wpnonce(也就是token),而且它的token很嚴格,不同的操作有不同的token.
DEDECMS教程好比我們這里,如果想調用edit_post函數(shù),需要經(jīng)過以下邏輯:
DEDECMS教程
DEDECMS教程check_admin_referer就是檢查_wpnonce的函數(shù),當$post_type==’postajaxpost’的時候,此時_wpnonce的名字就是“add-postajaxpost”.
DEDECMS教程那么怎么獲取名字為”add-postajaxpost”的_wpnonce呢?
DEDECMS教程看到上面一點的位置:
DEDECMS教程有個post-quickdraft-save操作.這個操作是用來臨時儲存草稿的,只要用戶拜訪這個操作,就會在數(shù)據(jù)庫post表中插入一個status為auto-draft的新文章.
DEDECMS教程如上圖畫出來的步驟,因為我們不知道名字為”add-post”的_wpnonce,所以進入到wp_dashboard_quick_press函數(shù),跟進:
DEDECMS教程
DEDECMS教程見上圖,很幸運的是,在這個函數(shù)中wordpress居然本身把此時的_wpnonce輸出在表單里了.
DEDECMS教程所以,只要我們拜訪一次post-quickdraft-save,就可以獲得add-post的_wpnonce,從而繞過check_admin_referer函數(shù).
DEDECMS教程0x03 競爭漏洞導致的邏輯漏洞
DEDECMS教程這一節(jié)實際上是這個提權洞的真正核心,在我們拿到_wpnonce后,進入edit_post函數(shù).
DEDECMS教程我們目的是去update一篇文章,但剛才0x01中說到,如果要繞過權限檢查的函數(shù),必要傳入一個“不存在”的文章id.那么即使可以執(zhí)行update,我們也不可能修改已經(jīng)存在的文章呀?
DEDECMS教程這里實際上涉及到一個由競爭造成的邏輯漏洞.看到edit_post函數(shù)代碼:
DEDECMS教程
DEDECMS教程
DEDECMS教程上面兩個圖應該很直觀了.在0x01中說到的current_user_can被繞過以后,到最終執(zhí)行update語句中間,這一段代碼的執(zhí)行時間是真空的.
DEDECMS教程比如我們傳入的tax_input=1,2,3,4…10000,那么實際上那條查詢語句就要執(zhí)行10000次,這是需要執(zhí)行很長時間的.(在我本身的虛擬機上測試,執(zhí)行10000次這條語句,大概需要5~10秒左右)
DEDECMS教程那么假設在這段時間內,有新插入的文章,那么我們之前那個“不存在”的id,不就可能可以存在了嗎(只必要把id設置為最新一篇文章id+1)?
DEDECMS教程但有個問題是,我們怎么在這段時間內插入一篇新的文章?因為在0x02中為了獲取_wpnonce,已經(jīng)執(zhí)行過post-quickdraft-save了.執(zhí)行post-quickdraft-save可以在數(shù)據(jù)庫插入一篇status為auto-draft的文章,但每個用戶最多只會插入一篇文章.
DEDECMS教程在check-point的原文中,它提到的辦法是,等待一個星期,wordpress會自動將這篇文章刪除,而_wpnonce會多保留一天,這樣在這天我們再次執(zhí)行post-quickdraft-save又可以插入一篇文章了.
DEDECMS教程我本身想了一下,其實沒必要這么麻煩.如果我們能夠再注冊一個身份為訂閱者的賬號,就可以再插入一篇文章了,所以我的POC是不需要等待一個禮拜的.
DEDECMS教程這三個漏洞組合起來,造成了一個提權漏洞.針對第一篇文章描述的提權漏洞,我寫了一個EXP,執(zhí)行后訂閱者就可以在垃圾桶內插入一篇文章:
DEDECMS教程
DEDECMS教程拜訪文章編輯頁面可以看到這篇文章:
DEDECMS教程
DEDECMS教程0x04 untrash文章時造成的SQL注入漏洞
DEDECMS教程那么,僅僅是一個這樣的提權漏洞,實際上沒有太大意義.Check-point第二篇文章里提到了一個因為這個提權漏洞導致的SQL注入.
DEDECMS教程先說這個注入的原理.
DEDECMS教程/wp-includes/post.php
DEDECMS教程
DEDECMS教程如上圖.Wordpress很多地方執(zhí)行SQL語句使用的預編譯,但僅限于直接接受用戶輸入的地方.而上圖中明顯是一個二次操作,先用get_post_meta函數(shù)從數(shù)據(jù)庫中取出meta,之后以字符串拼接的方式插入SQL語句.
DEDECMS教程這個地方造成一個二次注入.
DEDECMS教程我們來看看第一次是如何入庫的.首先wp_trash_post是將文章刪除的辦法,其中刪除文章后又調用wp_trash_post_comments將文章下的評論也刪除了:
DEDECMS教程
DEDECMS教程跟進wp_trash_post_comments函數(shù):
DEDECMS教程
DEDECMS教程如上圖,可以看到這個“comment_approved”其實也是從數(shù)據(jù)庫中取出來的.所以這個注入我稱之為“三次注入”.
DEDECMS教程那么我再繼續(xù)跟進,看看最早的comment_approved是從哪來的.
DEDECMS教程實際上看到圖中的SQL語句就大概知道了,這個comment_approved是comments(評論)表的一個字段,我分別看了新增評論、修改評論兩個函數(shù),發(fā)現(xiàn)修改評論的函數(shù)(edit_comment)中,有涉及到這個字段:
DEDECMS教程所以,這一連串操作最后造成的結果就是一個SQL注入漏洞.
DEDECMS教程總結一下1234,整個利用過程如下:
DEDECMS教程利用快速草稿插入文章->越權編輯文章->插入評論->修改評論(惡意數(shù)據(jù)入庫)->刪除文章(惡意數(shù)據(jù)進入另一個庫)->反刪除文章(惡意數(shù)據(jù)被取出,直接插入SQL語句導致注入)
DEDECMS教程0x05 原文暗藏的部分與真實利用過程的研究
DEDECMS教程這里不得不提到check-point的原文,原文的第二篇全文只字未提wordpress的token也就是_wpnonce,但wordpress后臺幾乎所有操作都必要特定的_wpnonce.在第一步中我們通過一處泄露點獲取了“add-postajaxpost”的_wpnonce,但實際上后面的每一步(增加、編輯評論、trash文章、untrash文章)都必要不同的_wpnonce,那么這些_wpnonce我們怎么獲得?
維易PHP培訓學院每天發(fā)布《Wordpress4.2.3提權與SQL注入漏洞(CVE-2015-5623)分析》等實戰(zhàn)技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養(yǎng)人才。
轉載請注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/13754.html