슈개's IT/SW개발보안

[SW개발보안] SR1-10. 업로드·다운로드 파일 검증

슈개 2021. 1. 23. 10:15
반응형

[SW개발보안] SR1-10. 업로드·다운로드 파일 검증

 

 

 

위험한 형식 파일 업로드

파일 업로드 기능이 존재하는 경우, 

파일의 크기와 개수를 제한하지 않고,

파일의 종류를 제한하지 않고, 

외부에서 접근 가능한 경로에 파일을 저장하는 경우 발생

 

→ 서버의 연결 자원, 디스크 자원을 고갈시켜 정상적인 서비스를 방해

→ 서버 사이드에서 동작하는 프로그램을 업로드 후 실행하여 해당 서버의 제어권을 탈취 ⇒ 웹쉘(WebShell)

→ 악성 코드의 유포지로 악용

 

[방어기법]

  1. 파일의 크기와 개수를 제한

  2. 파일의 종류를 제한

    1. 확장자 검증

    2. Content-Type 검증

    3. File Signature = Magic Number(Code) ⇒ https://www.garykessler.net/library/file_sigs.html

  3. 외부에서 접근할 수 없는 경로에 파일을 저장 ⇒ Web Root 밖 또는 Web Document Root 밖

http://www.test.com/data/xyz.html

해당 서버에 디렉터리 /usr/html/data/xyz.html

  1. 저장에 사용하는 파일명과 파일경로를 외부에서 알 수 없도록 처리

  2. 업로드 파일을 저장할 때 실행 속성을 제거 후 저장

 

[클라이언트 측 소스코드]

<form enctype="multipart/form-data" method="post" … >

<input type="text" name="age">

<input type="text" name="email">

<input type="file" … >

</form>

 

[클라이언트 측 소스코드]

<form enctype="multipart/form-data" method="post" … > : 업로드기능이군

<input type="text" name="age">

<input type="text" name="email">

<input type="file" … > : file은 age,email처럼 사용하기 어렵군..

 

</form>

 

 

[서버 사이드 소스 코드]

MultipartHttpServletRequest

MultipartFile

 

[서버 사이드 소스 코드]

MultipartHttpServletRequest 

MultipartFile (파일 크기, 이름 등 확인 → 파일을 저장하게 만듬)

→ Multipart 가 보이면 파일 업로드 기능이 있구나 라고 알기

 

  1. 일반 주소처럼 파일을 넣기에는 어려움

    1. 파일 내용 제각각, 파일 이름, 경로 등 넣을게 많음

    2. test.jsp?name=kkk&email=kkk@naver.com&fileupload=????

  2.  boundary=[values] 

    1. → URL에서 & 역할과 같음(test.jsp?name=kkk&email=kkk@naver.com)

    2. 위에 그림을 굳이 표현하자면

      1. filename=test.txt & filename=test1.txt

 

  • 서버 사이드 스크립트 언어로 제작

  • 1개의 파일로 구성

  • 운영체제 명령어 삽입 취약점을 이용한 공격을 쉽게 할 수 있도록 구현

 

 

웹쉘

  • 서버 사이드 스크립트 언어로 제작

  • 1개의 파일로 구성

  • 운영체제 명령어 삽입 취약점을 이용한 공격을 쉽게 할 수 있도록 구현

c99madshell 검색

https://www.google.com/search?q=c99madshell&oq=c99madshell&aqs=chrome..69i57.4094j0j4&sourceid=chrome&ie=UTF-8

 

open webshell project 검색

https://www.google.com/search?sxsrf=ALeKk03fMw1LSjS2ZPeeIlXv1rC0-kdvmA%3A1597194538709&ei=KkEzX6f2KoPdmAX1tY24DQ&q=openwebshell+project&oq=openwebshell+project&gs_lcp=CgZwc3ktYWIQAzoECCMQJzoICAAQDRAFEB46CAgAEAgQDRAeOgoIABAIEA0QChAeOgcIIRAKEKABUNhMWMJeYLZfaABwAHgAgAG2AYgBhQmSAQMwLjmYAQCgAQGqAQdnd3Mtd2l6wAEB&sclient=psy-ab&ved=0ahUKEwins_eovZTrAhWDLqYKHfVaA9cQ4dUDCAw&uact=5

 

무결성 검사 없는 코드 다운로드

외부로부터 가져온 파일(코드)에 대해서는 반드시 무결성 여부를 검증 후 최소 권한으로 실행(사용)해야 한다. 

 

경로조작 및 자원삽입

~~~~~~~~

외부 입력값을 파일의 식별자로 사용하는 경우, 

지정된 경로를 우회할 수 없도록 경로 조작 문자열 포함 여부를 확인 후 사용해야 한다. 

 

인증과정 

사용자가 제시한 정보를 바탕으로 사용자를 확인하는 과정 ⇒ 사용자가 제시한 인증 정보가 서버에 존재하는지 확인하는 과정

 

 login.do?id=admin&pw=abcd 

--------------------------->

<--------------------------- 

로그인 성공                일치하는 정보가 있으면

로그인 실패                일치하는 정보가 없으면

 

 login.do?id=admin&pw=abcd 

                      ~~~~

                      1) 사전대입

                      2) 무작위대입 

 

인증 기능을 악용하여 특정 사용자의 인증 정보를 확인하는 것을 방어하기 위해서는

입력값의 개수를 증가 ⇒ CAPTCHA = 자동화된 요청을 방해

출력값의 경우를 증가 ⇒ 더 이상 확인 안 해줘 = 인증 시도 회수 제한

 

암호이용안내서

패스워드 선택 및 이용 안내서(2019.06)

https://seed.kisa.or.kr/kisa/Board/53/detailView.do

 

패스워드 생성, 관리 규칙

패스워드 생성 규칙

  • 복잡도 규칙을 준수

  • 변경 및 재설정 때도 생성과 동일한 규칙을 적용

 

패스워드 관리 규칙

  • 변경 주기 정책

  • 히스토리 정책

  • 최소 사용 기한 정책

 

비슷한 문자를 대체해서 사용하는 경우 

p@ssw0rd

 a   o   

 

I love you

i 10v2 u


 

암호화 

  • 안전한 암호 알고리즘을 사용

  • 안전한 키 길이를 사용

    • 안전하지 않은 암호화 알고리즘 

      • (해쉬) MD4, MD5, SHA1

      • (대칭키) DES

      • 인코딩/디코딩 기법을 이용해서 암복호화 기능을 구현하는 경우

  • 암호화 키를 안전하게 보관 ⇒ 암복호화 처리하는 곳, 암호화된 결과를 저장하는 곳 등과 물리적으로 분리된 곳에 저장


 

스니핑 vs 스푸핑

스니핑 공격은 스니퍼를 이용하여 네트워크상의 데이터를 도청하는 행위를 말한다. 스니퍼란 컴퓨터 네트워크상에 흘러 다니는 트래픽을 엿듣는 도청장치라고 할 수 있다.

 

스푸핑 공격은 외부 악의적 네트워크 침입자가 임의로 웹사이트를 구성하여 일반 사용자들의 방문을 유도해 인터넷 프로토콜인 TCP/IP의 구조적 결함을 이용하여 사용자의 시스템 권한을 획득한 뒤 정보를 빼가는 해킹 방법이다. 스푸핑 공격의 종류에는 ARP 스푸핑, IP 스푸핑, DNS 스푸핑, 이메일 스푸핑 등이 존재한다.

 

관리자 페이지

  1. 관리자 페이지와 일반 사용자 페이지를 분리해서 개발, 운영

  2. 내부망에서만 접근할 수 있도록 제한

  3. 관리자 페이지 접속 정보를 알 수 없도록 한다. ⇒ IP, 잘 알려지지 않은 포트번호

  4. HTTPS를 통해서 서버스

  5. 관리자 페이지에 접속할 수 있는 PC(IP)를 제한(한정한다.)

  6. 외부에서 관리자 페이지 접속을 위해서는 VPN을 이용

 

대칭키 vs 비대칭키

대칭키 = 암호화에 사용한 키와 복호화에 사용한 키가 동일

= 유일키

= 비밀키

= 관용 암호화 방식

⇒ AES, SEED, ARIA, LEA, … 

⇒ 단점: 키 분배 및 관리 문제

 

비대칭키 = 암호화에 사용한 키와 복호화에 사용한 키가 상이

~~~~~~~~

키쌍 ⇒ 개인키

        공개키  

⇒ RSA, ECC, KCDSA, … 

 

             Apub    Bpub

 

    A    --------------------->    B

  Apri                           Bpri 

 

[기밀성 서비스를 제공하는 방법]

1) Bpub 취득                  +---> 4) Bpri로 데이터를 보호화

2) Bpub로 데이터를 암호화     |

3) 암호화된 데이터를 전달 ----+

 

[인증, 원본증명, 부인방지 서비스를 제공하는 방법]

1) Apri로 데이터를 암호화        +---> 3) Apub 키를 취득 

                                 |     4) Apub 키를 이용해서 데이터를 복호화

2) 암호화된 데이터를 배포 -------+       

 

송신자의 개인키로 암호화하는 것을 서명, 

송신자의 공개키로 복호화하는 것을 서명 검증 이라고 함

반응형