📽️File Upload Bypass Scenario

DATE : 2024/2/8

앞서 File Upload 공격에 대해 다룰 때, 파일 업로드 공격은 파일을 올리는 곳에서

파일을 제대로 검사를 하지 않았기 때문에 발생한다고 언급한 바 있다!

그래서! 파일을 업로드 하는 과정에서 잘못된 대응 방안과 그에 대한 우회 방법에 어떤 게 있을지

다루어보고자 한다.

1_MIME Type

파일을 제출하는 경우, Request를 확인해 보면 "이게 어떤 유형의 파일입니다~"를 알려주는

MIME 이라는 게 존재한다.

이는 Content-Type header에 들어가는 값으로 서버는 이 내용을 보고 파일을 업로드 할 것인지,

업로드하지 않을 것인지 판단하는 경우가 있다.

하지만 사실 이런 식으로 검사를 하는 건 의미가 없는 게

서버에서 허용하는 확장자로 Content-Type 값을 조작하기만 하면 쉽게 우회가 가능하다!

2_실행 권한 제거

파일 업로드 공격이 문제가 되는 이유가 뭘까 🤔

생각을 해보니 파일이 실행되기 때문인 거 같다..! 그래서 업로드 한 파일을 가지고 있는 directory에

"어떤 파일 확장자든 상관 없이 전부 실행 하지 마!" 라고 실행 대상에서 아예 제외해 버리는 방법이 있는데

이런 경우에는 path traversal 공격을 수행해 실행 대상에서 제외된 directory가 아닌

다른 directory로 옮겨서 파일을 업로드하면 이 또한 우회가 가능할 수 있다.

3_File Extension

그렇다면.. 서버 측 script에 해당하는 파일 확장자를 필터링 하자!

나는 php, jsp, asp 파일 안 받아줄래! 라고 하는 경우가 있는 데

이런 경우에는 alternative extension이라고 해서

php => phtml, php3, php5, phpl ..
jsp => jsw,jspx ...

php 라는 단어가 아닐 뿐 php로 실행되는 대체 확장자를 사용할 수도 있으며

경우에 따라서는

php => Php, PHp, pHp, pHP...

대소문자를 섞어 사용하는 경우, 우회가 가능하기도 하다.

그렇다 보니 확장자를 필터링 하는 방법 또한 파일 업로드 공격을 막기에는 부족하다.

이 밖에도 파일 업로드 공격을 수행하기 위해 제일 많이 사용되는 우회 방법이 있는데

일단 정상적인 이미지를 하나 준비해줄 필요가 있다.

hex editor 같은 도구로 File Signature는 그대로 유지하되, 중간에 Web Shell을 넣어주고

파일 확장자는 서버 측에서 실행할 수 있는 확장자로 이미지 파일을 저장한다.

우리가 파일을 업로드 하는 이유는 코드를 서버에서 실행하기 위함이다!!!

그러기 위해서는 서버가 실행할 수 있는 파일의 확장자를 사용해야 한다는 건 당연한 사실!

Web Shell을 품은 이미지가 준비되었다면 서버에 업로드 한 다음,

파일 경로를 파악해 요청을 보내면 된다.

이 밖에도 파일 업로드 공격에 관한 시나리오는 다양하겠지만 간단한 예시들을 살펴보고 싶다면

Last updated