본문 바로가기

4-2. 2024-1 심화 스터디/웹 취약점 분석

[6주차] Security Misconfiguration 취약점 (2)

1. File Upload 취약점 

[특징]

  • Security Misconfiguration과 Broken Authentication 등에 해당한다. 
  • 서버스크립트가 포함된 파일을 올려서 코드를 실행하는 공격이다. 웹쉘 업로드 공격이라고 하기도 함. PHP 애플리케이션의 경우, 확장자가 php, phtml 등인 파일이 업로드 가능할 경우에 발생.
  • 권한 상승, 정보 유출, 악성코드 배포 등의 공격이 발생할 수 있다.

[대응 방안]

  • 파일 확장자를 화이트리스트로 필터링한다. 
  • 웹 서버와 파일이 업로드되는 서버를 물리적으로 분리 
  • 파일이 저장되는 경로에서 실행 권한을 제거함. (PHP conf에서 disable_functions: ON, allow_url_fopen: OFF 설정 등

[공격 실습 및 분석]

low

더보기

 

문제에 접속한 화면이다. 파일을 업로드할 수 있는 버튼들이 있다. 

 

웹쉘을 실행하는 파일을 업로드해주기 위해서 파일을 먼저 만들어주자. 

cmd.php 파일을 생성해서 위와 같은 내용을 적어주었다.

 

 

그리고 업로드까지 성공했다. 심지어 어디에 파일이 저장되었는지 경로까지 출력해주었다. .../../hackable/uploads/cmd.php에 접속하면 웹쉘이 실행된다는 뜻이다. 

 

소스코드를 보더라도 파일 이름을 필터링하는 등의 조치가 보이지 않고, hackable/uploads/에 저장한다는 것을 알 수 있다. 



해당 파일 경로에 파라미터로 cmd 명령어들을 입력했더니 성공적으로 실행 결과가 출력되었다. id, uname -a, cat /etc/passwd 의 실행 결과가 연이어서 출력된 것을 알 수 있다. 

medium

더보기

 

medium 단계의 경우, 소스코드를 보니 JPEG, PNG로 업로드할 수 있는 파일 형식을 정해놨다. 따라서 위에서 만들었던 cmd.php 파일의 뒤에 .jpg를 붙인 후에 업로드했다. 

 

버프스위트로 패킷에서 cmd.php.jpg 파일의 이름을 cmd.php로 변경하고 포워딩해보면

 

이렇게 확장자 필터링을 우회해서 업로드할 수 있다. 

웹쉘 실행 성공 

high

더보기

 

high 단계의 소스코드에서는 medium처럼 확장자를 jpg, jpeg, png로 제한하면서 추가로 getimagesize() 함수를 사용해 이미지의 크기를 확인한다. 이 함수는 실제 파일이 실행되었을 때 이미지가 아니라면 False를 반환한다. 

 

따라서 파일 업로드 취약점은 온전하게 방어가 된다. 하지만! file inclusion 취약점이 존재하고 있다! 파일 이름을 받을 때 경로 관련 정보를 필터링하지 않는다. file inclusion 중 LFI로 공격을 하면, 서버의 내부에 업로드해서 저장된 파일을 실행한 ‘결과’를 출력할 수 있을 것이다. cmd.php.jpg로 업로드를 해도 결국 실행하면 웹쉘이 나오게 된다. 

 

이렇게 파일의 앞에 GIF89a를 넣어 이미지 파일인 것처럼 속인다. -> 이미지의 헤더

이렇게 업로드를 하고

  

file inclusion 페이지에 file://경로로 방금 업로드한 파일을 실행해보았다. 성공!

impossible

더보기

 

impossible 단계에서는 확장자를 이미지만 받는 것은 물론, imagecreatefromjpeg(), imagecreatefrompng() 와 같이 이미지만을 처리하며 이미지 데이터가 아닌 부분은 버리는 함수를 사용해서 이 취약점을 막고 있다. 

 

2. Open HTTP Redirect 취약점 

Open Redirect: 리다이렉트될 대상 URL을 사용자가 직접 조작할 수 있고 조작된 URL로 리다이렉트가 수행될 때 발생하는 클라이언트측 웹 취약점으로 피해자는 본인이 요청한 URL과 다른 URL에 방문하게 된다.

 

[특징]

  • URL을 사용자가 직접 조작할 수 있고 조작된 URL로 리다이렉트가 수행될 때 발생하는 클라이언트측 웹 취약점
  • URL이 지정된 Location 응답 헤더를 웹 브라우저로 보내서 리다이렉트 시키는 방법
  • 피싱 공격에 사용 가능

 

[대응 방안]

  • 매개변수에 들어온 값을 바탕으로 리다이렉션 시키지 않고 리다이렉트 시킬 주소를 화이트 리스트 형태로 작성해 둔다.
  • 리스트 이외의 입력은 alert 경고창을 통해 안전한 링크가 아님을 사용자에게 인지하게 한다.

 

[공격 실습 및 분석]

low

더보기

 

첫 페이지

Quote1을 눌렀을때

해당 부분을 바꿔보기로 한다

?redirect=https://hackingisly.tistory.com/?id=2

 

medium

더보기

 

이전 단계의 방식은 막힘

preg match 함수로 제한하고 있었기 때문.. 

앞에 https:를 생략해보자

?redirect=//hackingisly.tistory.com/?id=1



high

더보기

 

이전 단계의 방식은 막힘

strpos로 info.php라는 문자열이 있는지 파악하고 있으면 리다이렉트, 없으면 500 에러

info.php가 들어가게 작성

?redirect=https://hackingisly.tistory.com/?id=info.php


성공 

impossible

더보기

 

impossible 단계에서는 아예 redirect의 내용을 화이트리스트로 지정해두었다. 따라서 url 주소 조작이 불가능함을 알 수 있었다.