-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() .'}}'; 
    }
}

顺便说一句:我的网络服务器是 nginx。

任何帮助都会很棒!这!

4

1 回答 1

1

是的,存在安全漏洞。上传文件名由用户控制:

$filename = explode(".",$_FILES['upload_file']['name']);
$ext = end($filename);
  • 文件名不一定必须包含一个点,$ext将是整个文件名
  • 最后一个点之后的每一件事都会结束$ext

在这两种情况下$ext都可以被攻击者自由控制,并且看到你后来在你的 sql 查询中使用它而没有卫生,你有一个严重的 sql 注入漏洞。

您不应该通过连接字符串来构建 sql 查询。您正在使用 PDO,所以请帮自己一个忙,使用参数化查询,它会为您省去很多麻烦。


编辑:

另一个漏洞可能是您的脚本允许您上传任何文件类型,因此如果您没有为您的上传目录禁用 php 的执行,任何人都可以上传一个 php 文件,然后该文件将在服务器上执行。

于 2013-06-14T16:39:39.690 回答