Panda Web Application
'Panda Web Application(판다 웹앱)'은 제가 직접 개발한 웹 애플리케이션입니다. Segfault에서 제공한 Docker를 바탕으로 매우 간단한 웹 서버의 기능들을 구현하여 웹해킹 실습을 용이하게 하기 위해서 제작하였습니다. 실습의 편리함을 위해 현재는 보안기능을 최대한 구현하지 않은 상태로 제작하였습니다. 이후 보안 개선 실습을 통해 DVWA와 마찬가지로 보안 등급에 따라 취약함의 정도를 바꿀 수 있는 방식으로 개선할 계획이 있습니다.
프로젝트 배경
'판다 웹앱'을 개발하게 된 이유는 Segfault에서 진행하는 실무형 수업의 요구사항과 과제를 충족하기 위해서입니다. 해당 수업에서는 웹 애플리케이션을 직접 개발함으로써 웹의 개발환경과 과정을 이해하여 웹해킹에 대한 개념을 더 효과적으로 익히는 것을 목표로 하였습니다. 따라서, 첫 한 달간 웹애플리케이션을 직접 제작하는 것을 주요 과제로 하였습니다.
개발 과정
'판다 웹앱'을 개발한 과정은 다음과 같습니다.
구성요소 | 개발 일정 | 비고 |
로그인/로그아웃 | 23. 10. 27. ~ 11. 2. | DB 연결을 위한 추가 연구 기간 소요 |
회원가입 | 23. 11. 4. | |
스코어 확인 | 23. 11. 4. | |
마이페이지 | 23. 11. 4. | |
로그인 방식 다각화 및 해시 활용 로그인 | 23. 11. 9. ~ 11. 10. | 다양한 로그인 방식에 따른 취약점 연구를 위함 |
JWT 활용 로그인 | 23. 11. 10. | |
게시판 기본 기능(작성,열람,수정,삭제) | 23. 11. 10. ~ 11. 13. | |
키로거/쿠키탈취 기능 | 23. 11. 17. | |
게시판 페이징 및 검색 기능 | 23. 11. 17. | |
게시판 정렬 | 23. 11. 18. | |
게시판 파일 업로드 | 23. 11. 18. | |
게시판 그림 파일 자동 게시 기능 | 23. 12. 15. |
로그인/로그아웃
개발 환경에 대한 적응 기간과 DB를 연결하고 PHP에 익숙해지는 기간 등을 통해 가장 많은 시행착오를 거친 기간입니다. 시행착오를 포함하여 소요된 절차는 다음과 같습니다.
- index.html 작동 확인
- 한글 깨짐 해결 : 헤드에 태그 추가 <head><meta charset="utf-8"></head>
- form 생성 및 submit을 통해 login_check.php로 전송
- php 해석문제 해결 : 기존 백엔드가 없는 환경에서 도커를 통해 백엔드가 있는 환경으로 환경 설정(변경)
- id/pw를 admin/admin1234로 하여 원시적인 로그인 기능이 작동하는지 확인
- 로그인이 성공 시 admin.html로 이동, 실패 시 index.html로 이동
- admin.html로 직접 접근시 인증 우회가 되는 문제 발생
- CSS로 외형 개선
- DB 연결 ($변수이름 = mysqli_connect(서버이름, DB유저명, DB유저암호, DB이름);)
- if($db_conn){echo "DB OK";} else{echo "DB not OK";} 로 연결 여부 체크
- SQLi와 같은 공격으로부터 대미지를 최소화하기 위해서 권한을 나눠줄 필요가 있으나 해당 웹서버는 취약점을 유지하기로 하였으므로 관리자 권한으로 DB에 접속
- phpmyadmin으로 접속하여 DB와 테이블 생성 (DB 언어 : utf8_genetral_ci)
- 로그인 기능을 index.html에서 login.html로 이전
- DB에 임의의 로그인 정보를 넣고 DB에 있는 값을 통해 로그인이 되는지 체크
- 세션기능 추가
- 로그아웃 구현 (alert를 넣었으나, 테스트 중 alert가 많이 뜨는 것이 불편하여 삭제)
//DB에서 값이 있으면 로그인이 허용되는 기본적인 DB 연결 로그인 방식
$sql_test = "select * from test_table";//SQL 명령어를 변수로 저장
$query_result = mysqli_query($db_conn, $sql_test);
//저장된 SQL명령어를 mysqli_query함수를 통해 실행하고 결과를 저장한다
$row = mysqli_fetch_array($query_result);
//결과에서 첫번째 줄을 빼온다. (뒤에 mysqli_fetch_array를 한번 더쓰면 다음 줄을 뺀다)
echo "Name : " . $row['name'];
//줄에서 name컬럼에 해당하는 값을 받아온다.
회원가입
1) 로그인 페이지에 회원가입 버튼을 추가합니다.
2) 필요한 요구사항을 체크합니다. 회원가입 페이지에는 기본적으로 4가지 입력을 받습니다. 이름, 암호, 암호 재입력, 점수 이 4가지입니다.
3) 회원가입이 작동하기 위한 입력값 검증에 대한 내용을 기획/구상합니다.
4) 구상한 요구사항을 회원가입 페이지에 명시합니다.
5) 조건문을 통해 입력값 검증을 구현합니다. 입력값 검증 중 블랙리스트 기법을 차용하였습니다.
6) 입력값 검증이 정상적으로 마쳐지면 DB에 값을 추가합니다.
스코어 확인
1) 먼저 버튼을 생성합니다.
2) 버튼을 클릭할 시 이동이 잘 작동하는지 확인합니다. 페이지 이름은 'score.php'입니다.
3) 로그인의 CSS와 form 등을 참고하여 페이지를 구현합니다.
4) 메인 페이지로 돌아가는 버튼을 생성하였습니다.
5) 입력값을 잘못 입력한 경우 검증기능이 잘 작동하는지 확인합니다.
6) 타입 에러로 발생한 문제를 수정합니다.
7) 기능이 성공적으로 구현되었습니다. 회원가입이 성공하면 로그인 페이지로 리다이렉트 됩니다.
마이페이지
1) 마이페이지에서 구현할 기능은 총 3가지입니다. 정보조회, 정보수정, 회원탈퇴 이렇게 3가지 입니다.
2) 정보조회 최소 기능을 임시적으로 구현합니다. DB와 연결하여 결괏값을 출력합니다.
3) 외형을 개선하고 버튼을 추가합니다.
4) 회원 탈퇴 기능을 구현합니다. confirm을 활용해서 확인을 클릭하면 회원탈퇴가 되도록 합니다. (직접 접근을 하게 되면 회원탈퇴가 됩니다.)
5) 정보 수정 페이지 php를 새로 작성해 줍니다. 회원가입 페이지를 재사용하여 수정했습니다.
6) 회원 삭제와 마찬가지로 confirm을 통해 정보수정 전에 한번 물어봅니다.
7) form이 submit 되지 않는 문제가 발생하여 DOM을 활용하여 form을 전송하는 방식으로 보완하였습니다.
8) SQL 쿼리를 프로세스 하는 기능을 구현합니다. 입력값 검증 기능은 회원가입에서 받아왔습니다.
로그인 방식 다각화 및 해시로그인 추가
식별/인증 동시 및 분리 로그인 방식과 해시기능을 추가하여 로그인을 4가지로 선택하여 시도할 수 있도록 로그인 페이지를 수정하였습니다. DB에 해시값을 추가하였고 로그인의 다각화 방식을 구현하기 위해 평문 암호도 저장하도록 하였습니다. 실제 서비스 되는 웹에서 평문으로 암호를 저장하는 것은 매우 지양해야 할 방식입니다. 본 웹앱은 다양한 로그인 방식을 구현하고 익히는 것을 목적으로 두어서 해당 취약점을 유지하고 있습니다.
JWT를 활용한 로그인 구현
JWT의 경우 이해해야 할 개념이 많아서 연구하는 것에 조금 시간을 들였습니다. 기존에 구현 코드를 참고하여 작성하였고, 코드분석을 통해서 원리를 다시 한번 이해했습니다. 종합적으로 두 개의 블로그를 참조하여 작성하였습니다.
https://stickode.tistory.com/176 JWT를 생성하는 것에 대한 내용을 이해하는데 도움이 된 글입니다.
https://jh-tr.tistory.com/100 생성된 JWT를 쿠키에서 저장하고 사용하는 방법에 대한 도움이 된 글입니다.
1) JWT 로그인을 구현하기 위해 JWT에서 활용되는 기능자체를 구현하는 jwt.php를 생성합니다. 안에는 jwt 클래스와 쿠키 변수를 생성하고 받아오는 함수가 정의되어 있습니다.
- JWT 클래스
- 변수 - 알고리듬
- 변수 - 암호키
- 생성자(사용하는 알고리듬과 암호키 명시)
- 발급함수(해싱)
- 해석함수(디해싱)
- 쿠키변수 생성 함수
- 쿠키변수 해석 함수
2) JWT 토큰을 발행해 주는 페이지를 생성합니다. 버튼을 누르면 해당 페이지로 이동하고 JWT 토큰이 발행되어 쿠키에 저장됩니다. set_cookie를 통해 유효기간을 설정했습니다. 토큰의 유효기간은 60초입니다.
3) 인덱스에 버튼을 생성하고 발행 페이지로 이동하도록 합니다.
4) 로그인 페이지에서 토큰이 잘 해석되는지 테스트합니다.
5) 5번째 로그인 방식으로 선택하여 로그인할 수 있습니다.
게시판 기본기능 구현
1) 게시판 버튼을 생성합니다.
2) 게시판의 정보를 보관할 DB를 생성합니다.
3) 게시판 열람기능을 구현합니다. html구조 중간에 php를 넣고 DB를 참조하여 동적으로 구현했습니다.
4) 한글이 깨져 나오는 문제를 해결합니다.
5) 글쓰기 버튼을 추가하고 기능을 구현합니다.
6) 글 작성 버튼을 누르면 프로세스 하는 php 페이지로 이동하여 DB에 쿼리를 전송합니다. 암호 입력을 받고 암호가 유저의 암호가 맞다면 작성이 허용됩니다.
7) 게시판 열람기능을 구현합니다. read.php를 동적으로 구현하여 GET 파라미터에서 글번호를 통해 접근합니다.
8) 글 수정 부분을 구현합니다. 글 작성의 기능을 기반으로 몇 가지를 추가하였습니다.
9) 글 삭제기능을 구현합니다. 사용자나 암호 검증을 별도로 하지 않고 delete.php에 idx파라미터를 전송하면 해당 idx를 가진 게시판이 삭제되도록 구현하였습니다. 좋은 방식은 아닙니다.
키로거와 쿠키 탈취 공격 기법 연구
로그인화면과 동일한 화면을 가진 페이지를 만들고 안에 script 태그로 키로거를 구현하여 리스너 페이지로 값을 전송하는 페이지를 구현하였습니다. 입력하면 값이 전송되지만 한글은 전송되지 않습니다.
쿠키 탈취의 경우 index.php에서 쿠키탈취 버튼을 클릭하면 리스너로 쿠키값이 전송되도록 index.php에 구현해 두었습니다.
위의 한 줄이면 쿠키가 탈취됩니다. XSS에서 자주 사용하는 쿠키탈취 공격기법입니다.
게시판 추가 기능 구현
이후 추가적으로 게시판에 추가한 기능은 다음과 같습니다.
- 페이징 기능
- 검색 기능
- 정렬 기능
- 파일 업로드 기능
- JPG/PNG 확장자가 자동으로 게시되는 기능
추가 기능 구현에 대한 내용은 별도로 분리된 블로그에 상술되어 있습니다.
식별되고 의도된 취약점
XSS
게시판에 Stored XSS 공격이 가능합니다.
게시판 검색을 통해 Reflected XSS 공격이 가능합니다.
Score 페이지는 놀랍게도 reflected XSS 공격이 가능하지 않습니다.
SQLi
로그인 화면에서 인증우회가 가능합니다.
Score페이지와 게시판에 SQLi 취약점이 존재합니다.
CSRF
delete_account.php에 직접 접근할 시 회원탈퇴가 요청되며 자동으로 삭제가 진행됩니다.
디렉터리 인덱싱 취약점
웹 전체적으로 디렉터리 인덱싱이 되어있어 원하는 파일에 공격자가 편리하게 접근할 수 있습니다.
파일 업로드 취약점
게시판에서 파일을 업로드하는 경우 파일의 크기나 확장자, 종류 등을 검증하지 않아 다양한 파일 업로드 공격이 가능합니다.
파일 다운로드 취약점
디렉터리 인덱싱과 연결되어 다운로드 경로를 찾아 들어가면 다른 사용자가 업로드한 파일을 모두 별도 인증과정 없이 다운받을 수 있습니다.
인증/인가 취약점
게시판을 작성/수정/삭제 하는 모든 과정에 인증/인가 기능이 매우 미흡하게 되어있습니다.
'💻Information Security' 카테고리의 다른 글
Server Side Script와 Client Side Script의 차이 (0) | 2024.02.08 |
---|---|
SFTP 연결 : Visual Studio Code에서 작업한 내용 웹 서버로 옮기기 (1) | 2024.02.05 |
Segfault Web Server VM 설치 및 실행법 (0) | 2024.02.04 |
SlowLoris(늘보로리스)와 RUDY DDoS에 대해 (0) | 2024.02.01 |
TCP와 UDP의 개념과 차이점 (0) | 2024.02.01 |