1 인증 및 세션 처리 미흡
1.1 OWASP Top 10이란?
OWASP(The Open Web Application Security Project)는 오픈소스 웹 애플리케이션 보안 프로젝트이다. 주로 웹에 관한 정보노출, 악성 파일 및 스크립트, 보안 취약점 등을 연구하며, 3~4년 주기로 10대 웹 애플리케이션의 취약점 (OWASP TOP 10)을 발표했다. OWASP TOP 10은 웹 애플리케이션 취약점 중에서 빈도가 많이 발생하고, 보안상 영향을 크게 줄 수 있는 것들 10가지를 선정하여 2004년, 2007년, 2010년, 2013년, 2017년을 기준으로 발표되었고, 문서가 공개되었다. OWASP Top 10 프로젝트의 원래 목표는 단순히 개발자와 관리자의 인식을 높이는 것이었지만, 사실상 애플리케이션 보안의 업계 표준이 되었다.
인증 및 세션 처리 미흡 취약점은 인증이 필요한 페이지, 관리자 페이지 등에 인증처리, 세션처리가 논리적으로 정확히 구현되지 않아서 인증되지 않은 사용자가 접근이 가능함으로써 발생되는 취약점이다. 인증 및 세션 처리 미흡 취약점은 OWASP Top 10에서 2017년 기준으로 두 번째로 선정되었으며 현재 가장 많이 나오는 취약점 중에 하나이다. 인증 및 세션 처리 미흡 취약점의 특징으로는 정상적인 서비스의 흐름 속에서 일어나기 때문에 웹 방화벽이 패킷을 차단할 수 없다는 특징이 있다.
1.2 시나리오
점검 시나리오 |
관리자 페이지 노출 - 관리자 페이지에 접근이 가능한가? |
디렉터리 인덱싱 - 디렉터리 인덱싱이 가능한가? |
불충분한 인가 - 다른 사용자 게시물 수정 및 삭제가 가능한가? |
불출분한 인가 - 다른 사용자 주문정보에 접근이 가능한가? |
회원가입 우회가 가능한가? |
상품 결제 금액 조작이 가능한가? |
1.3 환경 구성
운영체제 | 주소 | |
공격자 PC | Kali Linux 2020.4 | 192.168.169.135 |
희생자 PC | bee-box v1.6 | 192.168.169.143 |
1.4 취약점 진단 및 점검 도구
도구 | 설명 |
Burp Suite | 웹 프록시 |
Dirsearch v0.4.1 | 디렉토리 구성 파악 |
1.4 점검 대상
희생자 도메인 |
192.168.169.143/gmshop |
1.6 디렉토리 구조 파악
취약점 진단을 시작하기에 앞서 dirsearch 도구를 이용하여 웹 서비스의 디렉터리 구조를 파악하겠다. dirsearch는 github에서 제공하는 오픈 소스 도구이며 콘솔 환경에서 작동한다. 그림 1-2와 같이 http://192.168.169.143/gmshop을 대상으로 스캔을 시도하면 dirsearch는 사전 파일이나 무차별 대입 공격을 통해 디렉터리 구조 파악 및 취약한 페이지를 찾는다. 스캔 결과는 이후에 취약점 분석 과정에 참고하겠다.
1.7 스캔 결과
Time: Thu Feb 25 09:18:36 2021 403 391B http://192.168.169.143:80/gmshop/.ht_wsr.txt 403 394B http://192.168.169.143:80/gmshop/.htaccess.bak1 403 396B http://192.168.169.143:80/gmshop/.htaccess.sample 403 394B http://192.168.169.143:80/gmshop/.htaccess.orig 403 394B http://192.168.169.143:80/gmshop/.htaccess.save 403 392B http://192.168.169.143:80/gmshop/.htaccessOLD 403 393B http://192.168.169.143:80/gmshop/.htaccessOLD2 403 384B http://192.168.169.143:80/gmshop/.htm 403 394B http://192.168.169.143:80/gmshop/.htaccess_orig 403 390B http://192.168.169.143:80/gmshop/.htpasswds 403 392B http://192.168.169.143:80/gmshop/.htaccessBAK 403 391B http://192.168.169.143:80/gmshop/.httr-oauth 403 394B http://192.168.169.143:80/gmshop/.htpasswd_test 403 395B http://192.168.169.143:80/gmshop/.htaccess_extra 403 392B http://192.168.169.143:80/gmshop/.htaccess_sc 403 385B http://192.168.169.143:80/gmshop/.html 403 395B http://192.168.169.143:80/gmshop/admin/.htaccess 200 6KB http://192.168.169.143:80/gmshop/admin/ 200 6KB http://192.168.169.143:80/gmshop/admin/?/login 200 6KB http://192.168.169.143:80/gmshop/admin/index 200 6KB http://192.168.169.143:80/gmshop/admin/index.php 200 32KB http://192.168.169.143:80/gmshop/cart 200 32KB http://192.168.169.143:80/gmshop/cart.php 200 34KB http://192.168.169.143:80/gmshop/company 200 32KB http://192.168.169.143:80/gmshop/community 200 144B http://192.168.169.143:80/gmshop/editor/ 200 144B http://192.168.169.143:80/gmshop/editor/tiny_mce 200 144B http://192.168.169.143:80/gmshop/editor/FCKeditor 200 144B http://192.168.169.143:80/gmshop/editor.php 200 144B http://192.168.169.143:80/gmshop/editor/tinymce/ 200 144B http://192.168.169.143:80/gmshop/editor/tiny_mce/ 200 144B http://192.168.169.143:80/gmshop/editor/stats/ 200 144B http://192.168.169.143:80/gmshop/editor 200 144B http://192.168.169.143:80/gmshop/editor/tinymce 200 2KB http://192.168.169.143:80/gmshop/email/ 200 4KB http://192.168.169.143:80/gmshop/error 200 4KB http://192.168.169.143:80/gmshop/error.php 200 4KB http://192.168.169.143:80/gmshop/error/ 200 3KB http://192.168.169.143:80/gmshop/head.php 200 5KB http://192.168.169.143:80/gmshop/images/ 200 47KB http://192.168.169.143:80/gmshop/index 200 47KB http://192.168.169.143:80/gmshop/index.php 200 47KB http://192.168.169.143:80/gmshop/index.php/login/ 200 3KB http://192.168.169.143:80/gmshop/lib/ 200 27KB http://192.168.169.143:80/gmshop/login 200 27KB http://192.168.169.143:80/gmshop/login.php 200 27KB http://192.168.169.143:80/gmshop/login/ 200 27KB http://192.168.169.143:80/gmshop/login/cpanel/ 200 27KB http://192.168.169.143:80/gmshop/login/admin/admin.asp 200 27KB http://192.168.169.143:80/gmshop/login/admin/ 200 27KB http://192.168.169.143:80/gmshop/login/cpanel.html 200 27KB http://192.168.169.143:80/gmshop/login/cpanel.jsp 200 27KB http://192.168.169.143:80/gmshop/login/cpanel.js 200 27KB http://192.168.169.143:80/gmshop/login/index 200 27KB http://192.168.169.143:80/gmshop/login/super 200 27KB http://192.168.169.143:80/gmshop/login/login 200 27KB http://192.168.169.143:80/gmshop/login/cpanel.aspx 200 27KB http://192.168.169.143:80/gmshop/login/oauth/ 200 27KB http://192.168.169.143:80/gmshop/login/cpanel.php 200 27KB http://192.168.169.143:80/gmshop/login/administrator/ 200 51KB http://192.168.169.143:80/gmshop/phpinfo.php 200 51KB http://192.168.169.143:80/gmshop/phpinfo 200 1KB http://192.168.169.143:80/gmshop/script/ 200 1KB http://192.168.169.143:80/gmshop/style 200 6KB http://192.168.169.143:80/gmshop/top 200 7KB http://192.168.169.143:80/gmshop/upload/ |
표 1-1 디렉터리 스캔결과
2 취약점 점검
2.1 관리자 페이지 노출
관리자 페이지 노출 | |
취약점 개요 | |
점검내용 | 유추하기 쉬운 URL로 관리자 페이지 및 메뉴 접근의 가능 여부 점검 |
점검목적 | 관리자 페이지 URL이 유추하기 쉬운 이름(admin, manager 등)이나 설정 프로그램 설계 오류를 수정하여 비 인가자의 관리자 메뉴 접근을 방지하고자 함 |
보안위협 | 웹 관리자의 권한이 노출될 경우 홈페이지의 변조뿐만 아니라 취약성 정도에 따라서 웹 서버의 권한까지도 노출될 수 있음 |
점검대상 및 판단기준 | |
대상 | 소스코드 |
판단기준 | 양호: 유추하기 쉬운 URL로 관리자 페이지 접근이 불가능한 경우 |
취약: 유추하기 쉬운 URL로 관리자 페이지 접근이 가능한 경우 |
취약점 점검
Step 1) 추측하기 쉬운 (/admin, /manager, /master, /system, .administrator 등)의 명칭을 사용하는 디렉터리 및 파일 관리자 페이지 존재 여부 확인
디렉터리 구조를 파악하기 위해 표 2‑3을 보면 http://192.168.169.143:80/gmshop/admin/ 와 같은 관리자 페이지에 일반 사용자가 접근할 수 있다. 관리자 페이지는 웹 애플리케이션의 전반적인 기능 및 회원 관리를 할 수 있는 기능이 있다. 일반 사용자가 관리자 페이지에 접근할 수 있는 경우 공격자가 SQL 인젝션, 무차별 대입 공격, 사전 공격 등 다양한 형태의 공격을 시도할 수 있다.
Step 2) 관리자 페이지의 로그인 창에 기본 관리자 계정(admin, administrator, manager) 및 패스워드를 입력하여 로그인 되는지 확인
그림 2‑2와 같이 아이디와 패스워드를 각각 admin, admin으로 입력하여 관리자 페이지에 로그인을 시도하면 정상적으로 로그인 가능하다.
2.2 디렉터리 인덱싱
디렉터리 인덱싱 | |
취약점 개요 | |
점검내용 | 웹서버 내 디렉터리 인덱싱 취약점 존재 여부 점검 |
점검목적 | 디렉터리 인덱싱 취약점을 제거하여 특정 디렉터리 내 불필요한 파일 정보의 노출을 차단 |
보안위협 | 해당 취약점이 존재할 경우 브라우저를 통해 특정 디렉토리 내 파일 리스트를 노출하여 응용시스템의 구조를 외부에 허용할 수 있고, 민감한 정보가 포함된 설정 파일등이 노출될 경우 보안상 심각한 위험을 초래할 수 있음 |
점검대상 및 판단기준 | |
대상 | Web Server |
판단기준 | 양호: 디렉터리 파일 리스트가 노출되지 않는 경우 |
취약: 디렉터리 파일 리스트가 노출되는 경우 |
취약점 점검
Step 1) URL 경로 중 확인 하고자 하는 디렉터리까지만 주소 창에 입력하여 인덱싱 여부를 확인
표 1-1 디렉터리 스캔결과에 있는 http://192.168.169.143:80/gmshop/script/ 으로 접속하면 그림 2-3과 같이 script 디렉터리 내 파일 리스트가 출력된다.
2.3 다른 사용자 게시물 수정 및 삭제
불충분한 인가 | |
취약점 개요 | |
점검내용 | 민감한 데이터 또는 기능에 접근 및 수정 시 추가 인증 절차 여부 점검 |
점검목적 | 접근 권한에 대한 검증 로직을 구현하여 다른 사용자가 민감한 정보나 인증이 필요한 페이지의 접근을 차단하기 위함 |
보안위협 | 중요 정보 페이지 접근을 위한 인증 로직이 구현되지 않을 경우, 비인가 사용자의 페이지에 접근 및 중요 정보의 열람 및 변조가 가능함 |
점검대상 및 판단기준 | |
대상 | 소스코드 |
판단기준 | 양호: 중요 정보 페이지 접근 시 추가 인증을 하는 경우 |
취약: 중요 정보 페이지의 파라미터 변경으로 타인의 정보를 열람, 수정이 가능한 경우 |
취약점 점검
Step 1) 비밀 게시글(또는 개인 정보 수정, 패스워드 변경 등) 페이지에서 다른 사용자와의 구분을 ID, 일련번호 등의 단순한 값을 사용하는지 조사
그림 2-4는 사용자가 1:1 문의게시판에 작성한 게시물이다. 해당 게시물의 URL 주소를 확인하면 다음과 같으며 GET 방식으로 파라미터 값을 서버로 전송한다.
http://192.168.169.143/gmshop/ask_view.php?data=idx%3D145%26pagecnt%3D0%26letter_no%3D1%26offset%3D0%26search%3D%26searchstring%3D%26present_num%3D1&boardIndex=
Step 2) 게시글을 구분하는 인수 값을 변경하는 것만으로 다른 사용자의 비밀 게시글(또는 개인 정보 변경, 패스워드 변경 등)에 접근 가능한지 확인
그림 2-4의 URL 주소에서 idx 값을 145에서 144로 변경한 후 접속하면 다른 사용자가 1:1 문의게시판에 작성한 게시물을 볼 수 있으며 수정, 삭제까지 가능한 것을 확인하였다.
2.4 다른 사용자 주문정보 접근
불충분한 인가 | |
취약점 개요 | |
점검내용 | 민감한 데이터 또는 기능에 접근 및 수정 시 추가 인증 절차 여부 점검 |
점검목적 | 접근 권한에 대한 검증 로직을 구현하여 다른 사용자가 민감한 정보나 인증이 필요한 페이지의 접근을 차단하기 위함 |
보안위협 | 중요 정보 페이지 접근을 위한 인증 로직이 구현되지 않을 경우, 비인가 사용자의 페이지에 접근 및 중요 정보의 열람 및 변조가 가능함 |
점검대상 및 판단기준 | |
대상 | 소스코드 |
판단기준 | 양호: 중요 정보 페이지 접근 시 추가 인증을 하는 경우 |
취약: 중요 정보 페이지의 파라미터 변경으로 타인의 정보를 열람, 수정이 가능한 경우 |
취약점 점검
Step 1) 비밀 게시글(또는 개인 정보 수정, 패스워드 변경 등) 페이지에서 다른 사용자와의 구분을 ID, 일련번호 등의 단순한 값을 사용하는지 조사
그림 2-6은 gmshop의 주문내역조회 페이지다. URL 주소는 다음과 같다.
Step 2) 게시글을 구분하는 인수 값을 변경하는 것만으로 다른 사용자의 비밀 게시글(또는 개인 정보 변경, 패스워드 변경 등)에 접근 가능한지 확인
그림 2‑6의 URL에서 idx 값을 7로 변경한 후 접속하면 다른 사용자의 주문 정보와 개인 정보까지 열람할 수 있다.
2.5 회원가입 우회
회원가입 우회 | |
취약점 개요 | |
점검내용 | 사용자가 JSP 코드 수정 시 회원가입 우회 여부 점검 |
점검목적 | 서버 측면에서의 인증 및 검증 로직을 구현하여 회원가입 우회를 막기 위함 |
보안위협 | JSP 코드를 이용해 중요한 인증이나 검증을 할 경우, 사용자가 회원가입 필수입력항목을 우회하여 회원가입이 가능함 |
점검대상 및 판단기준 | |
대상 | 소스코드 |
판단기준 | 양호: 서버에서 중요한 인증이나 검증을 하는 경우 |
취약: 클라이언트에서 중요한 인증이나 검증을 하는 경우 |
취약점 점검
Step 1) 클라이언트 측면의 JSP 코드에서 회원가입 입력 값을 검증하는지 확인한다.
그림 2-8에서 버프스위트로 패킷을 잡으면 JSP 코드가 응답 값으로 넘어온다.
function joinSendit() { var form=document.joinForm; if(form.userid.value=="") { alert("아이디를 입력해 주십시오."); form.userid.focus(); } else if(checkSpace(form.userid.value) != "") { alert("아이디에 공백을 포함할수 없습니다."); form.userid.focus(); form.userid.select(); } else if(form.id_check.value =="") { alert("아이디 중복검색을 해주십시오"); form.userid.focus(); } else if(form.userid.value!=form.id_check.value) { alert("중복검색된 아이디를 수정하였습니다. 다시 중복검색을 해주십시오."); form.userid.focus(); } else if(form.pwd1.value =="") { alert("비밀번호를 입력해 주십시오."); form.pwd1.focus(); } else if(form.pwd2.value =="") { alert("비밀번호 확인을 입력해 주십시오."); form.pwd2.focus(); } else if(form.pwd1.value !=form.pwd2.value) { alert("비밀번호가 올바르지 않습니다."); form.pwd1.focus(); } else if(form.name.value =="") { alert("이름을 입력해 주십시오."); form.name.focus(); } else if(checkSpace(form.name.value) != "") { alert("이름에 공백을 포함할수 없습니다."); form.name.focus(); form.name.select(); } else { form.submit(); } } |
Step 2) JSP 코드를 수정, 삭제하여 회원가입 로직을 우회하여 회원가입을 시도한다.
function joinSendit()
{
var form=document.joinForm;
form.submit();
}
그림 2‑8의 JSP 코드에서 입력 값 검증 함수들을 제거하여 다음과 같이 수정한다.
그림 2‑9과 같이 필수항목인 비밀번호와 이름을 입력하지 않고 아이디만 입력하면 그림 2‑10처럼 필수항목 입력 없이 회원가입에 성공하였다.
2.6 상품결제금액 조작
상품 결제 금액 조작 | |
취약점 개요 | |
점검내용 | 상품 결제 금액이 조작 여부 점검 |
점검목적 | 서버 측면에서의 파라미터 값 검증 로직을 구현하여 사용자가 파라미터 값을 변경하는 것을 막기 위함 |
보안위협 | 클라이언트 측면에서 상품 결제 금액 조작이 가능한 경우 사용자가 무상으로 물건을 구매할 수 있다. |
점검대상 및 판단기준 | |
대상 | 소스코드 |
판단기준 | 양호: 서버 측면에서 파라미터 값을 검증을 하는 경우 |
취약: 서버 측면에서 파라미터 값을 검증을 하지 않는 경우 |
취약점 점검
Step 1) 서버로 요청하는 패킷에 상품 결제 관련 파라미터가 존재하는지 여부를 확인한다.
주문서를 작성하고 결제하기를 누르기 전에 버프스위트로 패킷을 인터셉트한다.
Step 2) 서버로 보내지는 파라미터 중에 결제 금액과 관련된 파라미터를 추측하여 변경한다.
그림 2‑11에서 상품 가격으로 추정되는 파라미터를 0으로 수정하였다.
결제 금액이 조작된 것으로 보아 서버 측면에서 따로 인증을 하지 않는다는 것을 알 수 있다.
3 대응방안
3.1 관리자 페이지 노출 대응 방안
보안설정방법
step 1) 일반 사용자의 접근이 불필요한 관리자 로그인 페이지 주소를 유추하기 어려운 이름으로 변경하고 관리자 페이지 접근 포트도 변경함
step 2) 관리자 페이지 주소를 직접 입력하여 접근하지 못하도록 관리자 페이지 각각에 대하여 관리자 인증을 위한 세션 관리
step 3) 중요한 정보를 가진 웹 서버의 특정 페이지들은 관리자 또는, 특정 사용자만 접근할 필요가 있으므로 이러한 주요 페이지들은 웹 서버에서 적절한 설정을 통하여 특정 사용자만 접근이 가능하도록 사용자 접근 제한이 필요함
step 4) 웹 방화벽을 이용하여 특정 IP만 접근 가능하도록 제한
3.2 디렉터리 인덱싱 대응 방안
보안설정방법
step 1) 웹 서버 환경 설정에서 디렉터리 인덱싱 제거
굿모닝 쇼핑몰은 Apache 2.2.8 버전을 사용하고 있으며 Apache를 사용할 경우 아래와 같이 환경 설정을 수정해야 한다.
Httpd.conf 파일 내 DocumentRoot 항목의 Options에서 Indexs 제거 Indexs가 해당 디렉터리의 파일 목록을 보여주는 지시자임 설정 전 <Directory “/var/www/html”> Options Indexs </Directory> 설정 후 <Directory “/var/www/html”> Options </Directory> |
step 2) %3f.jsp 취약점 제거
웹 서버를 Apache로 사용한다면 아래와 같이 설정하여 %3f.jsp 문자를 필터링 해야 하며,
Resin 이나 Tomcat 을 사용한다면 최신 버전으로 업그레이드 함
LocationMatch “\(%3f|\?)\.jsp”> AllowOverride None Deny from all </LocationMatch> |
3.3 다른 사용자 게시물 수정 및 삭제 대응 방안
보안설정방법
step 1) 민감한 중요 데이터에 대한 접근 페이지에서 인증을 위한 로직이 구현되지 않았다면, 세션을 통한 인증 및 사용자에게 확인을 위한 인증 값 입력을 통한 인증 절차를 구현하여 정상적인 로그인 사용자인지 또는 권한이 허용된 사용자인지 여부를 확인한 후 해당 페이지에 접근할 수 있도록 함
step 2) 페이지별 권한 매트릭스를 작성하여, 페이지에 부여된 권한의 타당성을 체크 후에 권한 매트릭스를 기준으로 하여 전 페이지에서 권한 체크가 이뤄지도록 구현하여야 함
3.4 다른 사용자 주문 정보 접근 대응 방안
보안설정방법
step 1) 민감한 중요 데이터에 대한 접근 페이지에서 인증을 위한 로직이 구현되지 않았다면, 세션을 통한 인증 및 사용자에게 확인을 위한 인증 값 입력을 통한 인증 절차를 구현하여 정상적인 로그인 사용자인지 또는 권한이 허용된 사용자인지 여부를 확인한 후 해당 페이지에 접근할 수 있도록 함
step 2) 페이지별 권한 매트릭스를 작성하여, 페이지에 부여된 권한의 타당성을 체크 후에 권한 매트릭스를 기준으로 하여 전 페이지에서 권한 체크가 이뤄지도록 구현하여야 함
3.5 회원가입우회 대응 방안
보안설정방법
step 1) 클라이언트 측면에서 JSP 코드를 이용해 입력 값을 검증 한다면 서버 쪽에서 한번 더 검증을 하여 이중으로 검증을 해야 한다.
3.6 상품금액결제 조작 대응 방안
보안설정방법
step 1) 클라이언트 측면에서 JSP 코드를 이용해 입력 값을 검증 한다면 서버 쪽에서 한번 더 검증을 하여 이중으로 검증을 해야 한다.
4 참고 문헌
4.1 단행본
도서명 | 저자 | 출판사 |
(한국인터넷진흥원)_주요정보통신기반시설_기술적_취약점_분석_평가_상세_가이드_(2017) | 한국인터넷진흥원 | 한국인터넷진흥원 |
4.2 참조 홈페이지
참조 홈페이지 |
https://ictinstitute.nl/owasp-top-10-vulnerabilities/ https://ko.wikipedia.org/wiki/OWASP |
'보안프로젝트' 카테고리의 다른 글
[보안프로젝트] 쇼핑몰 대상 XSS 취약점 진단 및 대응방안 수립 (0) | 2021.08.09 |
---|---|
[보안프로젝트] 파이썬으로 공공데이터 Open API 이용하기 (0) | 2021.08.09 |
[보안프로젝트] 도커 환경을 이용한 테스트 환경 서비스 구축 그리고 로그, 이미지 관리 방법 (0) | 2021.08.09 |
[보안프로젝트] 시나리오 기반 모의해킹 프로젝트 (3) | 2021.07.13 |
[보안프로젝트] Nmap NSE를 이용한 취약점 테스트 (0) | 2021.05.16 |
댓글