iT邦幫忙

2021 iThome 鐵人賽

DAY 17
0

Q1. 什麼是文件讀取漏洞?

  • 駭客可以透過一些手段讀取無授權的檔案,時常作為資訊收集的一種手段,例如伺服器的配置、密鑰、伺服器資訊等
  • 工程師開發時,若文件讀取的參數會從使用者的輸入動態生成,此時又沒有對輸入進行充分的檢查、將所有意外情況考慮清楚,便很容易產生文件讀取漏洞

Q2. 文件讀取漏洞常見的觸發點

  1. Web 語言

    1. PHP:許多函數都可能造成
      1. 函數
        1. file_get_contents()
        2. file()
        3. fopen()
        4. fread()
        5. fgets()
        6. include()
        7. require()
        8. include_once()
        9. require_once()
        10. system()
        11. exec()
        12. highlight_file()
        13. readfile()
        14. fgetss()
        15. parse_ini_file()
        16. show_source()
      2. 常見的情況
        1. 文件路徑前面可控制,後面不可控:
          • 開頭可以改為其他協定 (e.g. file://http:// )
          • 尾部不可控的部分可以使用 \x00 截斷,對應 URL 編碼是 %00
        2. 文件路徑前面不可控制,後面可控:
          • 開頭不可控,此時就無法使用其他協議 (e.g. file://http:// )
          • 可以使用 ../ 相對路徑來取上層檔案
        3. 文件路徑前後皆不可控制,中間可控:
          • 開頭不可控,此時就無法使用其他協議 (e.g. file://http:// )
          • 尾部可以使用 \x00 截斷,對應 URL 編碼是 %00
    2. Python
      • os.path.join 的參數若有根目錄,會直接將前面的路徑覆蓋,例如 join("/var/www/html", "/etc") 會得到 /etc
    3. Java
      • 一些模組讀取文件時如同 PHP 一樣,支援 file:// 協定,若可以控制讀取路徑,便可能造成任意文件讀取漏洞。
    4. Ruby
      • ROR
        • CVE-2018-3760
        • CVE-2019-5418
    5. Node
      • express
        • CVE-2017-14849
  2. Server 端

    1. Nginx 錯誤配置

      現代網頁框架時常會將網頁的進入點限縮在一個 static 或是 public 資料夾,因此部署時需要將網頁伺服器的根目錄設置為此資料夾,而主要的程式碼都在該資料夾之外,藉此降低洩漏原始碼的可能性。

      然而,設置網頁伺服器時,若未能正確設定,也可能導致攻擊者能逃出該資料夾的限制。

      例如:

      location /public {
      	alias /var/www/html/laravel/;
      }
      

      若攻擊者連上 /public../ ,便相當於存取 /var/www/html/laravel/../

      參考資料: https://www.acunetix.com/vulnerabilities/web/path-traversal-via-misconfigured-nginx-alias/

    2. Database

      MySQL 可以用 LOAD_FILE 函數讀取檔案內容,轉為字串;又或者 LOAD DATA LOCAL INFILE 語法讀取檔案,將資料存於 Table。

      參考資料:

    3. 軟連結

      軟連結就如同 Windows 上的捷徑,會紀錄連結指向的真實路徑,攻擊者若有機會上傳軟連結,並可以存取該檔案,便能夠使軟連結指向任意路徑,達成任意文件讀取。

    4. FFmpeg

      ffmpeg 是強大的開源影音轉檔工具,許多線上轉檔網頁背後可能便是使用 ffmpeg,經由 ffmpeg 的漏洞可以達成任意文件讀取。

      參考資料:https://www.freebuf.com/articles/web/258320.html

    5. Docker-API

      Docker 使用者一般來說會使用指令 docker 來進行操作,但實際上他是 client-server 架構的應用程式,通常是使用 unix domain socket 溝通,但 docker server 也支援使用 http 的 API 進行操控。

      當我們能夠 SSRF 時,可以嘗試使用 docker API,將 docker 外的文件複製到 container 中。

  3. Client 端

    1. 瀏覽器/Flash XSS

      • 早期網頁中還盛行嵌入 flash 時,時常會有任意文件讀取的漏洞被發現與開採。
      • 而現在 JavaScript 一般來說基於 Same Origin Policy,不會允許直接讀取本地檔案,但仍有機會因瀏覽器的漏洞而被繞過。
    2. MarkDown 語法解析器 XSS

      MarkDown 的渲染引擎有機會支援 JavaScript,但又沒有瀏覽器那麼健全的保護機制,從而能利用類似 XSS 的方式,將惡意 JS 植入,並藉此讀取文件。

  • 簡而言之,只要有文件讀取、下載的地方,都有可能有文件讀取漏洞

參考資料:https://www.bilibili.com/read/cv10661099

Q3. 文件讀取漏洞常見的路徑

  1. Linux

    1. 相對路徑 (flag 名稱)
      1. 可以使用 fuzz flag 名稱就可以得到答案
      2. 例如:
        1. 副檔名可能有 .txt | .php | .pyc | .py
        2. 路徑:../../../[已知路徑|etc|tmp|root|home|home+已知路徑]/flag
    2. 伺服器資訊 (絕對路徑)
      1. /etc:Unix 及 Unix-like 作業系統中,用來存放各種設定檔的目錄,包括系統設定與應用程式設定,因此是文件漏洞讀取的首要目標

      2. /etc/passwd:儲存 user 資訊與 user工作目錄的文件,可以得知系統有哪些 user、屬於哪一個 group,此文件所有 user 皆可讀,一般被用作是否有文件讀取漏洞存在的基準
        https://ithelp.ithome.com.tw/upload/images/20211001/20140592yJWa3yaZTa.png

      3. /etc/shadow:Linux 系統保存 user 資訊 及 密碼 hash 的文件(可能存在),只有 root 可讀寫、shadow group 可讀,一般情況下,網頁伺服器無法讀取此文件
        https://ithelp.ithome.com.tw/upload/images/20211001/20140592BF9JoBRcbM.png

      4. /etc/apache2/*:Apache 的配置文件,可以知道 Web 目錄,服務 port 等

      5. /etc/nginx/*:是 Nginx 配置文件(nginx 功能與 apache 相似),可以知道 Web 目錄,服務 port 等

      6. /etc/apparmor(.d)/*: Apparmor 配置文件,可以知道各種應用系統調用的白名單、黑名單。例如可以透過文件得知 MySQL 是否禁止系統調用、是否可以使用 user 自定義的 function 來執行系統命令

      7. /etc/cron.d/*/etc/crontab: 裡面放定時任務文件
        https://ithelp.ithome.com.tw/upload/images/20211001/20140592ib9s5peoTJ.png

      8. /etc/environment:是環境變量配置文件之一,可能存在大量目錄資訊的洩漏,甚至出現 secret key 洩漏的情況
        https://ithelp.ithome.com.tw/upload/images/20211001/20140592p5mpRS3C6Z.png

      9. /etc/hostname:表示主機名
        https://ithelp.ithome.com.tw/upload/images/20211001/20140592KIb4fkn7q5.png

      10. /etc/hosts:是主機名查詢靜態表,包含指定域名解析 IP 的成對資訊,通過這個文件可以探測網卡資訊和內網 IP 或域名
        https://ithelp.ithome.com.tw/upload/images/20211001/20140592xkpVVxWKQy.png

      11. /etc/issue:指明系統版本
        https://ithelp.ithome.com.tw/upload/images/20211001/20140592GYaP4eF8zE.png

      12. /etc/mysql/*:是 MySQL 配置文件

      13. /etc/php/*:是 PHP 配置文件

      14. /proc:通常儲存著 process 動態運行的各種資訊,本質是一種虛擬目錄,如果查看當前 process 的資訊,只需 /proc/self/
        https://ithelp.ithome.com.tw/upload/images/20211001/201405922exn4UwI1T.png

        1. /proc/[pid]/cmdline (指向 process 對應的 cmd 命令)
        2. /proc/[pid]/cwd (指向 process 的運行目錄)
        3. /proc/[pid]/environ (指向 process 運行的環境變量)
      15. 其他目錄

        1. /usr/local/nginx/conf
        2. /var/log/*: 放置系統日誌的地方,也可嘗試讀取 /var/log/apache2/access.log
        3. /var/www/html/: Apache 默認的網頁根目錄
        4. /var/lib/php/sessions/: user 的 session
        5. [已知家目錄]/.bash_history:可以看到歷史執行命令
        6. [已知家目錄]/.bashrc:部分環境變數
        7. [已知家目錄]/.ssh/*
          1. /authorized_keys
          2. /id_rsa(.pub|keystore):ssh 的公私鑰
          3. /known_hosts
        8. [已知家目錄]/.viminfo:vim 使用紀錄

    參考資料:https://www.freebuf.com/articles/web/229648.html

  2. Windows

    • C:\boot.ini (查看系統版本)
    • C:\Program Files\mysql\my.ini (Mysql配置)
    • C:\Program Files\mysql\data\mysql\user.MYD (Mysql root)
    • C:\Windows\System32\inetsrv\MetaBase.xml (iis配置文件)
    • C:\Windows\repair\sam (儲存系统初次安裝的密碼)
    • C:\Windows\php.ini (php配置信息)
    • C:\Windows\my.ini (Mysql配置信息)
    • C:\Windows\win.ini (Windows的基本系統配置文件)

參考文章:https://www.bilibili.com/read/cv10661099


上一篇
【第十六天 - XSS】
下一篇
【第十八天 - 命令執行】
系列文
【CTF衝衝衝 - Web篇】30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言