一處程式碼執行引發的思考
*本文作者:sjy93812,本文屬 FreeBuf 原創獎勵計劃,未經許可禁止轉載。
前言
YCCMS是一款PHP版輕量級CMS建站系統,程式頁面設計簡潔,生成靜態html,後臺功能強大,利於優化、超強收錄、超強排名,適合做關鍵詞排名、淘寶客程式,是個人、企業建站的理想選擇。最近偶然間在網際網路上看到了一個關於YCCMS程式碼執行的漏洞,詳情並沒有公開,因為有前段時間Echsop程式碼執行的事件,讓我對程式碼執行的成因很感興趣,所以我就下載了程式碼看了看。因為這個cms比較小眾影響並不會大,所以這裡直接把漏洞詳情就寫出來了。
漏洞解構
如果想做實驗請在網上自行下載YCCMS3.3也就是最新版。
搭建好環境之後,訪問一下首頁看看它載入了哪些頁面順便看一下入口。
在這裡可以看到你訪問首頁的時候,其實直接跳到了count.php檔案中執行程式碼了,這裡我們直接去看這個檔案。
這個檔案起到了一箇中轉站的作用,按照指引進入run.inc.php檔案中。
這裡使用了魔術方法,在執行檔案的時候自動將專案中的類進行了載入,並且執行了圓圈中的類裡的方法,進入這個檔案中看一下。
這裡首先呼叫了一個內部函式,看一下這個函式的作用。
這裡再回到上一個函式中。
圈中的部分作用不是很大,唯一的作用就是將這個漏洞限制在了admin這裡面,不然的話a這個引數將變成不可控的。
再接下來,就到了重點了,這裡使用了file_exists這個函式判斷一個檔案存不存在,不存在的話就執行a=index的操作,接下來就直接將使用者可控的變數傳入了eval函式中。這裡沒有進行過濾,如果能繞過file_exists函式就能達到命令執行的效果了。看一下file_exists函式:
返回值是布林值。這個函式允許傳入的路徑中含有特殊符號。具體來看一下。
這裡在ceshi1目錄下有一個檔案:
訪問測試路徑,證明檔案存在。
ofollow,noindex" target="_blank">http://127.0.0.1/test.php?a=ceshi1/1;/../2449.html 這裡加入特殊字元依然可以識別。
再加入一點符號:
這裡證明這個函式會識別一個規則就是遇到類似/../這種結構時,會將第一個斜線前面的內容當作一個目錄名來處理。
這裡也就是說分號、斜線這種是可以在這個函式中逃逸出來的。
也就是說這裡可以任意構造類似於xxx/../bbb這種結構的路徑,這裡bbb可以是圓圈中任意一個單詞。
接下來就是進入了eval這個函式。
可以看到這個函式可以直接執行php程式碼,還一個隱藏屬性就是可以執行多條語句只要以分號間隔開就可以了,那麼這裡就出現問題了。
本地測試:
回到這個cms中我們將a構造成這種形式factory();echo%201;//../。
那麼就可以執行任意的語句了,這裡解釋一下:
Factory()這個是用來閉合前面的例項化物件用的,不閉合的話這裡會直接報錯,導致後面的語句無法執行。分號結束然後就是執行了我們自定義的程式碼,然後再以分號結束。然後就是返回上級目錄為了滿足檔案存在的要求。
最終的執行效果:
*本文作者:sjy93812,本文屬 FreeBuf 原創獎勵計劃,未經許可禁止轉載。