-
[Aws] S3 파일 업로드 확장자 제한 및 에러 페이지 처리 - 웹 취약점 보안Aws 2024. 2. 14. 00:07반응형
S3 파일 업로드 확장자 제한
Amazon Simple Storage Service(Amazon S3) 버킷에 특정 파일 형식만 허용하도록 업로드를 제한해야하는 상황은 빈번합니다. 만약 이를 방어하지 않는다면, 쉘 스크립트를 업로드하여 원격 코드 실행이 가능한 취약점을 이용한 공격도 발생할 수 있습니다.
예를 들어서, 공격자는 PHP 웹쉘과 같은 악성 파일을 S3에 업로드한 후, 해당 파일의 URL을 이용하여 원격으로 시스템에 액세스하고 제어할 수 있습니다. 이러한 형태의 공격은 파일 업로드 기능이 적절한 보안 조치 없이 구현되어 있을 때 발생할 수 있습니다. 개발자 및 시스템 관리자는 파일 업로드 기능을 구현할 때 안전한 방식으로 처리하고 적절한 검증 및 보안 조치를 적용하여 이러한 공격을 방지해야 합니다.
이번 포스팅에서는 AWS S3의 NotResource 정책을 이용하여 파일 확장자를 제한하는 방법에 대해 알아보겠습니다.
이를 통해 S3 버킷에 특정 확장자를 가진 파일만 업로드할 수 있도록 보안을 강화할 수 있습니다.
AWS S3 Bucket은 생성 되어 있다는 전제하에 진행 하겠습니다.
📌 버킷 정책 수정
Amazon S3 > 버킷 > 권한 페이지에 접속한 뒤, '버킷 정책' 편집을 클릭합니다.
버킷 정책
{ "Sid": "DenyPutObjectWithRestrictions", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::XXXXXXXXXXX:user/{User Name}" }, "Action": "s3:PutObject", "NotResource": [ "arn:aws:s3:::{Your S3 Bucket Name}/*.jpg", "arn:aws:s3:::{Your S3 Bucket Name}/*.jpeg", "arn:aws:s3:::{Your S3 Bucket Name}/*.gif", "arn:aws:s3:::{Your S3 Bucket Name}/*.png", "arn:aws:s3:::{Your S3 Bucket Name}/*.webp", "arn:aws:s3:::{Your S3 Bucket Name}/*.svg", "arn:aws:s3:::{Your S3 Bucket Name}/*.ico", "arn:aws:s3:::{Your S3 Bucket Name}/*.webm", "arn:aws:s3:::{Your S3 Bucket Name}/*.mp4", "arn:aws:s3:::{Your S3 Bucket Name}/*.mov", "arn:aws:s3:::{Your S3 Bucket Name}/*.pdf", "arn:aws:s3:::{Your S3 Bucket Name}/*.json", "arn:aws:s3:::{Your S3 Bucket Name}/*.zip" ] }
버킷 정책에 위 정책을 입력합니다.
이 정책은 특정 IAM 사용자가 AWS S3 버킷에 객체를 업로드하는 동작(s3:PutObject)을 허용하지 않는다는 것을 정의합니다.
이 정책은 "DenyPutObjectWithRestrictions"라는 이름을 가지며, 특정 사용자에게 적용됩니다.
여기서 중요한 부분은 "Effect"가 "Deny"로 설정되어 있어, 이 정책이 특정 사용자에게 업로드 동작을 금지하는 역할을 합니다.
이 정책의 구성 요소를 자세히 살펴보겠습니다.
🎈 "Sid": "DenyPutObjectWithRestrictions"
- 정책문의 식별자입니다. 여러 정책이 적용될 때 각각을 식별하기 위해 사용됩니다.
🎈 "Effect": "Deny"
- 정책의 효과를 나타냅니다. "Deny"로 설정되어 있기 때문에 이 정책이 특정 동작을 거부하는 역할을 합니다. "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXX:user/{User Name}"}: 정책이 적용되는 주체를 정의합니다. 여기서는 특정 IAM 사용자를 나타내며, "arn:aws:iam::XXXXXXXXXXX:user/{User Name}" 부분에서 "{User Name}"을 실제 사용자의 이름으로 바꿔주어야 합니다.
🎈 "Action": "s3:PutObject"
- 이 정책이 거부하는 동작을 나타냅니다. 여기서는 S3 버킷에 객체를 업로드하는 동작을 제한합니다.
🎈 "NotResource"
- 이 부분은 허용되는 리소스를 정의합니다. 여기서는 S3 버킷의 특정 경로에 있는 파일만 업로드를 허용합니다. 예를 들어, ".jpg" 또는 ".zip", 등의 확장자를 가진 파일만을 업로드할 수 있도록 제한하고 있습니다. "{Your S3 Bucket Name}" 부분은 사용 중인 S3 버킷 이름으로 바꾸어주어야 합니다. 이 정책을 사용하면 특정 사용자가 특정 확장자를 가진 파일 이외의 것을 S3 버킷에 업로드하는 것을 막을 수 있습니다.
이렇게 간단하게 정책 설정을 통해서 실제 파일이 저장되는 S3에 확장자 제한을 함으로써,
보안을 강화 시킬 수 있습니다.
S3 사용자 정의 오류 페이지 설정
S3에 업로드 되어 있는 파일의 경로를 시스템 경로로 악의적으로 수정하거나, 권한이 없는 파일을 다운로드 하려고 시도하는 경우, 등 여러가지 상황에서 아래와 같이 오류 페이지가 노출 될 수 있습니다. 해당 오류 페이지를 분석하여 공격을 시도할 수도 있기 때문에 오류 페이지를 사용자 정의 오류 페이지로 노출 하게끔 설정하여 보안을 강화시켜야 합니다.
기본 오류 페이지 대신에 사용자 정의 오류 페이지를 표시하려면 AWS CloudFront와 S3를 조합하여
설정해야 합니다. 이를 위해서는 다음의 단계를 따르면 됩니다.
📌 오류 페이지 생성
S3 버킷에 사용자 정의 오류 페이지 파일 (예: 403.html, 400.html)을 업로드합니다.
📘 403.html
<!DOCTYPE html> <html> <head> <title>403 Access Denied</title> </head> <body> <h1>403 Access Denied</h1> </body> </html>
📘 400.html
<!DOCTYPE html> <html> <head> <title>400 Bad Request</title> </head> <body> <h1>400 Bad Request</h1> </body> </html>
📌 오류 페이지 업로드
S3 버킷에 위에서 생성한 파일을 업로드 합니다.
📌 CloudFront 배포 설정
S3 버킷과 연결 되어 있는 CloudFront의 배포 페이지에서 [오류페이지 Tab]을 들어간 뒤, [사용자 정의 오류 응답 생성]을 클릭합니다.
오류 페이지를 사용하고자 하는 HTTP 상태 코드를 선택합니다. (예: 403, 400)
응답 페이지 경로에 S3 버킷에 업로드 한 오류 페이지 파일의 경로를 지정합니다 (예: /403.html, /400.html)
HTTP 응답 코드를 200으로 설정함으로써 HTTP 에러가 아니게끔 설정 해줍니다.
📌 오류 페이지 확인
프록시 툴을 사용하여 다운로드 파일의 경로를 임의로 수정하여 오류 페이지를 유도 해보겠습니다.
GET /upload/xxx/../../../../../../../../../../../../etc/passwd HTTP/2 Host: {s3 bucket address}
아래와 같이 위에서 생성한 사용자 정의 오류 페이지가 정상적으로 노출 되는 것을 확인할 수 있습니다.
반응형'Aws' 카테고리의 다른 글
[Aws + Spring] Spring Boot + Aws Glue + S3를 활용한 방문자 통계 구축 (3) (2) 2024.01.02 [AWS] EC2 Instance Loadbalancer (0) 2022.10.24 [AWS] EB Deploy Issue (Chrome) (0) 2022.10.24