web-dev-qa-db-ja.com

PHP MACでジャグリングするタイプ

私はチャレンジを解決しようとしています、そしてそれは PHP juggling に関係しているのではないかと思います。これは、このbase64エンコードされたjson cookeを応答{"User":"foo","MAC":"bar"}として取得するためです。

バグ#2

計算されたMAC(つまり、hash_hmac()の結果)は、16進文字を含む文字列です

緩やかな比較を使用すると、JSONペイロードで整数が提供された場合、HMAC文字列は数値に変換されます

MACの場合、たとえば"ff6d0...5885d"の場合、PHPジャグリングは、最初の数値であるため、int(6)と比較されます。私の考えは、POSTとbase64エンコードされたjson:{"User":"Admin","MAC":6}

しかし、これはうまくいきませんでした...ジャグリングは、数値で始まるMACでのみ機能しますか?

1
Ludisposed

アルゴリズムPHP文字列を整数に強制変換するために使用するものは ここに記載されています です。特に:

値は文字列の最初の部分によって与えられます。文字列が有効な数値データで始まる場合、これが使用される値になります。それ以外の場合、値は0(ゼロ)になります。

あなたの仮定はそれでした:

MAC、たとえば「ff6d0 ... 5885d」では、PHPジャグリングは最初の数値なので、int(6)と比較されます。

ただし、_6_はその文字列の先頭には表示されず、非数値シーケンスffの後にのみ表示されます。したがって、値はint(0)に強制変換されます。

ただし、「6ffd0 ... 5885d」などの別のハッシュがある場合、_6_は文字列の先頭に表示されるため、文字列はint(6)に強制変換されます。

ご想像のとおり、この強制は特定の状況での比較中に発生する可能性があります マニュアルの比較演算子に関する注記 で説明されています。

5
IMSoP