Information disclosure

資訊洩漏是指網站無意中對潛在的攻擊者洩露敏感資訊,常見的有以下:

  • 其他用戶的數據,例如用戶名或財務信息等個資
  • 敏感資料或商業數據
  • 有關網站及其基礎設施的技術詳細信息或系統敏感資訊

資訊揭露可能發生在網站內的各種情況下。以下是一些常見的來源

  • 網路爬蟲的文件
  • 目錄列表
  • 開發者評論
  • 前端代碼
  • 錯誤訊息
  • 偵錯數據
  • 透過備份文件
  • 配置不安全
  • 版本控制歷史
  • 不安全的物件存取

網路爬蟲的文件

許多網站提供文件/robots.txt/sitemap.xml來幫助爬蟲瀏覽其網站。這些檔案通常會列出爬網程式應跳過的特定目錄,因為它們可能包含敏感資訊。

從robots.txt中找到未授權功能

不小心把機敏位置留在robots中,而得到admin的入口

例如,在以下robots.txt發現敏感的URL,從而得知管理網址為https://insecure-website.com/admin

############### request ##################
GET /robots.txt
...omit...

############### response ##################
...omit...
User-agent: *
Disallow: /admin

Lab: Unprotected admin functionality


目錄列表

Web 伺服器可以設定為自動列出沒有索引頁的目錄的內容。這可以幫助攻擊者快速識別給定路徑上的資源,並直接分析和攻擊這些資源


開發者評論

部署到生產環境之前,註釋通常會被刪除。但有時可能會忘記刪除,或是故意留下註解。這些註釋包含對攻擊者有用的信息。例如,可能暗示隱藏目錄的存在或提供有關應用程式邏輯的線索。

可以使用人工搜尋,或透過工具”Target” > “Site Map” > “Engagement tools” > “Find comments”找出疑似敏感信息


前端代碼

從代碼中找到未授權功能,因為不小心把機敏位置留在程序中,而得到admin的入口,

應用程式仍可能會將 URL 洩漏給使用者。因為URL 可能會在 JavaScript 中公開,如下

<script>
	var isAdmin = false;
	if (isAdmin) {
		...
		var adminPanelTag = document.createElement('a');
		adminPanelTag.setAttribute('https://insecure-website.com/administrator-panel-yb556');
		adminPanelTag.innerText = 'Admin panel';
		...
	}
</script>

發現管理者介面位置為https://insecure-website.com/administrator-panel-yb556

Lab: Unprotected admin functionality with unpredictable URL


錯誤訊息

資訊外洩最常見的原因之一是詳細的錯誤訊息。詳細的錯誤訊息可以提供有關網站所使用的技術資訊。例如,明確命名網站正在使用的範本引擎、資料庫類型或伺服器及其版本號。此資訊非常有用,因為可以搜尋此版本可能存在的任何已記錄的漏洞利用程式。

例如,原本是輸入數字的參數,但故意輸入字串觸發錯誤訊息回覆,得到目標版本號,可以查到該版本號有漏洞

########## request ###########
GET /product?productId="example"

########## response ###########
...omit...
Apache Struts 2 2.3.31
...omit...

Lab: Information disclosure in error messages


偵錯數據

出於偵錯目的,許多網站都會產生自訂錯誤訊息和日誌,其中包含有關應用程式行為的大量資訊。雖然這些資訊在開發過程中很有用,但如果在生產環境中洩露,對攻擊者來說也非常有用。

某網站發現html頁面內的comment有一個連結為debug,並指向到/cgi-bin/phpinfo.php,訪問該位置可發現大量debug信息,從這些信息中也包含SECRET_KEY

Lab: Information disclosure on debug page


透過備份文件

有時網站會暴露自己的原始程式碼。例如在分析網站時可能會發現有些頁面引用了一些原始程式碼檔案

範例1,在php檔後面多加個~,可能可以看到php原始碼

範例2,從robots.txt發現/backup目錄,瀏覽該目錄發現ProductTemplate.java.bak,訪問該檔後發現原始代碼,而且內容還包含連線密碼

Lab: Source code disclosure via backup files


配置不安全

開發人員可能會忘記在生產環境中停用各種偵錯選項。

例如,HTTPTRACE方法是為診斷目的而設計的。TRACE如果啟用,Web 伺服器將透過在回應中回顯收到的確切請求來回應使用該方法的請求。這種行為通常是無害的,但偶爾會導致資訊洩露,例如反向代理可能附加到請求的內部身份驗證標頭的名稱。

如下,當訪問管理後台時被拒

############# request ############# 
GET /admin 

############ response ############# 
Admin interface only available if logged in as an administrator, or if requested as localhost

透過trace請求發現目標有使用X-Custom-IP-Authorization

############# request ############# 
TRACE  /admin

############ response ############# 
...omit...
X-Custom-IP-Authorization: 203.177.137.206

嘗試在請求中使用X-Custom-IP-Authorization並指定為127.0.0.1騙過目標服務器,成功訪問管理後台

GET /admin
...omit...
X-Custom-IP-Authorization: 127.0.0.1

Lab: Authentication bypass via information disclosure


版本控制歷史

幾乎所有網站都是使用某種形式的版本控制系統開發的,例如 Git。預設情況下,Git 專案將其所有版本控制資料儲存在名為.git的資料夾中。有時網站會忘記在生產環境中公開此目錄。在這種情況下,只需瀏覽/.git即可存取。

例如,一旦在目標服務器發現可訪問.git檔,可下載該檔做分析,會發現有一個commitRemove admin password from config。根據這個線索去尋找admin.conf哪些地方被改變,就會發現-ADMIN_PASSWORD=a14m23dajfta34jm這行被刪除,而密碼就是a14m23dajfta34jm

Lab: Information disclosure in version control history


不安全的物件存取

改變物件位置可以存取敏感內容

例如,目標網站下載當前聊天記錄時系統會發送以下請求

################ request ################
GET /download-transcript/2.txt HTTP/2


################ response ################
...omit...
CONNECTED: -- Now chatting with Hal Pline --<br/>You: test

但如果把請求改為1.txt,可發現系統之前的聊天記錄,並發現密碼敏感信息

################ request ################
GET /download-transcript/1.txt HTTP/2
...omit...

################ response ################
...omit...
CONNECTED: -- Now chatting with Hal Pline --
You: Hi Hal, I think I've forgotten my password and need confirmation that I've got the right one
Hal Pline: Sure, no problem, you seem like a nice guy. Just tell me your password and I'll confirm whether it's correct or not.
You: Wow you're so nice, thanks. I've heard from other people that you can be a right ****
Hal Pline: Takes one to know one
You: Ok so my password is s3x8fw9fxn11anzjovze. Is that right?
Hal Pline: Yes it is!
You: Ok thanks, bye!
Hal Pline: Do one!

Lab: Insecure direct object references