0X00 前情提要

前段時(shí)間火爆一時(shí),隨著-3.5到4的發(fā)布,誕生出了很多基于API密鑰調(diào)用服務(wù)的第三方開(kāi)源項(xiàng)目。但是不安全的問(wèn)題也隨之出現(xiàn),使用者怎么保護(hù)好自己的API密鑰不被惡意攻擊者獲取,變得尤為重要。

上月某日html調(diào)用chatGPT,網(wǎng)上出現(xiàn)了一款開(kāi)源的第三方項(xiàng)目來(lái)調(diào)用服務(wù)() ,其中某論壇放出了具有后臺(tái)管理功能的二開(kāi)源碼,于是下載了源代碼,在相關(guān)文件中發(fā)現(xiàn)后臺(tái)未嚴(yán)格過(guò)濾用戶輸入的字符,可導(dǎo)致API接口密鑰泄露和獲取權(quán)限。

0x01 代碼分析

先看下作者原版的代碼,是沒(méi)有.php這個(gè)文件的,而二開(kāi)版本中也就是通過(guò)這個(gè)文件實(shí)現(xiàn)了所謂的后臺(tái)管理功能。

image

下圖是二開(kāi)版本的源碼

image

打開(kāi).php文件,可以看到進(jìn)行后臺(tái)操作,需要通過(guò)標(biāo)頭的形式進(jìn)行后臺(tái)用戶登錄驗(yàn)證的,同時(shí)源代碼中還寫(xiě)了后臺(tái)的登錄用戶名和密碼。

image

訪問(wèn) ,并且登錄成功html調(diào)用chatGPT,只有更新API Key和更新代理兩個(gè)功能。但是不論是該源碼的原始版本還是這個(gè)二開(kāi)版本,都是不需要數(shù)據(jù)庫(kù)就可以直接運(yùn)行的,所以它既然能更新Key不排除是寫(xiě)入到了本地文件中再進(jìn)行調(diào)用的。

image

通過(guò)查看其它文件,印證了前面的推斷。每次通過(guò)后臺(tái)更新的Key被覆蓋寫(xiě)入了.php文件里的$變量中了。

image

再來(lái)看下.php文件中關(guān)于更新KEY這部分的代碼,標(biāo)簽中name屬性定義的值為,再使用預(yù)定義的$變量拿到標(biāo)簽傳進(jìn)來(lái)的值,也就是用戶輸入的Key,使用函數(shù)正則匹配.php文件中原Key值的位置并替換為新key的值html調(diào)用chatGPT,整個(gè)更新key的過(guò)程沒(méi)有發(fā)現(xiàn)有對(duì)人機(jī)接口做字符過(guò)濾或長(zhǎng)度限制。

image

0x02 獲取思路

a.使用echo函數(shù)打印.php中的變量獲取API Key。

b.使用注釋法令其部分php代碼部分無(wú)法正常解析,插入新的PHP代碼從而獲取API Key。

0x03 Key密鑰獲取

');echo $OPENAI_API_KEY;/*

image

此時(shí)我們?nèi)ピL問(wèn)下存放API密鑰的.php這個(gè)文件,已成功回顯sk-開(kāi)頭的密鑰了。

image

下圖為沒(méi)插入構(gòu)造語(yǔ)句時(shí),訪問(wèn).php文件返回的頁(yè)面

image

');?>/*

image

image

0x04 寫(xiě)入思路

既然能通過(guò)調(diào)用變量獲取API密鑰,那么寫(xiě)馬進(jìn)去是不是也能執(zhí)行呢?嘗試了下顯然沒(méi)有達(dá)到預(yù)期效果,相關(guān)函數(shù)會(huì)執(zhí)行,但到瀏覽器前端不解析了,直接加載出了html代碼,分析下原因應(yīng)該是PHP文件中出現(xiàn)了多個(gè)

免責(zé)聲明:本文系轉(zhuǎn)載,版權(quán)歸原作者所有;旨在傳遞信息,不代表本站的觀點(diǎn)和立場(chǎng)和對(duì)其真實(shí)性負(fù)責(zé)。如需轉(zhuǎn)載,請(qǐng)聯(lián)系原作者。如果來(lái)源標(biāo)注有誤或侵犯了您的合法權(quán)益或者其他問(wèn)題不想在本站發(fā)布,來(lái)信即刪。