Local File Inclusion
略称: LFI
ローカルのファイルの内容を通信などの出力に含ませてしまう脆弱性
要はサーバーのファイルを外部から読める脆弱性
ほとんどはPath Traversalが原因
PHPで任意のローカルファイルをincludeしてしまう脆弱性のことも指す
PHP Local File Inclusionを参照
例
code:server.py
from flask import Flask, request, send_file
app = Flask(__name__)
@app.get("/page")
def page():
file = request.args.get("file", "index.html")
return send_file("./pages/" + file)
if __name__ == "__main__":
app.run()
/page?file=hoge.htmlで./pages/hoge.htmlが送信される
fileの値を操作することにより、任意のファイルを外部から読むことができる
/page?file=../../../../../../../etc/passwdで/etc/passwdが送信される
code:/etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
...
対策
Path Traversalを参照
テクニック
Range Header
サーバーがRangeヘッダに対応している場合、範囲を指定してファイルの一部を読み込むことができる
一度に読み込めるファイルのサイズが決められていたり、フィルタがある場合に有効
SECCON Beginners CTF 2022 - gallery https://qiita.com/task4233/items/9b4f7bcf52cc87a9c7ad#web-83pt-gallery156-solves
CakeCTF 2021 - telepathy https://nanimokangaeteinai.hateblo.jp/entry/2021/08/29/202355#Misc-173-telepathy-29-solves
MDN https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Range
よく使われるファイル
/proc
Linuxのプロセスに関する情報が入っている特殊なディレクトリ
man proc https://linuxjm.osdn.jp/html/LDP_man-pages/man5/proc.5.html
/proc/self/environ
LFIから環境変数を漏洩できる
自身のプロセスが起動したときの環境変数の値が書かれている
/proc/self/maps
LFIをテストするときのセンシティブでないファイルとして扱われているっぽい
自身のプロセスのメモリマップが書かれている
/proc/self/mem
自身のプロセスのメモリを読むことができる
読み込むときはseekでアドレスを合わせないといけない
実際のメモリマップのように扱われる
Rangeヘッダが有効のとき、Rangeでアドレスの範囲を指定することで/proc/self/memを読める場合がある (実装依存)
ångstromCTF 2020 - LeetTube https://tech.kusuwada.com/entry/2020/04/05/132308#section3
/proc/self/fd/{num}
自身のプロセスが持つファイルディスクリプタが開いているファイルへのシンボリックリンク
/dev/fd/{num}もある
/proc/self/cwd
自身のプロセスのカレントディレクトリへのシンボリックリンク
/proc/self/cmdline
自身のプロセスを実行したコマンドの文字列
引数で機密情報を渡してたりするとこれで覗ける
/proc/self/root
/へのシンボリックリンク
/dev/stdin
標準入力を指すファイル
/dev/stdout, /dev/stderrもそれぞれある
/proc/self/fd/0や/dev/pts, /dev/ttyもある
KosenXm4sCTF - what is include? https://github.com/KosenXmasCTF/what_is_include
/etc/passwd
ユーザーに関する情報が書かれている
LFIの確認に使われる
/etc/shadow
ユーザーのパスワードハッシュが入っている
通常root権限が必要
ブルートフォースなどでハッシュを復元できればSSHで接続できるかもしれない
/home/{user}/.bash_history
bashのコマンド履歴が入っている
面白い情報があるかもしれない
/home/{user}/.ssh/id_rsa
sshの秘密鍵があるかもしれない
シンボリックリンクを考慮しないパス正規化の悪用
/dev/fd/../environを単純に正規化すると/dev/environになる
しかし/dev/fdは/proc/self/fdへのシンボリックリンクなので、実際はこのパスは/proc/self/environを指す
この挙動を使ってFilter bypassができる
Kubernetes Threat Matrixの再構築およびFalcoによる攻撃検知の検証 https://engineering.mercari.com/blog/entry/20220928-kubernetes-threat-matrix-and-attack-detection-by-falco/
ヌルバイト攻撃
file + ".png"のように末尾に操作できない文字列が追加される場合、自由にLFIができない
環境によっては、/?file=/etc/passwd%00のようなリクエストを送ると文字列がNULL文字で終わるようになるため、/etc/passwdをLFIできる
PHP 5.4未満ではこのようなことが可能だったらしい
Path Traversal
具体的な攻撃テクニックなどはこちらを参照
PHP Filter
Zip Slip
CVE
ImageMagickのCVE-2022-44268 https://github.com/Sybil-Scan/imagemagick-lfi-poc
資料
IPA https://www.ipa.go.jp/security/vuln/websecurity-HTML-1_3.html
HackTricks https://book.hacktricks.xyz/pentesting-web/file-inclusion
CTFのWebセキュリティにおけるPath Traversal, LFI/RFI (File Upload, ZipSlip) https://blog.hamayanhamayan.com/entry/2021/12/08/220449