-1

Debian サーバー上の何千もの元の画像ファイルがサムネイル画像ファイルに置き換えられていることがわかりました。そして、私は自分でこの操作を行っていないと確信しています。したがって、ハッカーが私のサーバーに侵入し、損害を与えたに違いありません。しかし、ファイルが置き換えられている間の最後のログイン履歴を確認すると、疑わしいログインはありません。そのため、PHP コードに安全な問題がある可能性があると思います。以下は私のPHP画像アップロードコードです:

function upload() {
    $sql = "SELECT photocount FROM user WHERE id={$_SESSION['id']}";
    try {
        $db = getConnection();
        $stmt = $db->query($sql); 
        $user = $stmt->fetch(PDO::FETCH_OBJ);
        if($user->photocount<9){
            $filename = explode(".",$_FILES['upload_file']['name']);
            $ext = end($filename);
            $ctime = time();
            $filename = $ctime.$_SESSION['id'].".".$ext;
            header('content-type:text/html charset:utf-8');
            if(!file_exists($_FILES['upload_file']['name'])) move_uploaded_file($_FILES['upload_file']['tmp_name'],"uploads/" .$filename);
            $resizeimage = new resizeimage("uploads/".$filename, "160", "160", "1","uploads/small/".$filename);
            $sql = "INSERT INTO photo (uid,thumbnail,original) VALUES('{$_SESSION['id']}','http://chongai.co/m/uploads/small/{$filename}', 'http://chongai.co/m/uploads/{$filename}')";
            $sqll = "UPDATE user SET photocount=photocount+1 WHERE id={$_SESSION['id']}";
            try {
                $stmt = $db->query($sql); 
                $stmt = $db->query($sqll); 
                $sql = "SELECT id FROM photo WHERE thumbnail='http://chongai.co/m/uploads/small/{$filename}'";          
                $stmt = $db->query($sql); 
                $img = $stmt->fetch(PDO::FETCH_OBJ);
                $db = null;     
                echo '{"status": ' . json_encode("Upload Success") . ',"file": ' . json_encode("http://chongai.co/m/uploads/small/{$filename}") . ',"id": ' . json_encode($img->id) . '}';
            } catch(PDOException $e) {
                echo '{"error":{"text":'. $e->getMessage() .'}}'; 
            }           
        }else{
            echo '{"status": ' . json_encode("You can only upload 8 photos") . '}';
        }
    } catch(PDOException $e) {
        echo '{"error":{"text":'. $e->getMessage() .'}}'; 
    }
}

ところで: 私の Web サーバーは nginx でした。

どんな助けでも素晴らしいでしょう!これ!

4

1 に答える 1

1

はい、セキュリティ バグがあります。アップロード ファイル名はユーザーが制御します。

$filename = explode(".",$_FILES['upload_file']['name']);
$ext = end($filename);
  • ファイル名は必ずしもドットを含む必要はなく、ファイル名$ext全体になります
  • 最後のドットの後のすべては$ext

どちらの場合も$ext、攻撃者によって自由に制御される可能性があり、後でサニテーションなしで SQL クエリで使用すると、深刻な SQL インジェクションの脆弱性が発生します。

文字列を連結して SQL クエリを作成しないでください。あなたは PDO を使用しているので、パラメータ化されたクエリを使用してください。これにより、多くの手間が省けます。


編集:

もう 1 つの脆弱性は、スクリプトで任意のファイル タイプをアップロードできることです。そのため、アップロード ディレクトリで php の実行を無効にしないと、誰でも php ファイルをアップロードしてサーバー上で実行できてしまう可能性があります。

于 2013-06-14T16:39:39.690 に答える