사이트 개발 후 취약점 진단 및 대응방안

2023. 6. 24. 19:15Project


1. 개요

1-1. 공격 대상

대상 IP 정보 언어 웹 서버

localhost PHP&MYSQL XAMPP

1-2. 점검항목

순번 분류 진단 항목

1. 관리자 페이지 접근 여부,사전 공격 관리자 페이지 노출 여부,사전 공격 여부
2. 디렉토리 리스팅 취약점 디렉토리 리스팅 노출 여부
3. SQL INJECTION SQL Injection 허용 여부
4. 에러 메시지 처리 에러 메시지를 통한 중요/불필요한 정보 유출
5. 회원가입 우회 회원가입 우회

1-3. 점검 도구

순번 도구 이름

1. DirBuster
2. Burp Suite

1-4. 디렉토리 구조 파악

DirBuster 도구를 이용하여 웹 서비스의 디렉토리 구조를 파악합니다. 127.0.0.1을 대상으로 small.txt 를 통한 사전 공격으로 디렉토리 구조를 파악했습니다.

1-4. DirBuster 스캔 결과


2. 취약점 점검

2-1. 관리자 페이지 노출

DirBuster 스캔 결과 admin.html 관리자 페이지 있는걸 확인할 수 있습니다.

위 사진을 보면 관리자 페이지(admin.html)에 모든 사용자가 접근할 수 있습니다.

관리자 페이지는 회원 관리, 게시판 관리 등 웹 서비스의 전반적인 기능을 제공합니다.

관리자 페이지에 접근할 수 있는 사용자는 SQL 인젝션, 무차별 대입 공격, 사전 공격 등 다양한 형태의 공격을

시도할 수 있으므로, 보안에 주의해야 합니다.

2-1. 관리자 페이지 사전 공격

 BURP SUITE 도구를 이용한 관리자 페이지를 대상으로 사전 공격을 실시하였습니다.

Burp Suite의 Intruder 기능을 활용하여

취약한 패스워드 리스트를 사용하여 id = admin으로 추정되는 관리자 계정에 대한 사전 공격을 수행했습니다.

Response 값 확인 → Login Failed 출력

Response 값에서 PHP 8.24 Apache 2.4.56 버전을 확인 할 수 있습니다.

해당 버전의 취약점을 이용한 2차 공격의 정보로 사용될 수 있습니다.

Response 값에서 → 로그인 성공 메시지와 ami.php 페이지로

이동하는 것을 확인할 수 있었습니다.

관리자 페이지의 비밀번호는 monkey인 것을 알 수 있습니다. 😀


2-2. 디렉토리 리스팅 취약점

서버의 image 폴더 안의 이미지 리스트가 노출되는 취약점이 발견되었습니다. 이로 인해 서버 내의 소스코드 등의 중요 정보가 노출될 가능성이 있습니다.


2-3. SQL INJECTION

‘ || 1=1 # 구문으로 인젝션 시도했습니다.

성공적으로 SQL INJECTION이 되는것을 확인할수 있었습니다.


2-4. 에러 메시지 처리

회원가입 폼에 싱글 쿼터 (’)를 입력하여 에러 메시지 출력 유/무 를 확인했습니다.

불필요한 에러 메시지가 출력되는 것을 확인할 수 있습니다. 'INSERT INTO 'me...')'구문을 통해서 테이블 값은 ‘member’ 로 유추 가능합니다. 이 정보는 공격에 활용될 수 있습니다.


2-5. 회원가입 우회

자바스크립트 회원가입 유효성 검사 로직입니다.

관리자도구를 이용해서 회원가입 유효성 우회 할 수 있습니다.


 

3. 대응 방안

3-1. 관리자 페이지 노출

#1 관리자 페이지 이름을 유추하기 어려운 이름으로 번경하기.

#2 관리자 페이지에 접근하지 못하도록 관리자 페이지에 접속하기위한 세션 관리하기


3-1. 관리자 페이지 무차별 공격

#1 특정 시간 내의 로그인 시도 횟수 제한하기

#2 캡챠 기능 넣기

#3 비밀번호 길이 최소 8자리 이상, 영문 숫자 특수문자의 조합으로 비밀번호 만들기


3-2. 디렉토리 리스팅 취약점

#1 Apache httpd.conf 파일 수정하기

httpd.conf 파일에 있는 Options 지시자에서 Indexes 문구 제거하기


3-3. SQL INJECTION

#1 PHP preg_match()함수 사용하기

preg_match(”필터링 할 문자”,$입력값) exit(”no hack”);

필터링 : ‘(싱글쿼터) “ — # ( ) = + select union insert drop update and or from where substr % 공백

#2 웹 방화벽 (Web Application Firewall, WAF) 구축 하기


3-4. 에러 메시지 처리

#1 에러가 났을 경우에는 에러에 대한 정보를 보여 주는 것이 아니라 오류 페이지를 출력하도록 설정합니다.

ErrorDocument 500 “제작한 에러페이지 경로”

#2 PHP ini_set() 함수를 이용하여 에러 메시지 출력하지 않도록 설정하기

#3 php.ini 파일 수정해서 display_errors=On→display_errors=Off 로 바꾸어주기

 


3-5. 회원가입 우회

#1 자바스크립트가 아닌 서버측 PHP 에서 회원가입 입력 값들을 검증하는 로직을 개발합니다.