※ 주의 : 보안 관련 학습은 자유이지만, 학습 내용을 사용한 경우 법적 책임은 행위자에게 있습니다. (Note: Security-related learning is allowed, but the individual is solely responsible for any legal consequences arising from the use of the acquired knowledge.)
※ 공부 기록용 포스트이며, 검수를 하고 올리지만 간혹 잘 못된 정보가 있을 수도 있습니다.
[보안 공부] 15주 차 - 파일 업로드 취약점 2
PC 화면에서 보시기 적합하도록 작성되었습니다.
파일 업로드 취약점 2(File Upload vulnerability) 파일 다운로드 취약점(File download vulnerability)
이전 글에서 파일 업로드의 기본적인 것을 설명했다. 이번 글에서는 기본적인 것 + 조금 더..를 알아본다.
당연한 얘기이지만.. 서버 OS에 맞게 공격을 해야 한다.
윈도우 server OS이라면 exe파일을 업로드해야 OS가 실행할 수 있을 것이다. 다만 웹 쉘의 경우 웹 앱이 처리하는 것이라서, PHP는 윈도우나 리눅스나 같은 PHP라서 PHP 코드는 같다. 당연히, 명령어는 OS에 맞게 명령어를 작성해야 한다.
리눅스 ↔ 윈도우 echo system('ls'); echo system('dir');
리눅스 ↔ 윈도우 명령어 참고 pwd ↔ cd ls ↔ dir rm ↔ del cat ↔ type ps ↔ tasklist uname -a ↔ systeminfo find ↔ fir /s chmod ↔ icacls
확장자가 달라도 php로 실행시키는 방법(특수한 경우만 가능)
기본적으로 png, jpg 같은 그림 파일은 그림으로만 실행된다. 아무리 파일 내부의 어떤 raw 한 값을 수정하더라도 OS는 절대, 반드시 그림으로만 실행한다. 만약 이 것이 가능했더라면? 현재 웹 세상은 무너진다. 기본적으로는 절대 불가능하다는 얘기이다. 다만 매우.. 특수한 경우, 확장자가 달라도 실행시킬 수 있는 경우가 있긴 하다.
php로 실행하도록 설정값을 변경한 경우. 같은 디렉토리에 .htaccess 라는 숨김 파일에, AddType application/x-httpd-php .jpg 위와 같은 내용을 추가한다면, jpg 확장자를 php로 실행시킨다. 즉, .htaccess 파일을 먼저 업로드나, 수정할 수 있다면 이 공격이 가능해진다.
애플리케이션에서 Null Byte Injection 공격이 통하는 경우. 예시) webshell.php%00.jpg Null Byte Injecion은 PHP의 취약점이었고, PHP 5.3.4 버전(2010년 말)에서 패치되었다. 예시의 파일이름은 확장자 필터링에는 걸리지 않고, PHP로 업로드될 때 Null 값(%00) 뒤는 무시되어 버리기 때문에 webshell.php로 업로드되어 버린다.
필터링 기능에 의해 특정 문자가 삭제된 경우 select라는 문자를 필터링해서 없애는 코드가 있다고 했을 때, webshell.pselecthp로 업로드를 하는 경우, 확장자 검증 코드 이후에 필터링이 존재한다면, webshell.php로 업로드되는 경우가 있을 수 있다.
파일 include 취약점이 있는 경우 → 아래 따로 설명
리버스 쉘 (Reverse Shell)
지금까지 배운 웹 쉘은 요청이 [해커 → 서버] 였다면 리버스 쉘은 반대이다. 웹 쉘은 웹(http, https)을 통한 명령어 실행 및 출력 결과만 간단하게 볼 수 있다는 한계가 존재하며, 이 한계를 극복해 내는 것이 리버스 쉘이다. 주된 이유는 방화벽 우회 때문이다. 방화벽은 외부에서 들어오는 것은 매우 잘 막아내지만, 내부에서 나가는 것은 기본적으로 막지 않는다. 리버스 쉘로 작동하면, 내부의 요청이 나갔다가 응답을 받는 것이라서 막지 않는다. 기타 고급 권한 획득, 탐지 회피, CLI 환경을 넘어 원격 데스크톱처럼 화면을 받아올 수도 있다.
파일 Include 취약점 (File Inclusion Vulnerability) → 업로드 취약점이라기보다는 웹 앱의 취약점이다.
이 것도 웹 프로그래밍의 기능일 뿐이지만 그것을 이용하여 새로운 것을 하는 것이다. PHP에서는 아래와 같이 작성할 수 있다. <? php include($_GET['include']); ?> php 코드에서 include() 함수를 사용하면 파일을 php코드로 실행시킬 수 있다. 웹 쉘코드가 담긴 abcd.jpg 이라면, include 파라미터에 abcd.jpg를 담아주면 웹 쉘이 실행된다. php코드가 아닌 텍스트 파일은 그냥 텍스트로 출력된다. 하지만 .txt라도 php코드가 있으면 실행된다. 잘 활용한다면, log에 php코드가 담기도록 웹을 서핑하고, include로 log파일을 넣어주면 php코드가 실행된다.
파일 업로드 방어 방법
웹 프로그래밍 코드가 실행하지 않도록 하면 된다.
파일 이름, 확장자 검증 및 필터링
MIME 타입 검증
실행될 일 없는, 파일 서버 사용
파일 저장 방법 변경(BLOB, CLOB)
파일이 저장되는 경로를 변경, 웹 어플리케이션으로 실행되지 않도록 설정
경로나 파일 이름을 알 수 없도록 난독화, 난수 사용
파일 다운로드 취약점 (File download vulnerability)
서버에서 의도하지 않은 파일들을 다운로드할 수 있는 것이다. 소스코드가 탈취당할 수 있기에 이것도 영향력이 큰 취약점이다. 웹 경로가 보호되지 않아서 발생하는 패스 트래버설(Path Traversal) 공격
※ 아파치 기준 디렉토리 리스팅 제거 설정 방법 # vi /etc/httpd/conf/httpd.conf 파일에서 Options Indexes FollowSymLinks에 #을 붙여서 주석처리한다. # systemctl restart httpd 로 재시작을 하면.. 막힌다.