[Web Application-모의해킹] 모의해킹 #1

2024. 4. 21. 16:22Project/Web Application-모의해킹

 

프로젝트 목적

 

  직접 개발한 웹 애플리케이션을 실무처럼 모의해킹하여 모의해킹 결과 보고서를 작성하고 보고서에 기재된 보안 권고안에 따라 직접 웹 애플리케이션 소스 코드를 보완하는 과정을 거친다. 이 과정에서 지식으로만 알고 있던 대응 방안들을 직접 구현함으로써 각 취약점 별 대응 방안에 대한 이해도를 높이는 효과를 누리도록 한다. 또한 시큐어 코딩 후에 해당 취약점이 방지됐는지 이행점검을 통하여 다시 한번 확인하는 과정을 통해 대응 방안을 체화시키도록 한다. 

 

 

모의해킹 대상 : Project : Web Site

 

  • 취약점 점검 대상 : Project : Web Site
  • 취약점 점검 대상 도메인 : http://192.168.74.129/php/
  • 취약점 판단 기준 : 주요정보통신기반시설 
  • 취약점 점검 툴 : Burp Suite, Wireshark, python

 

취약점 : SQL Injection

 

[판단 기준]

 

  임의로 작성된 SQL 쿼리 입력에 대한 검증이 이루어지지 않는 경우

 

[발견된 취약점 정보]

 

 URL 파라미터 메뉴
http://192.168.74.129/php/login_proc.php user_id 홈 > 로그인

 

[취약점 발견 검증 과정]

Blind SQL Injection

1) URL : /php/login_proc.php , 파라미터 : user_id

 

 

  로그인 페이지에 접속하여 로그인 가능한 계정과 비밀번호를 입력하고 로그인 버튼을 클릭한 후 성공적으로 로그인되었는지 확인한다.

 

 

  프록시툴로 성공적으로 로그인했을 때의 응답 결과를 확인한다.

 

페이로드 : vanhart'+and+'1'='1

 

  user_id 파라미터에 위와 같은 파라미터를 입력했을 시 이전 단계와 같은 결과를(성공적으로 로그인한 경우) 출력하는 경우 SQL 구문을 삽입 가능하다.

 

페이로드 : vanhart'+and+'1'='2

 

  user_id 파라미터에 위와 같은 파라미터를 입력했을 시 이전 단계와 다른 결과를(성공적으로 로그인 하지 못한 경우) 출력하는 경우 user_id 파라미터를 통해 참과 거짓의 결과를 이용하는 Blind SQL Injection 공격이 가능하다.

 

 

취약점 : 디렉터리 인덱싱

 

[판단 기준]

 

  디렉터리 파일 리스트가 노출되는 경우

 

[발견된 취약점 정보]

 

 URL 파라미터 메뉴
http://192.168.74.129/php/upload_folder/    
http://192.168.74.129/php/upload_folder/사용자 계정    

 

[취약점 발견 검증 과정]

 

1) URL : /php/upload_folder/

 

 

  웹 브라우저 주소창에 http://192.168.74.129/php/upload_folder/ URL을 입력하면 upload_folder 디렉터리 파일 리스트를 확인할 수 있다.

 

취약점 : 정보 누출

 

[판단 기준]

 

  웹 사이트에 중요정보가 노출되거나, 에러 발생 시 과도한 정보가 노출되는 경우

 

[발견된 취약점 정보]

 

 URL 파라미터 메뉴
http://192.168.74.129/php/404test    

 

[취약점 발견 검증 과정]

 

1) URL : /php/404test

 

URL : http://192.168.74.129/php/404test

 

  홈에 접속하여 웹 브라우저 주소창에 위와 같은 URL을 입력한다. 해당 URL은 공격 대상 웹 서버 내에 존재하지 않은 파일을 요청하여 에러를 유발하는 의도를 가진다.

 

 

  에러가 발생하여 에러 페이지가 출력되면 공격 대상의 웹 서버 버전을 확인할 수 있다.

 

 

취약점 : 크로스사이트 스크립팅(XSS)

 

[판단 기준]

 

  사용자 입력 값에 대한 검증 및 필터링이 이루어지지 않으며, HTML 코드가 입력·실행되는 경우

 

[발견된 취약점 정보]

 

URL 파라미터 메뉴
[form page]
http://192.168.74.129/php/board_write.php

[process page]
http://192.168.74.129/php/board_write_proc.php

[view page]
1.http://192.168.74.129/php/board.php
2.http://192.168.74.129/php/board_read.php?num=
title [form page]
홈 > 게시판 > 글쓰기

[view page]
1.홈 > 게시판
2. 홈 > 게시판 > 게시글
[form page]
http://192.168.74.129/php/board_update.php?num=

[process page]
http://192.168.74.129/php/board_update_proc.php

[view page]
1.http://192.168.74.129/php/board.php
2.http://192.168.74.129/php/board_read.php?num=
[form page]
홈 > 게시판 > 글쓰기 > 수정

[view page]
1.홈 > 게시판
2. 홈 > 게시판 > 게시글

[form page]
http://192.168.74.129/php/board_write.php

[process page]
http://192.168.74.129/php/board_write_proc.php

[view page]
http://192.168.74.129/php/board_read.php?num=
content [form page]
홈 > 게시판 > 글쓰기

[view page]
홈 > 게시판 > 게시글
[form page]
http://192.168.74.129/php/board_update.php?num=

[process page]
http://192.168.74.129/php/board_update_proc.php

[view page]
http://192.168.74.129/php/board_read.php?num=
[form page]
홈 > 게시판 > 글쓰기 > 수정

[view page]
홈 > 게시판 > 게시글

 

[취약점 발견 검증 과정]

Stored XSS

1) URL : [form page] /php/board_update.php?num=, [process page] /php/board_update_proc.php, [view page] 1./php/board.php, 2./php/board_read.php?num=, 파라미터 : title

 

 

  게시판 페이지에 접속하여 글쓰기 버튼을 클릭한다.

 

페이로드 : XSS 취약점 테스트"><script>alert(1);</script>

 

  제목 입력칸에 위와 같은 페이로드를 입력하고 내용 입력칸에는 임의의 내용을 입력 후 작성 버튼을 클릭한다.

 

 

  게시판 페이지에서 스크립트가 작동하는지 확인한다. 그리고 해당 게시글의 제목을 클릭하여 게시글 상세정보 페이지에 접속한다.

 

 

  게시글 상세정보 페이지에서 스크립트가 작동하는지 확인한다.

 

 

2) URL : [form page] /php/board_write.php, [process page] /php/board_write_proc.php, [view page] 1./php/board.php, 2./php/board_read.php?num=, 파라미터 : title

 

 

  게시판 페이지에 접속하여 'XSS 취약점 테스트 수정 게시글'이란 제목의 미리 만들어진 게시글 제목을 클릭한다.

 

 

  게시글 상세정보 페이지에 접속하여 수정 버튼을 클릭한다.

 

페이로드 : XSS 취약점 테스트 수정 게시글"><script>alert(1);</script>

 

  제목 입력칸에 위와 같은 페이로드를 입력하고 내용 입력칸에는 임의의 내용을 입력 후 저장 버튼을 클릭한다.

 

 

  게시판 페이지에서 스크립트가 작동하는지 확인한다. 그리고 해당 게시글의 제목을 클릭하여 게시글 상세정보 페이지에 접속한다.

 

 

  게시글 상세정보 페이지에서 스크립트가 작동하는지 확인한다.

 

 

취약점 : 약한 문자열 강도

 

[판단 기준]

 

  관리자 계정 및 패스워드가 유추하기 쉬운 값으로 설정되어 있으며, 일정 횟수 이상 인증 실패 시 로그인을 제한하고 있지 않은 경우

 

[발견된 취약점 정보]

 

 URL 파라미터 메뉴
http://192.168.74.129/php/login_proc.php user_pass 홈 > 로그인
http://192.168.74.129/php/sign_up_proc.php user_pass
user_pass_check
홈 > 회원가입
http://192.168.74.129/php/my_page_proc.php user_new_pass 홈 > 마이페이지

 

[취약점 발견 검증 과정]

 

1) URL : /php/login_proc.php, 파라미터 : user_pass

 

 

  로그인 페이지에 접속하여 아이디 입력칸에 vanhart, 비밀번호 입력칸에 123123을 입력하고 로그인 버튼을 클릭한다. 해당 계정으로 인증 실패를 유도하도록 한다.

 

 

  비밀번호를 의도적으로 5번 틀리게 입력하여 인증 실패를 하도록 한다.

 

 

  다시 올바른 비밀번호를 입력하여 정상적으로 로그인되는지 확인한다. 대상 도메인은 일정 횟수 이상 인증 실패 하여도 아무런 제한이 없는 것으로 확인되었다.

 

 

2) URL : /php/sign_up_proc.php, 파라미터 : user_pass, user_pass_check

 

 

  로그인 페이지에 접속하여 테스트용 계정을 입력하여 로그인 버튼을 클릭한다. 아이디는 test_1, 비밀번호는 1234이다.

 

 

  마이페이지 페이지에 접속하여 비밀번호 오른쪽의 변경 버튼을 클릭한다.

 

 

  비밀번호를 변경하기 위해 위에서부터 차례대로 '현재 비밀번호, 변경할 비밀번호, 변경할 비밀번호 확인'에 대응하는 값을 입력한다. 입력한 값은 위에서 부터 '1234, 123456789, 123456789'이다. 값을 모두 입력한 후 회원정보 수정 버튼을 클릭한다.

 

 

  다시 로그인 페이지에 접속하여 비밀번호가 성공적으로 변경됐는지 확인하기 위해 변경된 비밀번호를 입력하여 로그인 버튼을 클릭한다.

 

  

  로그인 페이지에 접속하여 테스트용 계정을 입력하여 로그인 버튼을 클릭한다. 아이디는 test_2, 비밀번호는 1234이다.

 

 

  마이페이지 페이지에 접속하여 비밀번호 오른쪽의 변경 버튼을 클릭한다.

 

 

  비밀번호를 변경하기 위해 위에서 부터 차례대로 '현재 비밀번호, 변경할 비밀번호, 변경할 비밀번호 확인'에 대응하는 값을 입력한다. 입력한 값은 위에서 부터 '1234, 11111111, 11111111'이다. 값을 모두 입력한 후 회원정보 수정 버튼을 클릭한다.

 

 

  다시 로그인 페이지에 접속하여 비밀번호가 성공적으로 변경됐는지 확인하기 위해 변경된 비밀번호를 입력하여 로그인 버튼을 클릭한다.

 

 

3) URL : /php/my_page_proc.php , 파라미터 : user_new_pass

 

 

  회원가입 페이지에 접속하여 새로 등록할 계정 정보를 입력하고 회원가입 버튼을 클릭한다. 해당 계정의 비밀번호는 '123456789'으로 입력하였다.

 

 

  로그인 페이지에 접속하여 이전 단계에서 등록한 계정 정보를 입력한다. 아이디는 test_1, 비밀번호는 123456789를 입력하고 로그인 버튼을 클릭한다. 그리고 정상적으로 로그인이 되는지 확인한다.

 

 

  회원가입 페이지에 접속하여 새로 등록할 계정 정보를 입력하고 회원가입 버튼을 클릭한다. 해당 계정의 비밀번호는 '11111111'으로 입력하였다.

 

 

  로그인 페이지에 접속하여 이전 단계에서 등록한 계정 정보를 입력한다. 아이디는 test_2, 비밀번호는 11111111을 입력하고 로그인 버튼을 클릭한다. 그리고 정상적으로 로그인이 되는지 확인한다.

 

 

취약점 : 불충분한 인증

 

[판단 기준]

 

  중요정보 페이지 접근에 대한 추가 인증을 하지 않는 경우

 

[발견된 취약점 정보]

 

URL 파라미터 메뉴
http://192.168.74.129/php/my_page.php   홈 > 마이페이지

 

 

[취약점 발견 검증 과정]

 

1) URL : /php/my_page.php

 

 

  로그인 페이지에 접속하여 로그인 가능한 계정 정보를 입력하고 로그인 버튼을 클릭한다.

 

 

  로그인 후 오른쪽 상단에 개인정보를 출력하는 마이페이지 버튼을 클릭하여 마이페이지 페이지에 접속한다.

 

 

  프록시툴로 Referer 헤더 값을 확인한다.

 

 

취약점 : 크로스사이트 리퀘스트 변조(CSRF)

 

[판단 기준]

 

  사용자 입력 값에 대한 필터링이 이루어지지 않으며, HTML 코드(또는 스크립트)를 입력하여 실행되는 경우

 

[발견된 취약점 정보]

 

URL 파라미터 메뉴
http://192.168.74.129/php/board_update_proc.php num 홈 > 게시판 > 글쓰기
http://192.168.74.129/php/board_delete.php?num= num 홈 > 게시판 > 글쓰기

 

 

[취약점 발견 검증 과정]

 

1) URL : /php/board_update_proc.php, 파라미터 :  num

 

 

  게시판에 접속하여 미리 작성해 둔 '게시글 수정 대상' 게시글의 제목을 클릭한다.

 

 

  수정 대상 게시글의 상세정보 페이지에 접속하여 URL을 확인한다. URL에서 확인해야 할 것은 해당 게시글의 num 파라미터이며 39인 것을 기억한다.

 

 

  다시 게시판 페이지에 접속하여 글쓰기 버튼을 클릭한다.

 

페이로드 : </textarea><iframe sandbox name="myFrame" style="display:none;"></iframe><form method="POST" action="http://192.168.74.129/php/board_update_proc.php" id="myForm" target="myFrame"> <input class="title-input" id="title" name="title" type="hidden" value="게시글 제목 수정 성공"><textarea id="content" rows="30" name="content" style="display:none;">게시글 내용 수정 성공</textarea> <input type = "hidden" name= "num" value="39"></form> <script>document.addEventListener("DOMContentLoaded", document.getElementById("myForm").submit())</script>

 

  게시글 내용 입력칸에 위와 같은 페이로드를 입력 후 작성 버튼을 클릭한다. 해당 페이로드는 XSS 취약점을 이용한 CSRF 공격 스크립트이며 스크립트가 작동하게 되면 이전 단계에서 확인한 num 파라미터 값이 39인 게시글의 제목이 '게시글 제목 수정 성공', 내용이 '게시글 내용 수정 성공'으로 수정된다. 

 

 

  게시글이 성공적으로 작성된 것을 확인하고 로그아웃 후 num 파라미터 값이 39인 게시글 작성자 계정으로 로그인한다. 그리고 게시판 페이지에 접속한다.

 

 

  게시판 페이지에 접속하여 스크립트가 작성된 '게시글 수정 공격 주체' 게시글의 제목을 클릭한다.

 

 

  게시글 상세정보 페이지에 접속하여 스크립트가 작동하도록 한다. 프록시툴로 게시글 수정 요청 헤더에서 Referer 헤더 값을 확인하여 스크립트가 작성된 게시글 URL인지 확인한다. 이후 게시글 상세정보 페이지에서 목록 버튼을 클릭하여 게시판 페이지로 돌아간다.

 

 

  게시판 페이지에서 num 파라미터 값이 39인 게시글의 제목을 클릭하여 게시글 상세정보 페이지에 접속한다. 그리고 게시글의 제목과 내용이 성공적으로 변경됐는지 확인한다.

 

 

2) URL : /php/board_delete.php?num=, 파라미터 :  num

 

 

  게시판에 접속하여 미리 작성해 둔 '게시글 삭제 대상' 게시글의 제목을 클릭한다.

 

 

  삭제 대상 게시글의 상세정보 페이지에 접속하여 URL을 확인한다. URL에서 확인해야 할 것은 해당 게시글의 num 파라미터이며 43인 것을 기억한다.

 

 

  다시 게시판 페이지에 접속하여 글쓰기 버튼을 클릭한다.

 

페이로드 : </textarea><img src="http://192.168.74.129/php/board_delete.php?num=43">

 

  게시글 내용 입력칸에 위와 같은 페이로드를 입력 후 작성 버튼을 클릭한다. 해당 페이로드는 XSS 취약점을 이용한 CSRF 공격 스크립트이며 스크립트가 작동하게 되면 이전 단계에서 확인한 num 파라미터 값이 43인 게시글을 삭제한다.

 

 

  게시글이 성공적으로 작성된 것을 확인하고 로그아웃 후 num 파라미터 값이 43인 게시글 작성자 계정으로 로그인한다. 그리고 게시판 페이지에 접속한다.

 

 

  게시판 페이지에 접속하여 스크립트가 작성된 '게시글 삭제 공격 주체' 게시글의 제목을 클릭한다.

 

 

  게시글 상세정보 페이지에 접속하여 스크립트가 작동하도록 한다. 프록시툴로 게시글 삭제 요청 헤더에서 Referer 헤더 값을 확인하여 스크립트가 작성된 게시글 URL인지 확인한다. 이후 게시글 상세정보 페이지에서 목록 버튼을 클릭하여 게시판 페이지로 돌아간다.

 

 

  게시판 페이지에서 게시글이 성공적으로 삭제됐는지 확인한다.

 

 

취약점 : 불충분한 인가

 

[판단 기준]

 

  접근제어가 필요한 중요 페이지의 통제수단이 미흡하여 비인가자의 접근이 가능한 경우

 

[발견된 취약점 정보]

 

URL 파라미터 메뉴
http://192.168.74.129 /php/board_update_proc.php num 홈 > 게시판 > 게시글 > 수정

 

[취약점 발견 검증 과정]

 

1) URL : /php/board_update_proc.php, 파라미터 :  num

 

 

  게시판 페이지에 접속하여 미리 작성해 둔 '불충분한 인가 게시글 수정 대상' 게시글의 제목을 클릭한다.

 

 

  게시글 상세정보 페이지에 접속하여 URL에서 해당 게시글의 num 파라미터 값인 29를 기억한다.

 

 

  다시 게시판 페이지에 접속하여 글쓰기 버튼을 클릭한다. 제목 입력칸과 내용 입력칸에 임의의 내용을 입력 후 작성 버튼을 클릭한다.

 

 

  게시판 페이지에 접속하여 이전 단계에서 작성한 게시글의 제목을 클릭한다.

 

 

  게시글 상세정보 페이지에 접속하여 수정 버튼을 클릭한다.

 

 

  프록시툴에서 인터셉트 기능을 켜고 게시글 수정 페이지에서 제목과 내용 입력칸에 '불충분한 인가 공격 성공!'이란 문구를 입력 후 저장 버튼을 클릭한다.

 

 

  num 파라미터 값을 30에서 수정 대상 게시글의 num 파라미터 값인 29로 변경한다.

 

 

  게시판 페이지에 접속하여 num 파라미터 값이 29인 수정 대상 게시글의 제목과 내용이 성공적으로 변경됐는지 확인한다.

 

 

취약점 : 세션 고정

 

[판단 기준]

 

  로그인 세션 ID가 고정 사용되거나 새로운 세션 ID가 발행되지만 예측 가능한 패턴으로 발행될 경우

 

[발견된 취약점 정보]

 

URL 파라미터 메뉴
http://192.168.74.129/php/login_proc.php PHPSESSID 홈 > 로그인

 

[취약점 발견 검증 과정]

 

1) URL : /php/login_proc.php , 파라미터 :  PHPSESSID

 

 

  로그인 페이지에 접속하여 로그인 가능한 계정 정보를 입력하고 로그인 버튼을 클릭한다.

 

 

  요청 헤더의 PHPSESSID 헤더 값을 기억하고 응답 헤더에서 새로운 세션ID가 발급되는지 확인한다.

 

 

  다시 한번 같은 계정으로 로그인하여 이전 로그인 요청 헤더의 PHPSESSID 헤더 값과 현재 로그인 요청 헤더의 PHPSESSID 헤더 값을 비교하여 같은지 다른지 확인한다. 또한 응답 헤더에서 새로운 세션ID가 발급되는지 확인한다.

 

 

취약점 : 자동화공격

 

[판단 기준]

 

  웹 애플리케이션의 특정 프로세스에 대한 반복적인 요청 시 통제가 미흡한 경우

 

[발견된 취약점 정보]

 

URL 파라미터 메뉴
http://192.168.74.129/php/board_write_proc.php title
content
홈 > 게시판 > 글쓰기

 

[취약점 발견 검증 과정]

 

1) URL : /php/board_write_proc.php, 파라미터 :  title, content

 

 

  게시글 작성 요청 자동화 스크립트를 Python 언어로 작성한다. 해당 자동화 스크립트는 작동시키면 게시글 제목이 'auto test', 게시글 내용이 'test'인 게시글을 5개 작성하도록 요청한다.

 

 

  게시판 페이지에 접속하여 자동화 스크립트를 작동시키기 전 출력되는 게시글들을 확인한다.

 

 

  자동화 스크립트를 작동시킨다.

 

 

  게시판 페이지에 접속하여 자동화 스크립트가 제대로 작동했는지 확인하기 위해 출력되는 게시글들을 확인한다. 

 

 

취약점 : 파일 업로드

 

[판단 기준]

 

  업로드되는 파일에 대한 확장자 검증이 이루어지지 않는 경우

 

[발견된 취약점 정보]

 

URL 파라미터 메뉴
http://192.168.74.129/php/board_write_proc.php upload_file 홈 > 게시판 > 글쓰기
http://192.168.74.129/php/board_update_proc.php upload_file 홈 > 게시판 > 게시글 > 수정

 

[취약점 발견 검증 과정]

 

1) URL : /php/board_write_proc.php, 파라미터 :  upload_file

 

 

  게시판 페이지에 접속하여 글쓰기 버튼을 클릭한다.

 

 

  제목과 내용 입력칸에 임의의 내용을 입력 후 파일 선택 버튼을 클릭한다.

 

 

  미리 작성해 둔 'file_test.php'란 이름을 가진 Server Side Script 파일을 선택하여 열기 버튼을 클릭한다.

 

 

  파일이 정상적으로 등록됐는지 확인 후 작성 버튼을 클릭한다.

 

 

  프록시툴로 게시글 작성 요청 헤더를 확인한다. 등록된 파일의 기능은 해당 파일 요청 시 'test' 파라미터에 값을 입력하면 입력한 값을 웹 페이지에 출력한다.

 

 

  게시판 페이지에 접속하여 이전 단계에서 작성한 게시글의 제목을 클릭하여 게시글 상세정보 페이지에 접속한다. 게시글 상세정보 페이지에 접속하면 중앙 하단에 다운로드 버튼 위에 마우스 커서를 올리게 되면 왼쪽 하단에 해당 게시글이 등록된 파일 경로를 확인할 수 있다. 확인된 파일 경로는 'http://192.168.74.129/php/upload_folder/vanhart/file_test.php'이다.

 

URL : http://192.168.74.129/php/upload_folder/vanhart/file_test.php?test=hello

 

  웹 브라우저에 확인한 파일 경로를 입력 후 test 파라미터 값으로 hello를 입력하여 업로드된 Server Side Script 파일이 정상 작동하는지 확인한다.

 

 

취약점 : 데이터 평문 전송

 

[판단 기준]

 

  중요정보 전송구간에 암호화 통신이 이루어지지 않는 경우

 

[발견된 취약점 정보]

 

URL 파라미터 메뉴
http://192.168.74.129/php/login_proc.php user_pass 홈 > 로그인

 

[취약점 발견 검증 과정]

 

1) URL : /php/login_proc.php, 파라미터 :  user_pass

 

 

  로그인 페이지에 접속하여 로그인 가능한 계정 정보를 입력 후 로그인 버튼을 클릭한다.

 

 

  Wireshark를 통해 로그인 시 계정의 비밀번호가 평문으로 전송되는지 확인한다.