ファイルシステムã®ã‚»ã‚ュリティ
PHP ã¯ã€ãƒ•ァイルãŠã‚ˆã³ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªæ¯Žã«æ¨©é™ã‚’è¨å®šã™ã‚‹å¤šãã®ã‚µãƒ¼ãƒã‚·
ステム上ã«çµ„ã¿è¾¼ã¾ã‚ŒãŸã‚»ã‚ュリティをæä¾›ã—ã¾ã™ã€‚ã“れã«ã‚ˆã‚Šã€ãƒ•ァイ
ルシステム内ã®ãƒ•ァイルをèªã¿è¾¼ã¿å¯èƒ½ã«åˆ¶å¾¡ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚
å…¨ã¦ã®ãƒ•ァイルã¯ä¸–界ä¸ã‹ã‚‰èªã¿è¾¼ã¿å¯èƒ½ã§ã‚りã€ã“ã®ãƒ•ァイルシステãƒ
ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ãŸå…¨ã¦ã®ãƒ¦ãƒ¼ã‚¶ã‹ã‚‰èªã¿è¾¼ã¾ã‚Œã¦ã‚‚安全ã§ã‚ã‚‹ã“ã¨ã‚’確èªã™
ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
PHPã¯ã€ãƒ•ァイルシステムã«ãƒ¦ãƒ¼ã‚¶ãƒ¬ãƒ™ãƒ«ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã™ã‚‹ã‚ˆã†ã«è¨
計ã•れã¦ã„ã‚‹ãŸã‚ã€PHPスクリプトã‹ã‚‰/etc/password ã®ã‚ˆã†ãªã‚·ã‚¹ãƒ†ãƒ
ファイルをèªã¿è¾¼ã¿å¯èƒ½ã¨ã—ãŸã‚Šã€ã‚¤ãƒ¼ã‚µãƒãƒƒãƒˆæŽ¥ç¶šã‚’ä¿®æ£ã—ãŸã‚Šã€å·¨å¤§
ãªãƒ—リンタジョブを出力ã—ãŸã‚Šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“れã‹ã‚‰æ˜Žã‚‰ã‹ã«ã‚
ã‹ã‚‹ã“ã¨ã§ã™ãŒã€èªã¿æ›¸ãã™ã‚‹ãƒ•ァイルをé©åˆ‡ã«è¨å®šã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
å„自ã®ãƒ›ãƒ¼ãƒ ディレクトリã«ã‚るファイルを削除ã™ã‚‹æ¬¡ã®ã‚¹ã‚¯ãƒªãƒ—トを見
ã¦ã¿ã¾ã—ょã†ã€‚ã“れã¯ã€ãƒ•ァイル管ç†ç”¨ã«Webインターフェースを使用ã™
ã‚‹å ´åˆã«é€šå¸¸ç”Ÿã˜ã‚‹ã‚ˆã†ãªè¨å®šã‚’仮定ã—ã¦ã„ã¾ã™ã€‚ã“ã®å ´åˆã€Apacheユー
ã‚¶ã¯ãã®ãƒ¦ãƒ¼ã‚¶ã®ãƒ›ãƒ¼ãƒ ディレクトリã«ã‚るファイルを削除å¯èƒ½ã§ã™ã€‚
例 5-1甘ã„変数ã®ç¢ºèªã‹ã‚‰ç”Ÿã˜ã‚‹ãƒªã‚¹ã‚¯ <?php
// ユーザã®ãƒ›ãƒ¼ãƒ ディレクトリã‹ã‚‰ãƒ•ァイルを削除ã™ã‚‹
$username = $HTTP_POST_VARS['user_submitted_name'];
$homedir = "/home/$username";
$file_to_delete = "$userfile";
unlink ($homedir/$userfile);
echo "$file_to_delete ã¯å‰Šé™¤ã•れã¾ã—ãŸ!";
?> |
|
usernameã¯ãƒ¦ãƒ¼ã‚¶ãƒ•ォームã‹ã‚‰æŠ•稿å¯èƒ½ã§ã‚ã‚‹ãŸã‚ã€usernameを投稿ã—ã€
ä»–ã®èª°ã‹ãŒæ‰€æœ‰ã™ã‚‹ãƒ•ァイルを指定ã€å‰Šé™¤ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚ã“ã®å ´åˆã€
ä»–ã®ä½•らã‹ã®å½¢å¼ã®èªè¨¼ã‚’使用ã™ã‚‹ã¹ãã§ã™ã€‚投稿ã•れãŸå¤‰æ•°ãŒã€
"../etc/" 㨠"passwd " ã§ã‚ã£ãŸå ´åˆã«ã¤ã„ã¦è€ƒãˆã¦ã¿ã¾ã—ょã†ã€‚ç°¡å˜
ãªã‚³ãƒ¼ãƒ‰ã‚’以下ã«ç¤ºã—ã¾ã™ã€‚
例 5-2... ファイルシステムã¸ã®æ”»æ’ƒ <?php
// 外部ã‹ã‚‰PHPユーザãŒã‚¢ã‚¯ã‚»ã‚¹å¯èƒ½ãªãƒãƒ¼ãƒ‰ãƒ‰ãƒ©ã‚¤ãƒ–を削除ã—ã¾ã™ã€‚PHPãŒ
// ルートã®ã‚¢ã‚¯ã‚»ã‚¹æ¨©é™ã‚’有ã—ã¦ã„ã‚‹å ´åˆã€
$username = "../etc/";
$homedir = "/home/../etc/";
$file_to_delete = "passwd";
unlink ("/home/../etc/passwd");
echo "/home/../etc/passwd ã¯å‰Šé™¤ã•れã¾ã—ãŸ!";
?> |
|
ã“ã†ã—ãŸå•題を防æ¢ã™ã‚‹ãŸã‚ã«å¿…è¦ãªé‡è¦ãªãƒã‚§ãƒƒã‚¯æ‰‹æ®µã¨ã—ã¦ä»¥ä¸‹ã®2
種類ã®ã‚‚ã®ãŒã‚りã¾ã™ã€‚
ä»¥ä¸‹ã«æ”¹è‰¯ã•れãŸã‚¹ã‚¯ãƒªãƒ—トを示ã—ã¾ã™ã€‚
例 5-3より安全ãªãƒ•ァイルåã®ç¢ºèª <?php
// PHPユーザãŒã‚¢ã‚¯ã‚»ã‚¹å¯èƒ½ãªãƒãƒ¼ãƒ‰ãƒ‰ãƒ©ã‚¤ãƒ–ã‹ã‚‰ãƒ•ァイルを削除ã™ã‚‹ã€‚
$username = $HTTP_SERVER_VARS['REMOTE_USER']; // èªè¨¼æ©Ÿæ§‹ã‚’使用ã™ã‚‹
$homedir = "/home/$username";
$file_to_delete = basename("$userfile"); // パスをå–り除ã
unlink ($homedir/$file_to_delete);
$fp = fopen("/home/logging/filedelete.log","+a"); // 削除ã®è¨˜éŒ²
$logstring = "$username $homedir $file_to_delete";
fputs ($fp, $logstring);
fclose($fp);
echo "$file_to_delete ã¯å‰Šé™¤ã•れã¾ã—ãŸ!";
?> |
|
ã—ã‹ã—ã€ã“れã§ã‚‚ã€å‚·å£ã‚’塞ã„ã ã“ã¨ã«ã¯ãªã‚Šã¾ã›ã‚“。
ユーザãŒè‡ªåˆ†ç”¨ã®ãƒ¦ãƒ¼ã‚¶ãƒã‚°ã‚¤ãƒ³ã‚’作æˆã™ã‚‹ã“ã¨ã‚’ã‚ãªãŸã®èªè¨¼ã‚·ã‚¹ãƒ†ãƒ ãŒ
許å¯ã—ã¦ãŠã‚Šã€ãƒ¦ãƒ¼ã‚¶ãŒ"../etc/"ã¸ã®ãƒã‚°ã‚¤ãƒ³ã‚’é¸æŠžã—ãŸå ´åˆã€ã‚·ã‚¹ãƒ†ãƒ
ã¯ã¾ãŸã‚‚公開ã•れã¦ã—ã¾ã„ã¾ã™ã€‚ã“ã®ãŸã‚ã€ã‚ˆã‚Šã‚«ã‚¹ã‚¿ãƒžã‚¤ã‚ºã•れãŸãƒã‚§ãƒƒ
クを行ãªã†æ–¹ãŒã‚ˆã„ã§ã—ょã†ã€‚
例 5-4より安全ãªãƒ•ァイルåã®ç¢ºèª <?php
$username = $HTTP_SERVER_VARS['REMOTE_USER']; // èªè¨¼æ©Ÿæ§‹ã‚’使用ã™ã‚‹
$homedir = "/home/$username";
if (!ereg('^[^./][^/]*$', $userfile))
die('bad filename'); // 処ç†ã›ãšã€çµ‚了。
if (!ereg('^[^./][^/]*$', $username))
die('bad username'); // 処ç†ã›ãšã€çµ‚了。
//etc...
?> |
|
オペレーティングシステムã«ã‚ˆã‚Šã€æ³¨æ„ã™ã‚‹ã¹ãファイルã¯å¤§ãã変化ã—
ã¾ã™ã€‚ã“れらã«ã¯ã€ãƒ‡ãƒã‚¤ã‚¹ã‚¨ãƒ³ãƒˆãƒª(/dev/ ã¾ãŸã¯ COM1)ã€è¨å®šãƒ•ァイ
ル(/etc/ ファイルãŠã‚ˆã³ .ini ファイル)ã€ã‚ˆã知られãŸãƒ•ァイルä¿å˜é ˜
域 (/home/〠My Documents)ç‰ãŒå«ã¾ã‚Œã¾ã™ã€‚ã“ã®ãŸã‚ã€æ˜Žç¤ºçš„ã«è¨±å¯ã™
ã‚‹ã‚‚ã®ä»¥å¤–ã®å…¨ã¦ã‚’ç¦æ¢ã™ã‚‹æ–¹é‡ã¨ã™ã‚‹æ–¹ãŒé€šå¸¸ã¯ã‚ˆã‚Šç°¡å˜ã§ã™ã€‚