wonder

정보보안 스터디 - 9주차 1일 - 파일업로드 공격 개념 본문

hacking study/File Upload

정보보안 스터디 - 9주차 1일 - 파일업로드 공격 개념

wonder12 2022. 12. 9. 01:58

☞ 파일업로드 공격

파일업로드 공격은 DB만 장악하는 SQL처럼이 아니라 서버측에 파일을 업로드하여 서버전체를 장악하는 공격이라고 할 수 있습니다.

= 공격자가 원하는 임의의 파일을 업로드할 수 있는 취약점입니다. 서버에서 실행할 수 있는 악성코드입니다.

한줄코드로 간단하게 제작이 가능한 웹쉘을 php 파일 확장자로 서버에 올립니다.

 

cmd.php 웹쉘
<?php echo system($_GET['cmd']) ?>

php기반서버에서는 php만 실행되고 jsp인지 php인지 맞춰서 웹쉘 코드를 써줍니다.

 

system()명령어는 쉘에다가 명령어를 넣으면 실행시켜줍니다.

echo system('ls') 처럼 실행시킬 수 있고,

URL을 통해 GET방식으로 name="cmd" 라는 명령어를 불러온다는 뜻입니다.

 

여기서 서버에 올린 파일이 실행이 되는 이유는 웹서버 원리를 생각하면 당연하게 알 수 있습니다.

웹서버는 클라이언트가 index.html 파일에 요청하면 그 파일을 서버가 주는 구조입니다. 그렇기 때문에 cmd.php 파일을 달라고 요청하고 합니다.

 

흰 창이 뜬다면 성공적으로 파일을 받아온 것입니다. 아직 명령어를 전송하지 않았기 때문에 안나오는 것이고

cmd=ls -la, cd ../../, pwd 등 한다면 서버내에 명령어를 원격으로 실행 가능합니다.

 

여기서 id 사용자는 apache 등으로 root권한은 얻지 못한 상태입니다. 그렇기 때문에 읽기, 쓰기, 실행 권한허용이 안된 파일은 건드릴 수 없는 상태입니다. 그럼에도 불구하고 일반사용자로써 확인할 수 있는 부분이나 건드릴 수 있는 자료가 많습니다. 

 

 

게시판 업로드 뿐만아니라 프로필 사진, 서류제출 등 input 파일선택창이 띄워지는 곳이면

즉, 파일을 올릴 수 있는 곳이면 모든지 취약성검사를 해야합니다.

 

 

 공격 시나리오

그럼 파일 업로드를 통해서 어떤 공격이 가능할까요?

거의 모든 심각한 공격이 가능하겠지만 그걸 자세하게 창의적으로 표현할 줄 알아야 공격을 잘하는 것입니다. 

1. RCE (원격 명령어 실행)

쉘획득을 통해 명령어를 실행할 수 있다는 말은 서버장악을 했다는 말입니다.

리눅스 운영체제는 웹쉘을 통해 명령어를 받아서 기계어로 전달합니다.

 

 

2. 랜섬웨어

서버에 랜섬웨어 파일을 업로드하여

사용자 또는 서버 관리자가 설치하도록 유도할 수 있고, 실제 PC 접속하는 것 까지 취약할 수 있습니다.

또는 접근권한을 이용해 직접적으로 서버 파일을 암호화 시키는 방법도 있습니다. 

 

 

3. 디도스

파일이 업로드 가능한 상태라면 용량 제한이 없거나 서버의 한계에 달하는 용량의 파일을 업로드 할 수 있다면 

한계용량에 달하도록 파일을 업로드합니다.

그러면 사용자들은 서버에 접속하거나 파일을 실행,업로드하는데 있어서 서비스에 장애가 생깁니다.

 

4. Deface 공격

원하는 이미지/html을 업로드하여 

웹사이트 표면 메인 페이지에 hacked 되었다는 이미지 등으로 변조가 가능합니다.

사용자가 많은 사이트에 공격한다면 정치적으로 영향이 클 수 있습니다.

 

 

5. 마이너 프로그램 업로드

마이너 프로그램을 업로드하여 서버의 CPU, 용량을 사용해서 코인 채굴이 가능합니다.

스펙이 좋은 서버일 수록 코인채굴 하기에 용이하겠죠.

 

 

 공격과정

1. 이미지 파일을 먼저 올려보며 다운도 받아보고 어떻게 작동하는 지 확인합니다.

요청과 응답을 모두 확인합니다.

그리고 링크주소 복사 또는 burp suite에서 업로드되는 경로를 확인합니다.

아 웹쉘이 이곳에 업로드 되겠구나. 를 확인할 수 있습니다.

파일을 올리긴했지만 어디에 있는지 경로를 몰라서 실행못하는 경우도 허다합니다.

 

2. cmd.php확장자 파일을 올려봅니다.

여기서 php 확장자 파일을 받아들인다면 파일업로드가 성공한 것입니다.

 

 

3. 업로드된 경로로 들어가서 cmd.php를 불러오면서 실행시키면됩니다.

cmd.php?cmd=ls get방식으로 명령어를 받아들이게 합니다.

burp suite에서 응답을 받아오는 것이 더 보기에 편합니다.

찾을 파일이 있다면 find / -name flag.txt 로 찾습니다.

 

 

실제 환경에서는 file upload 취약점이 발견되면 리버스 쉘 방식으로 

공격자PC에 서버의 쉘을 연결해온다고 합니다. 더 많은 공격이 가능할 것으로 보입니다.

 

 

 

우회 기법

파일업로드를 할 때 php나 다른 확장자를 막기위해서 대응을 합니다.

그 대응이 서버측에서 막고있는지 클라이언트 측 대응인지 구분할 줄 알아야합니다. 

 

1. 파일 검증 우회

Content Type 또는 MIME은 파일 확장자를 구분해놓은 기준입니다.

burp suite에서 Content Type 을 변조합니다.

타입만 검증한다면 img로 타입만 변경해주면 됩니다.

 

2.확장자 검증

개발자가 특정 확장자만 블랙 리스트 기반 차단한 경우입니다.

php만 막았다면 php3, php5, phpml

jsp만 막았다면 jspx 를 그에 맞는 코드를 제작하여 시도합니다.

또한 pHp 대소문자도 구분도 시도해볼 법합니다.

 

3. 서버측 파일 오버라이드

흔하지 않습니다만

.htaccess 파일에 jpg 이미지 파일확장자라면 php 로 변경한다는 설정을 합니다.

png파일을 올리면 jpg에서 php로 변경되는 것을 볼 수 있습니다.

 

여기서 보면 아시겠지만 .php.jpg 형식은 절대 통하지않습니다.

(윈도우 기반 IIS에서만 .php%00.jpg 에서 %00이 뒤에있는 값을 주석처리해주는 경우가 있습니다.)

 

4. File signature

Hex 코드 수정

hex 에디터를 통해 이미지 파일의 바이너리, hex코드를 확인해보면 

png는 , jpg는 yoga로 확장자별로 특정접두사가 있습니다.

앞에 형식을 맞춰주지만 가장 마지막에 웹쉘코드를 넣으면 됩니다.

형식을 맞춰줬기 때문에 통과를 시키며 웹쉘코드를 찾아 실행합니다.

 

5. method PUT

PUT과 같이 다른 method로 변조하는 방법입니다.

PUT /webshell.php 로 넣고

바디에 코드를 쓰고 서버에 보내면 업로드가 가능합니다.

 

이렇게 개발하는 곳 (put을 허용하는 곳)에 취약점이 있을 수 있습니다.

 

6. 개발자의 실수 + 클라이언트 측 오류

개발자들은 서버(또는 +클라이언트)에서 파일 확장자 검증을 해야하는데 

클라이언트 측 브라우저에서만 자바스크립트로 검증을 하는 실수를 범합니다.

확인하는 방법은 Intercept켰음에도 불구하고 업로드했을 때 alert가 뜬다면 서버까지 안가고 클라이언트측에서만 검증하는 방법입니다.

 

그럴 경우에는 Intercept의 응답으로 온 스크립트를 수정을 하면 됩니다. 클라이언트 측 스크립트 코드는 나한테 온 코드이기 때문에 수정이 가능합니다.

스크립트 코드가 아마 노출되지않고 js로 include되어있을건데 시간이 많이 걸리겠지만 확인하면 됩니다.  

검증코드를 true로 바꿔주면 이미지 확장자 검사를 하지 않게됩니다.

 

그런데도 불구하고 서버에서 검증하여 경고창이 뜹니다. 하지만 우리가 업로드한 경로를 확인해보니 업로드가 되어 있습니다.

이런 경우는 개발자가 오류를 띄우고 막은것이아니라 업로드를 허용시키고 오류를 띄운 것이라고 볼 수 있습니다. 로그인 세션생성 부분 등에서 이런 실수를 생각보다 흔히 범합니다.

 

 

이렇게 정석적인 우회방안뿐만이 아니라

개발자의 입장에서 어떤 실수를 범할까 생각해보면서 시도해보는 것이 중요합니다.

 

다음시간에는 

디테일하게 다양한 시나리오와 우회방안을 가져오겠습니다.

 

 

 

Comments