Facebook Ads廣告業務API介面的源代碼泄露漏洞
此前,我對「Windows NT」 和 「Windows Phone」模型有所研究,後來,我看到好多人參與了Facebook的漏洞賞金項目並收穫了獎勵,所以,我想那我也來試試吧,看看能不能入圍Facebook的白帽致謝榜,想當年我也兩次入圍微軟操作系統漏洞安全名人堂呢。
而此時,我連什麼是OWASP Top 10都一無所知,不管了,那就先試著研究一下Web滲透測試吧。之後,我認真琢磨了HTTP請求機制,閱讀了大量Web漏洞分析文章,總算找到點了門道。
發現漏洞
一個多月後,我就發現了存在Facebook Ads廣告業務系統API中的一個漏洞。存在漏洞的API是一個圖片處理介面,它用於Facebook商戶賬戶上傳廣告圖片,上傳的圖片會儲存在一個名為「/adimages」的目錄下,並用base64格式編碼。所以,我的測試構想是,在這裡的機制中,可以向上傳圖片中注入惡意Payload,經API轉換為 Base64 格式後,再被Facebook傳入伺服器中。
以下為上傳圖片的POST請求:
POST /v2.10/act_123456789/adimages HTTP/1.1
Host: graph.facebook.com
Bytes=VGhpcyBpcyBtYWxpY2lvdXMgcGF5bG9hZC4=
由於Facebook伺服器端不能有效地處理惡意Payload圖片,最終其「Image Resizing Tool」圖片處理工具返回了一個報錯,在某個JSON響應內容的異常消息中,就包括了一些PHP庫函數代碼,這些代碼來自不同的Facebook庫文件,可以肯定的是,這應該屬於Facebook源代碼的一部份。
HTTP/1.1 200 OK {「error」:{「message」:」Invalid parameter」,」type」:」FacebookApiException」,」code」:100,」error_data」:」exception 『Exception』 with message 『gen_image_rescale_multi_thrift call to shrinkImageMulti failed with fbalgo exception: 43 (43: : IDAT: invalid distance too far back)』 in /var/www/flib/resource/filesystem/upload/upload.php:1393
Stack trace:
#0 /var/www/flib/resource/filesystem/upload/upload.php(1662): gen_image_rescale_multi_thrift()
#1 /var/www/flib/ads/admanager/adupload/adupload.php(252): gen_image_rescale_multi()
#2 /var/www/flib/ads/admanager/adupload/AdImageUtils.php(195): _gen_adupload_image_resize()
#3 /var/www/flib/ads/entities/creatives/photos/AdproCreativePhotoDownload.php(53): AdImageUtils::genResizeLocalFile()
#4 /var/www/flib/platform/graph/resources/adaccount/adimages/mutators/GraphAdAccountAdImagesPost.php(134): AdproCreativePhotoDownload::addLocalFileToCreativeLibrary()
#5 /var/www/flib/core/data_structures/utils/Arrays.php(440): Closure$GraphAdAccountAdImagesPost::genImplementation#3()
#6 /var/www/flib/platform/graph/resources/adaccount/adimages/mutators/GraphAdAccountAdImagesPost.php(136): Arrays::genMapWithKey()
#7 /var/www/flib/ads/api/graph_base/GraphAdsWriteWithRedirectBase.php(22): GraphAdAccountAdImagesPost->genImplementation()
#8 /var/www/flib/ads/api/graph_base/GraphAdsWriteWithRedirectBase.php(11): GraphAdsWriteWithRedirectBase->genDoCall()
#9 /var/www/flib/core/asio/gen_utils.php(24): GraphAdsWriteWithRedirectBase->genCall()
#10 /var/www/flib/platform/api/base/ApiBaseWithTypedApiData.php(204): genw()
#11 /var/www/flib/platform/api/base/ApiBase.php(85): ApiBaseWithTypedApiData->genCallWithApiDataBase()
#12 /var/www/flib/platform/graph/core/runner/GraphApiRunnerBase.php(373): ApiBase->genMakeCall()
#13 /var/www/flib/platform/graph/core/GraphRequestProcessorBase.php(629): GraphApiRunnerBase->genCall()
#14 /var/www/flib/platform/graph/core/GraphRequestProcessorBase.php(45): GraphRequestProcessorBase->genExecuteSingleGraphRequestCore()
#15 /var/www/api/graph/server.php(168): GraphRequestProcessorBase->genExecuteSingleGraphRequest()
#16 /var/www/api/graph/server.php(174): gen_api_graph_server()
#17 /var/www/flib/core/asio/Asio.php(35): gen_api_graph_server_wrapper()
#18 (): Closure$Asio::enterAsyncEntryPoint()
#19 /var/www/flib/core/asio/Asio.php(37): HH\Asio\join()
#20 /var/www/api/graph/server.php(180): Asio::enterAsyncEntryPoint()
#21 {main}」,」error_subcode」:1487242,」is_transient」:false,」error_user_title」:」Image Resize Failed」,」error_user_msg」:」Image Resize Failed:unknown reason」,」fbtrace_id」:」EN/o9hmqwZz」},」__fb_trace_id__」:」EN/o9hmqwZz」}
在上報漏洞之前,我也做了一些諸如 ImageTragick 漏洞的PHP注入測試,沒什麼新的發現,所以我還是選擇了及時上報給了Facebook。最終,Facebook從內部修復了代碼運行機制,消除了異常處理的響應內容,堵塞了漏洞。
PoC視頻
*參考來源:
amolbaikar
,clouds編譯,轉載請註明來自FreeBuf.COM
※揭秘某遊戲公司遭DDoS勒索始末
※BOTCHAIN:第一個基於比特幣協議的功能齊全的殭屍網路
TAG:FreeBuf |