PHP

基礎知識

演算子の比較表

画像は PHP STRING COMPARISON VULNERABILITIES に載っているやつです。

strcmp

配列や3引数以上与えると NULL が返ってくる。
1
var_dump(strcmp("a", "a")); // int(0)
2
var_dump(strcmp("a", "b")); // int(-1)
3
var_dump(strcmp("a", "b", "c")); // NULL
4
var_dump(strcmp([], "a")); // NULL
Copied!
そのため == で比較してたりするとバイパスできてしまう。(strcmp は2つの文字列が等しい場合 0 を返すため、NULL == 0 が成立する)
1
// 問題のあるコード
2
if (strcmp("a", "b", "c") == 0) {
3
echo "bypassed (arity 3)";
4
}
5
6
// 問題無いコード
7
if (strcmp("a", "b", "c") === 0) {
8
echo "bypassed (arity 3)";
9
}
Copied!

parse_str

与えられたクエリパラメータ key=valを用いて、変数 key に val を代入する。
その際、既存の変数を上書きできてしまう点に注意。
以下のコードは一見問題なさそうに見えるが、?hashed_key=xxx というパラメータが与えられた場合、hashed_key の既存の値が xxx になってしまう。つまり、任意の値に書き換えることができる。
1
$hashed_key = '79abe9e217c2532193f910434453b2b9521a94c25ddc2e34f55947dea77d70ff';
2
3
$parsed = parse_url($_SERVER['REQUEST_URI'])
4
$parsed_query = parse_str($parsed["query"]);
5
$hashed_input = hash('sha256', $_GET["key"]);
6
7
if($hashed_input !== $hashed_key){
8
die("GTFO!");
9
}
10
11
echo file_get_contents("/flag");
Copied!

parse_url

パラメータ・フラグメントに @ から始まるホスト名を指定すると、なぜか上書きできてしまう。
報告
Fix
5.6.26
5.6.28
1
php > echo parse_url("http://example.com:80#@google.com/")["host"];
2
google.com
3
4
php > echo parse_url("http://example.com:[email protected]/")["host"];
5
google.com
Copied!
Last modified 2yr ago