DongDD's IT

[정보보안기사 실기] 어플리케이션 보안 - 웹 서버, 데이터베이스 취약점 본문

자격증/정보보안기사

[정보보안기사 실기] 어플리케이션 보안 - 웹 서버, 데이터베이스 취약점

DongDD 2018. 5. 10. 15:14

[정보보안기사 실기] 어플리케이션 보안 - 웹 서버, 데이터베이스 취약점




디렉토리 인덱싱/리스팅 취약점


- 인덱싱 기능이 활성화되어 있는 경우, 공격자가 강제 브라우징을 통해 모든 디렉토리, 파일에 대한 인덱싱이 가능하게 되어 서버의 주요 정보가 노출될 수 있는 취약점


공격 방식


- URL에 페이지 이름이 명시하지 않고 디렉토리만 명시하여 확인

- 디렉토리, 파일을 볼 수 있다면 취약점이 존재하는 것으로 볼 수 있음


대응 방법


1. 아파치 웹 서버 설정 파일(httpd.conf)에서 디렉토리 인덱싱/리스팅 제한

- Options에 -indexes 추가

-> 인덱싱/리스팅 시도 시 403 Forbidden 응답을 받음


2. 윈도우 IIS 웹 서버에서 디렉토리 인덱싱/리스팅 제한

- IIS 등록 정보의 홈 디렉토리 탭에서 '디렉토리 검색' 기능 해제


3. Tomcat 웹 서버에서 디렉토리 인덱싱/리스팅 제한

- 설정 파일 web.xml에서 서블릿 파라미터 설정에 listings를 false로 설정

<init-param>

<param-name>listings</param-name>

<param-value>false</param-value>

</init-param>



웹 서비스 메소드 취약점


- PUT, DELETE, OPTIONS 등 불필요한 메소드를 허용할 경우 공격자가 이를 이용해 파일을 생성하거나 삭제, 수정이 가능한 취약점


공격 방식


- telnet을 통해 80 port에 접속해 OPTIONS 메소드를 요청 메시지로 보내면 OPTIONS를 지원할 경우 Allow 필드에 지원 가능한 메소드 리스트를 보여줌

- 사용 가능한 메소드를 이용해 공격


대응 방법


1. 아파치 웹 서버 설정 파일(httpd.conf)을 이용해 메소드 제한

- GET, POST 이외의 메소드 제한

<Limit-Except GET POST>

Order allow, deny

Deny from all

</Limit-Except>


2. OPTIONS 메소드를 통해 제한된 메소드 확인

- OPTIONS 메소드가 차단되면 요청 시 403 Forbidden 응답을 받음



관리자 페이지 노출 취약점


- 관리자 페이지가 추측 가능한 형태로 되어있으면 쉽게 접근할 수 있고 Brute Force를 통해 관리자 권한을 획득할 수 있는 취약점


공격 방식


- admin.php, manager.php 등 추측 가능한 관리자 페이지 이름을 이용해 관리자 페이지를 찾음


대응 방법


1. 관리자 페이지 이름을 추측하기 어렵게 만듬


2. 관리자 페이지 접근 제어 설정

- httpd.conf에서 설정(Deny->Allow 순)

<Directory "directory_name">

Order deny, allow

Deny from all

Allow 허용IP

</Directory>

-> 허용되지 않은 IP로 접속 시 403 Forbidden 응답을 받음



위치 공개 취약점


- 소스 코드 수정 시 자동으로 로그 파일, 백업 파일이 생성되어 노출되는 경우, 공격자가 유추 후 직접 접근을 요청해 핵심 정보를 획득할 수 있는 취약점


공격 방식


- 웹 서버에 존재할만한 중요 파일을 유추해 다운로드, 정보 확인


대응 방법


1. 불필요한 파일 삭제, 적절한 접근제어 설정

- httpd.conf 파일을 통해 접근 제어 설정

<Files ~ "/.확장자명$">

Order allow, deny

Deny from all

</Files>

-> 허용되지 않은 파일 접근 시 403 Forbidden 응답을 받음



아파치 웹 서버 보안 대책


웹 서비스 최소 권한 사용자 운영


- 보안 취약점으로 권한 탈취가 발생할 가능성이 항상 존재하기 때문에 위험을 최소화하기 위해 최소한의 권한을 가진 사용자 아이디와 그룹으로 웹 서버 구동


1. 대응 방법

1) 웹 서버 실행 계정을 생성 후 로그인할 수 없게 함

- apache 아이디와 Apache 그룹을 생성해 로그인 쉘을 /bin/false or /sbin/nologin으로 설정해 로그인이 불가능하게 설정

2) httpd.conf에서 서비스 프로세스의 실행 권한을 해당 계정(apache)으로 설정

- 권한 탈취가 되더라도 root가 아닌 apache 계정으로 접근되기 때문에 피해를 최소화할 수 있음


심볼릭 링크 사용 설정 제거


- 심볼릭 링크를 허용하는 경우, 허용하는 디렉토리 외에 다른 디렉토리를 참조하는 링크를 액세스할 수 있는 취약점이 존재함


1. 대응 방법

- httpd.conf 파일에서 심볼릭 링크 차단

- Options에 -FollowSymLinks 추가

-> 심볼릭 링크를 통한 접근 시 403 Forbidden 응답을 받음


헤더 정보 최소화


- 웹 서버와 통신 시, 웹 서버는 응답 메시지의 헤더에 웹 서버 버전이나 응용 프로그램 버전을 보내는데 이러한 정보는 공격자가 공격하는데 유용한 정보를 제공하게 됨


1. 대응 방법

1) httpd.conf 파일에서 ServerTokens를 Prod로 설정

- ServerTokens [설정]

- 설정

-> Prod : 웹 서버 종류

-> Min : Prod + 버전 정보

-> OS : Min + OS 정보

-> Full : OS + 응용 프로그램 정보


httpd.conf 주요 내용


1. ServerRoot "directory"

- 웹 서버의 홈 디렉토리 설정(절대 경로)


2. PidFile "pid 설정 파일"

- 웹 서버가 실행될 때 PID를 기록한 파일의 위치 설정(ServerRoot 기준 상대 경로)


3. Listen port

- 웹 서버 데몬의 리스닝 포트


4. ServerTokens 설정


5. ServerAdmin 관리자메일주소

- 웹 문서 로딩 시 에러가 발생하면 보여줄 관리자 메일 주소


6. User user_name

   Group group_name

- 서비스 제공 작업 프로세스의 실행 User, Group 지정

- 권장 : root가 아닌 제한된 권한을 가진 nobody or 어플리케이션 계정 지정


7. Timeout N

- 타임 아웃을 N초로 설정


8. MaxClient N

- 최대 N개의 클라이언트와 동시 연결 가능


9. KeepAlive On/Off

- On : Client와 연결된 작업 프로세스가 지속적인 요청 작업을 게속 처리

- Off : 요청 시 마다 새로운 작업 프로세스가 처리


10. MaxKeepAliveRequest N

- KeepAlive가 On일 때, 요청 작업의 최대 갯수

- N을 초과하면 현재 프로세스를 종료하고 다른 프로세스가 처리


11. KeepAliveTimeout N

- KeepAlive가 On일 때, 설정한 시간 N초 동안 요청이 없으면 해당 프로세스 연결 종료



웹 로그 분석


목적


- 접속 사용자의 행위/취향 분석

- 보안 사고 발생 시 증거 자료로 사용

- 보안 사고 발생 전 이상 징후, 해킹 시도, 해킹 성공 여부 확인

- 다양한 웹 공격 패턴 파악

- 접속 시간, 접근 파일 정보, 사용자 정보 등 확인


HTTP 요청 메시지


1. 요청 메시지 포맷

<요청 라인> : 메소드 URI HTTP버전

<헤더 필드> : 필드명1 : 필드값2

  필드명2 : 필드값2

<빈 라인> : 헤더 정보의 끝을 의미

<요청 메시지 바디> : GET 방식의 경우 요청 데이터가 없으므로 메시지 바디가 없음


2. Query String

- ?field1=value1&field2=value2 의 형태로 URL을 통해 전달


3. 요청 메소드

- GET : URI로 지정된 리소스를 서버에 요청

- POST : URI로 지정된 리소스에 데이터를 전달해 처리한 결과를 서버에 요청

- HEAD : GET 방식과 유사, 응답에 실제 리소스없이 헤더만 있음

- OPTIONS : 서버가 지원하는 메소드 확인

- CONNECT : 웹 서버를 프록시로 사용해 클라이언트-웹 서버간 터널링 목적으로 이용

- PUT : 요청에 포함된 데이터를 서버에 저장

- TRACE : TRACE 요청을 수신한 서버는 수신한 요청을 메시지 형태로 클라이언트에 전송

- DELETE : 요청 리소스 삭제


HTTP 응답 메시지


1. 응답 메시지 포맷

<상태 라인> : HTTP버전 상태코드 응답문구

<헤더 필드> : 필드명1 : 필드값1

  필드명2 : 필드값2

<빈 라인> : 헤더 정보의 끝을 의미

<응답 메시지 바디> : 서버에서 클라이언트로 전송하는 데이터 포함


2. 상태 코드

1) 1xx : Information

- 100(Continue) : 클라이언트에게 일부 정보를 받았고 이후 정보 계속 요청

2) 2xx : Success

- 200(OK) : 요청이 성공

- 201(Created) : PUT 메소드에 의해 서버에 파일이 생성됨

- 202(Accepted) : 웹 서버가 명령을 수신

3) 3xx : Redirection

- 301(Move Permanently) : 요청된 정보 위치가 변경됨(Location 헤더 필드에 변경 URL을 적어서 응답)

- 302(Found) : 일반적인 정보 위치 변경(Location 헤더 필드에 변경 URL을 적어서 응답)

- 304(Not modified) : 요청된 정보가 변경되지 않았음(로컬 캐시 정보 이용)

4) 4xx : Client Error

- 400(Bad Request) : 잘못된 요청으로 처리 불가

- 401(Unauthorized) : 인증이 필요한 페이지 요청

- 403(Forbidden) : 접근 권한이 없음

- 404(Not Found) : 요청한 페이지가 없음

5) 5xx : Server Error

- 500(Internal Server Error) : 내부 서버 오류


웹 로그 구조


1. 웹 로그 종류

- NCSA CLF(Common Log Format) : Apache, Tomcat의 기본 포맷

- NCSA ELF(Extended Log Format) : CLF에 Referer, User-Agent 값이 포함된 포맷

- W3C ELF : Referer, User-Agent, Cooket 및 사용자 정보를 추가로 남길 수 잇는 포맷(IIS에서 사용)


2. 웹 로그 포맷

- Host : Client 호스트명/IP주소

- Ident : Client 사용자 이름(보통 "-" 사용)

- Authuser : 인증이 요청된 원격 사용자 이름(보통 "-" 사용)

- Date and Time : 요청을 보내는 시간 정보(dd/mm/yyyy:hh:mm:ss)

- Request : Client가 보낸 요청 라인 정보

- Status : Client의 요청 처리 상태를 나타내는 상태 코드

- Bytes : 서버->클라이언트 데이터 전송량(헤더 제외)

- Referer : 요청된 URL이 참조되거나 링크된 URL

- User-Agent : 클라이언트 OS 및 브라우저 버전 정보



보안 서버 구축


- 보안 서버(Security Server) : 인터넷 상에서 정보를 암호화하여 송수신하는 기능이 구축된 웹 서버

- 이미 구축된 웹 서버에 SSL/TLS 인증서나 암호화 소프트웨어를 설정해 암호화 통신을 지원하는 것을 의미


필요성


1. 정보 유출 방지(Sniffing 방지, 기밀성)

- 암호화 통신으로 외부 노출 위협을 방지


2. 위조/가짜 사이트 방지(Phishing 방지)

- SSL/TLS 인증서로 증명하여 위조 사이트 식별


3. 기업 신뢰도 향상

- 사용자에게 정보 보호의 신뢰성을 확인 시켜줌


SSL/TLS 보안가이드


1. SSL/TLS 서버 인증서 생성 시 보안가이드

1) 키 쌍 생성 시 2048 bit 이상의 키를 사용하고 서버 개인키에 대한 접근은 최소화하고 안전하게 관리

- openssl을 이용해 RSA 서버 개인키 생성

-> openssl genrsa -aes128 -out name private.key 2048

2) 인증서 발급 시 인증서 서명 알고리즘을 SHA-2(256bit)이상으로 설정

- SHA-1 해시 알고리즘 사용 시 취약할 수 있음

3) 인증서 발급 시 주체(Subject)/소유자의 CN(Common Name)을 서브 도메인까지 명시

- 서브 도메인을 명시하지 않으면 임의의 서브 도메인 인증서로 악용될 수 있음

- URL과 서버 인증서의 주체 CN이 일치하지 않으면 브라우저에서 경고 메시지 표시

- 주체 CN에 IP주소를 명시해 IP 주소 기반 접속 가능(서버의 IP주소가 바뀌면 재발급해야함)

4) 신뢰할 수 있는 인증 기관을 통해 인증서 발급

- 신뢰할 수 있는 인증기관에서 발급한 인증서가 아니면 브라우저에서 경고 메시지 표시


2. OpenSSL 라이브러리 보안가이드

1) 취약점이 발견된 OpenSSL 라이브러리를 사용할 경우 보안 업데이트 수행

- openssl version or openssl version -a로 확인


3. SSL/TLS 웹 서버 설정 보안가이드

1) 취약한 SSL2.0, SSL3.0을 비활성화하고 TLS1.0~TLS2.0을 사용

- httpd-ssl.conf or ssl.conf 설정 파일 수정

-> SSLProtocol all -SSLv2 -SSLv3 : SSLv2와 SSLv3을 제외한 모든 프로토콜 사용

-> SSLProtocol -all +TLSv1 +TLSv1.1 TLSv1.2 : TLSv1, TLSv2, TLSv3 프로토콜만 사용

2) 취약한 암호 방식을 사용하는 Cipher Suite(암호 도구 목록)을 제거

- httpd-ssl.conf or ssl.conf 설정 파일 수정

-> SSLCipherSuite ALL:!aNULL:!eNULL:!EXP:!ADH:!DES:!RC4

-> 암호 도구 목록 지정, 구분자로 ':' 사용

-> ALL : 모든 Cipher Suite 사용

-> !aNULL : 인증을 하지 않은 Cipher Suited 제거(Authentication)

-> !eNULL : 암호화를 하지 않는 Cipher Suite 제거(Encryption)

-> !EXP : 약한 암호키를 사용하는 수출용 Cipher Suite 제거

-> !ADH : ADH(Anonymous Diffie-Hellman) Cipher Suite 제거

-> !DES, !RC4 : 해당 알고리즘을 사용하는 Cipher Suite 제거



데이터베이스(My-SQL) 취약점


- 오라클에서 개발한 오픈 소스 관계형 DBMS

- My-SQL 최초 설치 시 "mysql"이라는 데이터베이스 생성

-> user table : 전체 데이터베이스에 적용되는 사용자 정보와 권한 정보

-> host table : 호스트 전체에 대한 데이터베이스 접근 권한 정보

-> db table : 각 데이터베이스에 대한 접근 권한 정보

-> table_priv table : 테이블에 대한 접근 권한 정보

-> columns_priv table : 테이블 컬럼에 대한 접근 권한 정보


My-SQL DBMS 취약점 점검


1. root의 패스워드 및 계정명을 변경

- 초기 패스워드 : 빈 값

- update 구문을 통해 password 변경

- flush privileges 명령으로 즉시 반영


2. My-SQL 설치 시 자동으로 생성되는 mysql 계정의 로그인 차단

- mysql 계정에 대한 관리가 소홀하면 이 계정을 이용해 침투하는 경우가 발생

- /etc/passwd 파일에서 로그인 쉘을 /bin/false or /sbin/nologin을 설정해 로그인이 불가능하도록 설정


3. 원격에서 My-SQL 서버로의 접속을 차단

- 디폴트 서비스 포트 TCP 3306을 차단해 로컬에서만 접근 가능하게 설정

-> my.cnf 설정 파일에서 "skip-networking"을 추가


4. 데이터베이스 사용자 별 접속/권한 설정

- user table의 host 컬럼을 조회해 접속 허용 호스트를 확인 후 적절하게 수정

- 일반 사용자의 File, Process, Shutdown 권한 제어

-> Select_priv, Insert_priv, Update_priv, Delete_priv : 각 명령 수행 권한

-> Create_priv, Drop_priv : Create, Drop문 수행 권한

-> File_priv : 파일에 데이터를 읽고 쓸 수 있는 권한(Select into outfile 출력 파일명, load data infile 입력 파일명)

-> Process_priv : 프로세스/스레드 정보를 보거나 중지시킬 수 있는 궈한(show processlist 명령으로 확인)

-> Shutdown_priv : mysqladmin shutdown 명령으로 서버를 종료시킬 수 있는 권한


5. My-SQL 버전 확인 및 보안패치 적용 여부 점검

- mysql -V or mysql --version 명령으로 버전을 확인한 후 적절한 보안패치 수행


6. My-SQL 데이터 디렉토리 보호 여부 점검

- 테이블의 데이터 및 로그를 저장하는 파일이 My-SQL 데이터 디렉토리에 저장됨

-> 디렉토리 권한 설정을 잘못한 경우 노출

- my.cnf 설정 파일을 통해 경로 확인 후 권한 수정(750)



Comments