PHPセキュリティ脆弱性の深層分析

1. PHPの型比較に関する脆弱性

1.1 ハッシュ比較の脆弱性

PHPでは科学記数法表記の文字列を数値として処理する特性があります。この性質により、異なる文字列のMD5/SHA1ハッシュ値が0eで始まる場合、比較演算子(==)使用時に同一と判定されます。

$input1 = 's104885129a';
$input2 = 's189602793a';
if(md5($input1) == md5($input2)){
    echo "一致";
}
MD5脆弱性ペイロードSHA1脆弱性ペイロード
md5('s104885129a')sha1('aav90')
md5('s189602793a')sha1('aa4')

1.2 型変換時の脆弱性

特定の関数は配列を処理できないため、数値比較時に0として扱われるケースがあります。

$param = [1,2,3];
if(strpos($param, 'test') == 0){
    // 組み込み関数が配列を0として処理
}

2. 特殊文字列による攻撃

2.1 MD5(rawモード)の脆弱性

$query = "SELECT * FROM admin WHERE pass='".md5($pass, true)."'";
// 'ffifdyop'のMD5(raw)はSQLインジェクションペイロードに変換

3. 正規表現の脆弱性

3.1 境界チェック不足

function validate_ip($ip){
    return preg_match("/\d+\.\d+\.\d+\.\d+/", $ip);
}
// "abc192.168.0.1"が正当と判定される

4. 変数上書き脆弱性

4.1 extract()関数の危険性

$flag = 'secret.txt';
extract($_GET); // ?flag=hogeで上書き
echo file_get_contents($flag);

5. シリアライゼーション脆弱性

5.1 魔法関数の自動実行

関数トリガー条件
__construct()オブジェクト生成時
__destruct()オブジェクト破棄時
__toString()オブジェクトを文字列として使用時

6. ランダム数生成の脆弱性

6.1 乱数の予測可能性

mt_srand(1234567890);
echo mt_rand(); // 種を特定すれば再現可能

7. 危険な組み込み関数

7.1 コマンド実行関数一覧

  • system()
  • exec()
  • shell_exec()
  • eval()(文字列をPHPコードとして実行)

8. セキュリティ設定の落とし穴

8.1 安全な設定例

disable_functions = system,passthru,exec
open_basedir = /var/www/html/
allow_url_include = Off

タグ: php-security web-application-security serialization-vulnerabilities sql-injection secure-coding

7月3日 19:00 投稿