본문 바로가기
Web hacking/Nomaltic) 웹 해킹 수업 노트 👩‍💻

[9주차]파일 업로드/다운로드 취약점

by m_.9m 2021. 12. 8.

1. 파일 업로드 공격

**개념

  • 웹 서비스 첨부파일, 환경설정 미흡을 이용하여 악의적인 스크립트가 포함된 파일을 업로드 한 후에 웹 서버에 침투를 하는 공격(첨부, 경로파악, 공격 모두 가능해야함)
  • 공격자는 서버 사이드 스크립트(php, jsp, .net 등)을 이용해서 웹쉘을 제작한다.
  • 웹쉘은 원격에서 웹 서버를 제어하기 위해 만들어졌지만 지금은 웹쉘=악성코드로 분류해서 안티 바이러스에서 탐지한다.
  • 게시판 첨부파일, 이력서 첨부파일, 이미지 첨부파일, 웹 채팅방 파일 공유 기능 등에서 발생
  • 직접 만들어 사용할 수 있으나, https://github.com/tennc/webshell 같은 깃허브에서 쉽게 구할 수 있다.

**목적

웹 서버를 통해 데이터 베이스의 정보를 획득. 

-데이터 베이스에 직접 공격을 할 수 없기 때문에, 웹 서버를 침투한 후 소스코드내 데이터베이스 연결 정보를 통해 개인정보쿼리를 수행.

-웹 서버를 통해 데이터베이스 2차 공격도 가능하다.

웹서버를 시작으로 근접 네트워크에 침투한다.

데이터 베이스에 직접 공격을 할 수 없기 때문에, 웹 서버를 침투한 후 내부 시스템의 정보를 획득.

내부 포탈 서버, 로그 서버 등 내부 시스템을 대상으로 포트포워딩, 터널링 기법을 통해 공격자와 직접 연결함.

 

**원리

첨부한 파일이 서버에 저장되는 것을 이용한다. 파일을 업로드하면 서버는 지정된 경로에 파일을 저장하게 된다. 이런 점을 이용해 공격을 하는 것이 파일 업로드 공격의 원리이다.  

$uploaddir = /varr/www/html/upload

해커는 명령이 가능한 파일을 업로드 하는데, 이런 파일을 Wed shell이라고 한다. 이 Web Shell은 서버와 같은 언어로 작성되어야한다. 이제 이 Web Shell 파일에 접속하려면 파일의 이름을 알아야하는데 경로를 알아보는 방법은 웹 사진에 커서를 올렸을 때 뜨거나 혹은 바로가기로 복사가 되는 경우, 미리 파일을 올려 그 파일의 경로를 이용해서 웹쉘을 올릴 수도 있고 Directory traversal을 이용하는 경우도 있다. Index of/ directory(Index of "parent directory"를 검색)은 심각한 취약점이다. 이렇게 경로를 알아내면 웹 쉘에 접근하고 파일 업로드 공격을 성공하게 된다.

/

이렇게 공격에 성공하게 되면 서버 내부파일을 삭제하거나 DB 내용 수정, DB 내용 유출 등의 공격을 할 수 있다. Root 권한을 얻으면 서버내 모든 작업을 가능하게 한다.

 

**대응방안

(1) File Extensions Filtering:서버에 업로드 할 수 있는 유형이 사진이나 문서라면 .png/.jpeg/.docx등으로 확장자를 제한해준다. .exe/.php/.jsp/.asp 등은 업로드하지 못하게 제한한다.

 

(2) File Mime Type Filtering: 통신과정에서 보내는 파일의 형태를 알려주는 값. php,asp 파일을 업로드 한다면 이 파일들은 application/octet-stream 값을 가지게 되는데, 이미지 파일만 허용하고 싶다면 Mime Type Filtering시 image/jpeg만 허용하는 방법을 사용할 수있다.

 

(3) Set Maximum File size: 다양한 기능을 하는 웹쉘같은 경우 파일의 크기가 굉장히 크기 때문에 파일 크기에 제한을 두어 이를 막는 것이다.

 

(4) Randomize uploadedFile names: 해커를 웹쉘에 접속하기 위해 이 경로를 알아야하는데 이를 위해서는 자신이 업로드한 파일의 이름을 알아야한다. 이를 막기 위해서 업로드하기 전 이름과 업로드 한 후의 이름을 다르게 난소화해서 저장해 파일을 찾을 수 없게 만드는 것이다. 

 

(5) Decrease authority of upload Folder: 해커가 웹쉘의 경로를 찾아 들어가도 파일의 권한을 축소하면 공격을 예방할 수 있다. 예를들어 파일에 rwxr-xr-x로 쓰기 권한이 없다면 수행할 수 있는 공격이 없어 예방이 가능하다.

 

**대응방안의 우회

(1) File Extensions Filtering만 적용되어있는 경우 .php.png(확장자를 두개 붙인다) 혹은 .php%00.png(NULL전송), .php;.png(세미콜론으로 주석처리)등으로 우회가 가능하다.

 

(2) File Mime Type Filtering만 적용되어있는 경우 프록시툴을 사용해서 우회할 수있다. 클라이언트에서 서버로 가는 요청 패킷을 가로채 마인 타입을 변경하면 서버는 마인 타입만 검사하기 때문에 우회가 가능하다. 다만 해커가 웹쉘에 접속했을 떄 확장자가 php로 서버 스크립트로 남아있어 웹쉘이 정상 작동할 수 있다.

 

(3) Set Maximum File size의 우회는 여러가지 기능을 뺀 (예를 들어 one line web shell) 웹쉘을 넣어 이를 가능하게 할 수있다.

 

TIP------------------------------------------------

1. 테스트했던 웹쉘들이 Burp suite spider기능으로도 쉽게 노출이 되어 외부인에게 노출될 수 있다.

테스트 페이지(php.info 등)를 충분히 올린 후에 웹쉘을 첨부하자. 

2. 웹쉘에 최소한의 기능만 포함해도 좋다. 백신, 웹쉘 차단 솔루션에서 차단될 가능성.

Or 크기를 제한할 수도 있다. 작은 크기의 웹쉘로 시도해본다.

3. 차단 솔루션을 우회할 수았는 여러 방법을 연구하자.

-----------------------------------------------------

 

2. 파일 다운로드 공격

**개념

보통 파일의 다운로드 시 우리는 URL 주소로 요청을 보내는데.

(예: http://example.com/download?filename=something) 

이를 악용해 중요한 정보가 담긴 파일을 다운로드한다던가 하는 방법으로 취약점 공격을 수행한다. 

(예: http://example.com/download?filename=/etc/passwd 패스워드를 관리하는 파일)

 

대부분의 서버파일은 다운로드 파일보다 상위에 존재하기 때문에 상위 폴더로 올라가는 ../나 인코딩 방법을 사용한다.

상위 (../) 경로의 갯수는 상관없다. 단, 원하는 파일 경로의 개수보다 적으면 안된다.)

예: http://example.com/download?filename=../../../etc/passwd

예: http://example.com/download?filename=..%2f/..%2f..%2fetc..%2fpasswd

Path traversal 검색, 이를 성공하면 서버 내부 웹사이트 소스코드나 설정파일을 다운로드 받을 수 있다.

 

** /etc/passwd, /etc/my.cnf 등이 주요 목적 파일에 해당

 

**대응 방안 

(1)Directiory Traversal에 해당하는 "../" 문자열을 적절하게 필터링

if(preg_match(/..V/".$name)

{

echo "허용되지 않은 파일 이름입니다.";
}

 

(2) 업로드 된 파일만 다운로드 할 수 있게 적절히 필터링

(3) 다운로드할 수 있는 디렉터리 및 확장자 제한