😉

PHPのif条件判定文のインジェクション

2021/11/09に公開

こんにちは、今日はPHPのif文条件判定のカッコ内で出来ることを整理します。
知らなくても、困ることはないでしょうが、
知っておくといいこともあるのかなと思います。

判定カッコ内では変数の展開不可

下が最初どうなるのかなと考えたのか発端です。
結論を言えば、インジェクションは出来ないです。

expand_variable.php
<?php
$a = "true){echo "Evil message...";}if(false";
if($a){
	echo "\$a was true!";
}
$a was true!

これは$aが文字列として扱われ、"Evil message..."は表示されません。
$a = "false"ですらtrue扱いなので、ある意味当然なのですが。

判定カッコ内では関数は実行される

では、関数にしたらどうでしょう?

execute_function.php
<?php
if(print("Print executed!<br />")){
	echo "Also shown!";
}

これ出力は

Print executed!
Also shown!

になります。ifのカッコ内では関数実行は可能なんです。
出力は大抵、成功時にtrueを返す関数が多いですから、
多くの工夫した利用ができそうですね。
例えば、ファイルアップロードの成否とか、
データベースアクセスのfetch関数とか、
おなじみだと思います。

ちなみに"echo"は関数ではなく言語構造だから、
"print"を"echo"にするとエラーになります。

セキュリティでインジェクションとか学んでいると、
アクセスの権限の判定で

if(!$_SESSION['logged_in']){
	header("location:login.php");
	exit;
}

みたいな書き方まで心配になってきますが、
「変数は展開されないから、大丈夫だよ!」という事なんですね。

今日はここまで、お疲れ様でした!

Discussion