我刚刚发现我的 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。
任何帮助都会非常感激! 嗯!
最佳答案
是的,存在安全漏洞。上传文件名由用户控制:
$filename = explode(".",$_FILES['upload_file']['name']);
$ext = end($filename);
- 文件名不一定必须包含点,
$ext
将是整个文件名 - 最后一个点之后的所有内容都会以
$ext
结束
在这两种情况下$ext
都可以被攻击者自由控制,并且看到你稍后在没有卫生的情况下在sql查询中使用它,你有一个严重的sql注入(inject)漏洞。
您不应该通过连接字符串来构建 SQL 查询。您正在使用 PDO,所以帮自己一个忙,使用 parameterized queries ,这将为您省去很多麻烦。
<小时/>编辑:
另一个漏洞可能是您的脚本允许您上传任何文件类型,因此如果您没有禁用上传目录的 php 执行,任何人都可以上传 php 文件,然后该文件将在服务器上执行。
关于php - 这个PHP图片上传代码是否存在安全漏洞(LNMP服务器上的图片文件被恶意替换)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17112854/