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
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 주소 조작이 불가능함을 알 수 있었다.
'4-2. 2024-1 심화 스터디 > 웹 취약점 분석' 카테고리의 다른 글
[7주차] Security Misconfiguration 취약점 (3) (0) | 2024.05.25 |
---|---|
[4주차] Injection 취약점 분석/실습 (2/2) (0) | 2024.04.03 |
[3주차] Injection 취약점 분석/실습 (1/2) (1) | 2024.03.27 |
[2주차] Broken Access Control 취약점 분석/실습 (2) | 2024.03.18 |
[1주차] OWASP top 10 & DVWA 환경 구축 (0) | 2024.03.15 |