Web 語言
file_get_contents()
file()
fopen()
fread()
fgets()
include()
require()
include_once()
require_once()
system()
exec()
highlight_file()
readfile()
fgetss()
parse_ini_file()
show_source()
file://
或 http://
)\x00
截斷,對應 URL 編碼是 %00
file://
或 http://
)../
相對路徑來取上層檔案file://
或 http://
)\x00
截斷,對應 URL 編碼是 %00
os.path.join
的參數若有根目錄,會直接將前面的路徑覆蓋,例如 join("/var/www/html", "/etc")
會得到 /etc
file://
協定,若可以控制讀取路徑,便可能造成任意文件讀取漏洞。CVE-2018-3760
CVE-2019-5418
CVE-2017-14849
Server 端
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/
Database
MySQL 可以用 LOAD_FILE
函數讀取檔案內容,轉為字串;又或者 LOAD DATA LOCAL INFILE
語法讀取檔案,將資料存於 Table。
參考資料:
軟連結
軟連結就如同 Windows 上的捷徑,會紀錄連結指向的真實路徑,攻擊者若有機會上傳軟連結,並可以存取該檔案,便能夠使軟連結指向任意路徑,達成任意文件讀取。
FFmpeg
ffmpeg 是強大的開源影音轉檔工具,許多線上轉檔網頁背後可能便是使用 ffmpeg,經由 ffmpeg 的漏洞可以達成任意文件讀取。
Docker-API
Docker 使用者一般來說會使用指令 docker
來進行操作,但實際上他是 client-server 架構的應用程式,通常是使用 unix domain socket 溝通,但 docker server 也支援使用 http 的 API 進行操控。
當我們能夠 SSRF 時,可以嘗試使用 docker API,將 docker 外的文件複製到 container 中。
Client 端
瀏覽器/Flash XSS
MarkDown 語法解析器 XSS
MarkDown 的渲染引擎有機會支援 JavaScript,但又沒有瀏覽器那麼健全的保護機制,從而能利用類似 XSS 的方式,將惡意 JS 植入,並藉此讀取文件。
參考資料:https://www.bilibili.com/read/cv10661099
Linux
/etc
:Unix 及 Unix-like 作業系統中,用來存放各種設定檔的目錄,包括系統設定與應用程式設定,因此是文件漏洞讀取的首要目標
/etc/passwd
:儲存 user 資訊與 user工作目錄的文件,可以得知系統有哪些 user、屬於哪一個 group,此文件所有 user 皆可讀,一般被用作是否有文件讀取漏洞存在的基準
/etc/shadow
:Linux 系統保存 user 資訊 及 密碼 hash 的文件(可能存在),只有 root 可讀寫、shadow group 可讀,一般情況下,網頁伺服器無法讀取此文件
/etc/apache2/*
:Apache 的配置文件,可以知道 Web 目錄,服務 port 等
/etc/nginx/*
:是 Nginx 配置文件(nginx 功能與 apache 相似),可以知道 Web 目錄,服務 port 等
/etc/apparmor(.d)/*
: Apparmor 配置文件,可以知道各種應用系統調用的白名單、黑名單。例如可以透過文件得知 MySQL 是否禁止系統調用、是否可以使用 user 自定義的 function 來執行系統命令
/etc/cron.d/*
或 /etc/crontab
: 裡面放定時任務文件
/etc/environment
:是環境變量配置文件之一,可能存在大量目錄資訊的洩漏,甚至出現 secret key 洩漏的情況
/etc/hostname
:表示主機名
/etc/hosts
:是主機名查詢靜態表,包含指定域名解析 IP 的成對資訊,通過這個文件可以探測網卡資訊和內網 IP 或域名
/etc/issue
:指明系統版本
/etc/mysql/*
:是 MySQL 配置文件
/etc/php/*
:是 PHP 配置文件
/proc
:通常儲存著 process 動態運行的各種資訊,本質是一種虛擬目錄,如果查看當前 process 的資訊,只需 /proc/self/
其他目錄
/usr/local/nginx/conf
/var/log/*
: 放置系統日誌的地方,也可嘗試讀取 /var/log/apache2/access.log
/var/www/html/
: Apache 默認的網頁根目錄/var/lib/php/sessions/
: user 的 session[已知家目錄]/.bash_history
:可以看到歷史執行命令[已知家目錄]/.bashrc
:部分環境變數[已知家目錄]/.ssh/*
/authorized_keys
/id_rsa(.pub|keystore)
:ssh 的公私鑰/known_hosts
[已知家目錄]/.viminfo
:vim 使用紀錄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