AIS3 課程中所發現的 Zeroday RCE 問題

Introduction

這篇文章是為了記錄一下 AIS3 期間的學習歷程,至於這篇由於偏筆記,而且沒什麼特別的成果,所以就用中文稍微紀錄一下而已 😂。

此篇由來是今年七月底剛參加完了 AIS3,而今年的 AIS3 在結束的時候需要專題發表,而我的組別是網頁安全,所以就想來做個白箱安全的議題,嘗試在 GitHub 中開源且接受安全漏洞回報的 repo 上挖洞,雖然我個人覺得成果蠻差的 QQ,不過至少還是紀錄一下。

Target

phpwcms 1.9.33 on GitHub

在評估時間跟實力後,我只找了一個知名度較低的 CMS 框架,雖然 GitHub 上的 Star 數不高(撰文時僅 82),但社群及作者似乎都還算活躍,近期也持續在進行更新,還有一個論壇,歷史也十分久遠(似乎超過 20 年),因此應該還是有一定的使用者。

Vulnerabilities

先講結論,最後成功找到一個 RCE 的問題以及另一個 XSS,不過 XSS 在與作者溝通後,他認為那是原本 CMS 所提供的 Feature,且只有後臺使用者可以觸發,因此不算是安全漏洞,所以最後只有回報一個漏洞。

最後與作者溝通完後,我將漏洞回報至 huntr.dev 上(一個有提供 OSS Bounty 的網站,推薦找到漏洞可以去多少賺點零錢,官方很佛,好像是自掏腰包的 🤣),也成功拿了 $6(多吃一餐,賺( •̀ ω •́ )✧),目前 report 已經公開,可以看:
https://huntr.dev/bounties/df8a3f9e-db11-4aa5-bfa9-1af1ee892f15

Details

首先,RCE 的問題只存在 Admin 可以觸發,雖然在自架 Service 時較無問題,但若是託管服務或是開放給其他使用者時,可能會造成嚴重的問題。

第二,phpwcms 的後台有分成完整權限的 Admin 以及一般權限的 User,而我原先想讓 User 利用 XSS + CSRF 去做到 Admin 權限的操作,這樣就可以讓第一點更加嚴重,但在課程結束前還沒找到可以繞過 CSRF 的方式 :(,再加上課程結束後回報給作者也如同上述所述,不算是漏洞,因此這邊只會講解第一個 RCE 的部分。

RCE due to Code injection

在 Control Panel 中,Admin 可以輸入一些網站的設定值,而框架會把這些設定值寫入 .php 的檔案中,而如果我們可以跳脫字串就等於可以執行任意 php 語句,也就是可以在電腦中執行任意指令。

而在過程中,雖然他有做簡單的過濾,但可以很輕易的繞過,再加上其中部分過濾的實作還打錯字,導致過濾失效。

避免 master 之後產生變化,這邊直接節錄重點 code:

1
2
// https://github.com/slackero/phpwcms/blob/master/include/inc_act/act_structure.php#L85
$sql .= "\$indexpage['acat_name'] = '". str_replace("''", "\\'", clean_slweg($_POST["acat_name"], 2000))."';\n";

可以看到上述是想把單引號前加上反斜線,讓惡意使用者無法跳脫字串,進而在字串後接上任意指令,但此處的第一個參數中,誤將 "'" 打成 "''",導致只有連續兩個單引號才會被替換成前有反斜線的單引號,甚至不用任何技巧就可以直接執行。Payload 如下:

1
'; phpinfo(); //
1
2
// https://github.com/slackero/phpwcms/blob/master/include/inc_act/act_structure.php#L109
$sql .= "\$indexpage['acat_class'] = '". str_replace("'", "\\'", $acat_class)."';\n";

而往下看幾行,發現他正確的使用了 "'",但這樣我們還是可以用反斜線繞過,只要在前述的 Payload 前加一個 \,這樣在單引號被替換後,這個反斜線就會去跳脫第二個反斜線,導致單引號還是會讓字串結束,而不是被反斜線跳脫。Payload 如下:

1
\'; phpinfo(); //

最後課程結束後回報給作者,作者超友善,不到半天時間就回應而且修好了,嚇了我一跳 🤣

Summary

作為一個開發者,不得不說這種 typo 其實還是很常見的 XDD,而且雖然會寫測試,但這種通常都是測試測不出來的,很需要 reviewer 去抓出來,沒抓出來就會出事,這也是開源的好處ㄅ owob

雖然在 CTF 中,常常會遇到各種類似的跳脫問題,不過這還是我第一次回報 Bounty,又可以同時對 OSS 做貢獻,蠻有趣的經驗,希望以後有空再來挖大一點的專案(?