OWASP & OWASP Top 10 소개

Open Web Application Security Project (OWASP) 는 2001 년도에 만들어진 국제 온라인 보안 단체다. 웹, 모바일, IoT과 관련된 보안, 툴, 문서, 방법론등을 만들며, 거의 모든 자료를 무료로 배포하고 있다. OWASP 가 진행한 프로젝트 중 가장 유명한 것은 OWASP Top 10 인데, 이는 매 2~3년마다 웹 어플리케이션에서 가장 중요한 취약점 10개를 뽑아 정리한 보고서다. 웹 보안을 공부할 때 OWASP Top 10 을 한번 정리하면 좋을 것 같아 이번에 시리즈물로 한 번 정리를 해보고자 한다.

OWASP Top 10 원본 보고서 링크 및 우리나라 한글 번역판 링크. 우리나라에 주요정보통신기반시설 기술적 취약점 분석/평가 방법 (607 페이지) 이 있다면 국제적으로는 OWASP Top 10 이 있다고 보면 된다. OWASP Top 10 의 취약점들은 다음과 같으며, 이 시리즈물에서도 다음과 같은 리스트들을 차례대로 진행할 것이다.

  1. 인젝션 - Injection
  2. 취약한 인증 - Broken Authentication
  3. 민감한 데이터 노출 - Sensitive Data Exposure
  4. XML 외부 개체 (XXE) - XML External Entities (XXE)
  5. 취약한 접근 통제 - Broken Access Control
  6. 잘못된 보안 구성 - Security Misconfiguration
  7. 크로스 사이트 스크립팅 (XSS) - Cross-Site Scripting (XSS)
  8. 안전하지 않은 역직렬화 - Insecure Deserialization
  9. 알려진 취약점이 있는 구성요소 사용 - Using Components with Known Vulnerabilities
  10. 불충분한 로깅 및 모니터링 - Insufficient Logging & Monitoring

OWASP JuiceShop (주스샵) 소개

OWASP JuiceShop (이하 주스샵) 은 OWASP 가 만든 웹 취약점 테스트 환경 구축 어플리케이션이다. 2010년대  이후 PHP 기반의 웹 어플리케이션이 많이 줄어들고  자바스크립트와 관련 프레임워크들이 대세가 됐기 때문에 주스샵 또한 NodeJS, Express, Angular 등을 이용해 만들어졌다. 주스샵은 OWASP 라는 국제적으로 인정받은 단체가 만들었고, 이미 양질의 Write-up 들이 쓰여져 있으며, 중요한 OWASP Top 10 취약점들이 모두 들어가 있어서 공부하기에 정말 좋은 환경이다.

환경 구축

간단하고 빠르게 구축하기 위해 이미 만들어진 도커 (Docker) 이미지를 이용한다. 연습용으로 이미 칼리 리눅스는 있다는 가정하에 아래와 같이 환경 구축을 시작한다. 칼리 자체에 도커가 기본으로 설치되어 있지 않으니 도커 먼저 설치한다.

공식 문서 링크 - https://docs.docker.com/engine/install/debian/

혹시 옛날 버전의 도커가 깔려있을지 모르니 옛날 버전의 도커 패키지들을 삭제한다.

sudo apt-get remove docker docker-engine docker.io containerd runc

필요한 패키지들을 설치해준다.

sudo apt-get update
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

도커 패키지를 받기 위해 GPG 키를 등록해주고, 도커의 apt 리포도 등록한다.

curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable"

등록된 도커의 apt 리포를 업데이트한 뒤, 도커를 설치한다.

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

만약 2020년도 이후의 칼리 리눅스를 쓰고 있다면 , 다음의 apt 리포를 더해준 뒤 다시 한 번 도커를 설치한다. 2020.4 버전 칼리 기준으로 아래와 같이 진행하면 도커 설치가 된다.

echo "deb [arch=amd64] https://download.docker.com/linux/debian buster stable" | sudo tee  /etc/apt/sources.list.d/docker.list
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

도커 설치가 완료됐다면 도커 데몬을 재시작해준 뒤, 도커 데몬이 실행되고 있는지 확인한다.

systemctl restart docker 
systemctl status docker 

도커가 실행됐다면 이제 준비는 끝났다. OWASP 주스샵 도커 이미지 파일을 다운 받는다.

docker pull bkimminich/juice-shop

다운이 끝나면 도커를 이용해 주스샵 컨테이너를 만들어 실행한다.

docker run -p 3000:3000 bkimminich/juice-shop

이런 식으로 서버가 포트 3000에서 대기중이라는 메시지가 출력되면 성공이다.

이제 사용하고 있는 웹 브라우저를 열어 http://localhost:3000 으로 가면 다음과 같은 주스샵 의 첫 페이지가 나온다.

기본 설정 - 스포일러 포함

기본적인 설치는 끝났지만 몇가지 기본 설정을 해줘야한다. 참고로 이 시리즈를 따라가지 않고 그냥 주스샵 을 혼자서 공부하실 분들은 스포일러가 있기 때문에 여기서 멈추셔야한다. 이 시리즈물을 따라하며 공부하실 분들은 그냥 쭉 보시면 된다.

알람창은 Dismiss 를 눌러 꺼주고, 오른쪽 위의 Account → Login 을 누른다. 그 뒤 나오는 창에서 Not yet a customer? 를 눌러 계정을 생성한다.


어차피 로컬호스트에서 연습용으로 사용하는 계정이니 계정은 어떻게 만들던간에 상관없다. 실제 테스트였다면 회사 규정에 따르거나 나중에 삭제하기 쉽도록 <회사이름>-<test01> 등의 한눈에 들어오는 계정을 만드는 것이 일반적이다. 참고로 이 유저 생성창도 나중에 여러가지 테스트를 해볼 것이니 눈여겨본다. 이메일, 비번 등을 입력한 뒤 Register 를 눌러 유저를 생성한다.

유저를 만든 뒤 http://localhost:3000/#/score-board 로 이동해주면 기본 설정이 끝난다. 이 스코어보드에서 자신의 전체 진행도, 챌린지 진행상황, 취약점 종류에 따른 필터링 등, 다양하게 주스샵과 관련된 정보들을 볼 수 있다.  

이렇게 기본적인 설정이 모두 끝났다. 앞으로 진행되는 시리즈에서는 다음과 같은 필터링들을 거쳐 OWASP Top 10 과 관련된 취약점들을 하나하나 알아볼 것이다.

마지막으로 주스샵의 소스코드 파일이 담긴 깃헙 리포를 클론해준다. 이 시리즈물의 목표는 CTF 를 통해 플래그를 찾는 것이 아니라, 취약점이 어디서 왜 발생하고, 이를 어떻게 공격할 수 있는지를 충분히 이해하고, 어떻게 방어할 수 있는지 등을 문서화하는 것이기 때문이다. 그렇기 때문에 어느정도는 소스코드를 보며 코드 리뷰를 진행할 것이다.

git clone https://github.com/bkimminich/juice-shop.git

Happy Path

Happy Path 를 걷는다는 표현은 타겟 어플리케이션을 일반적인 사용자로 사용해 보는 것을 일컫는다. 일반적인 사용자의 입장에서 이 타겟이 뭔하는 어플리케이션인지, 어떤 기능을 가지고 있는지, 사용자로서 어떤 데이터를 입력하고 출력받기를 원하는지 등을 알아보는 단계다. 모의침투테스터들은 타겟을 받자마자 무작정 터미널을 켜서 해킹을 시작하지 않는다. 모의침투테스트의 기초적인 방법론을 따라가며 탐색/수집을 먼저 시작하는 것이 일반적이고, 그 단계에서도 가장 먼저 진행하는 단계가 이 Happy Path 단계다. 테스터마다 어떻게 진행하는지는 다 다르지만, 나만의 방법론에 대해서 적어본다.

1. 이게 무슨 어플리케이션인지, 목표가 뭔지, 어떤 사용자들이 왜 사용하는지 등을 알아본다.

2. 어떤 기능이 있고 어떤 데이터들이 그 기능들을 따라 처리되는지 알아본다.

3. 테크 스택 (Tech Stack) 이 뭔지 유추해보고, 어떤 기술이 쓰였는지 유추해본다.

1 - 목표와 사용자

주스샵의 첫페이지

일단 눈에 보이는 것처럼 주스샵은 일반적인 E-Commerce 어플리케이션이다. 사용자들을 회원가입 시키고, 사용자마다 자신이 원하는 주스를 사는 어플리케이션이다. 연습용 어플리케이션이라 한 눈에 알 수 있었지만, 실제 어플리케이션들은 워낙 복잡하거나 특정 유저들을 위한 앱도 있어서 (빌딩 내 네트워크 엔지니어들을 위한 모니터링 웹 어플리케이션 등) 이런 것을 꼼꼼히 알아봐야한다.

2 - 기능과 데이터

사용자의 회원가입이 있으니 사용자 개인정보 데이터가 필요할 것이고, E-Commerce 인 만큼 카드정보를 처리할 수도 있다 (실제로는 온라인 결제 시스템들이 알아서 카드정보를 처리하는 경우가 많지만, 주스샵의 경우는 연습용 어플리케이션이니까). 그 외에도 유저가 물건을 담고, 배송을 시키는 과정에서 데이터베이스와의 데이터 교환이 이뤄질 수도 있을 것이다.

물건 구입 기능

실제로 유저답게 회원가입을 하고 배송지를 입력한 후 물건을 하나 사보자.

유저 회원가입 폼
배송지 입력 폼
카드정보 입력 폼 - Paypal, Stripe 등의 서드파티 온라인 결제 시스템을 사용하지 않는다
주문 확인

물건 구입 기능을 거치며 많은 숫자의 유저 데이터 입력 과정이 있는 것을 알 수 있다. 예를들어 배송지 입력, 카드정보 입력 등에서 유저는 데이터를 직접 입력을 해야한다.

기타 eCommerce 와 관련된 기능

http://localhost:3000/#/order-history

http://localhost:3000/#/wallet

http://localhost:3000/#/deluxe-membership

물건 리뷰 기능

배송 정보 확인 기능

주스샵 전용 디지털 지갑 기능

아마존 프라임 같은 느낌의 디럭스 멤버쉽 기능

그 외에도 eCommerce 어플리케이션 답게 물건 상세정보 확인, 물건 리뷰 남기기, 배송 정보 확인, 주스샵 전용 디지털 지갑 (Digital Wallet), 디럭스 멤버쉽 (아마존 프라임 같은) 등이 있다. 이런 기능들이 모두 다 악의적으로 사용될수도 있고, 특정 기능에 들어가는 유저 입력 정보들을 이용해 취약점을 찾거나 공격하는 방법이 있을 수도 있으니 자세히 눈여겨본다.

유저 기능

http://localhost:3000/profile

유저 프로필 및 프사 업로드 기능

유저 프로필에서도 유저는 몇가지 데이터를 입력할 수 있다. 가장 먼저 보이는 것은 이메일, 유버이름, 그리고 이미지 URL 을 설정할 수 있다는 것. 또한, 이미지 파일을 직접 업로드 해 유저의 프로필 사진으로도 사용할 수 있다. 파일 업로드가 있는 곳이니 만큼 눈여겨보고 지나가자.

http://localhost:3000/#/privacy-security/two-factor-authentication

보안용 2FA 기능

2FA 를 통해 보안을 더 강화할 수 있는 방법도 있다. 이 2FA 를 뚫거나, 무력화 시키는 방법도 있을 수 있으니 눈여겨본다.

http://localhost:3000/#/photo-wall

유저 사진 공유 기능 (eCommerce 에 왜..)

좀 뜬금없긴 하지만, 유저가 주스샵과 사진을 공유하는 기능도 있다. 이 또한 유저의 파일 업로드 기능이니 눈여겨본다.

FTP 서버

FTP 서버 기능

어플리케이션 내 FTP 폴더가 있는 것 또한 확인할 수 있다. 일반적인 유저라면 클릭을 한 뒤 legal.md 파일을 다운 받겠지만, 악의적인 유저는 /ftp URL 로 가 추가적인 파일을 다운 받을 수 있으니 이 점을 눈여겨본다.

3 - 테크 스택(Tech Stack) 유추

http://localhost:3000/#/about
http://localhost:3000/#/search
http://localhost:3000/#/basket
http://localhost:3000/#/address/select

등의 URL 들이 사용되며, /# URI Fragment 가 사용되는 것을 확인할 수 있다. 검색을 할때도 브라우저의 Network 탭을 보면 별 다른 요청/응답을 안하는 것을 볼 수 있다. 또한, 전반적으로 페이지들이 빠르게 로딩이 되고 우리 브라우저가 서버에 요청하는 모습을 많이 볼 수 없다.

마지막으로, View Source 를 눌러 소스보기를 했을 때 자바스크립트를 제외하고 HTML 이 텅텅 비어있는 것을 볼 수 있다.

총 33줄 밖에 안되는 HTML

이런 특징들을 바탕으로 유추해보면 이 어플리케이션은 자바스크립트 기반의 Single Page Application 이라는 것을 유추할 수 있다. 다만 Angular, Express, React 등의 어떤 프레임워크를 쓰는지는 아직 확인할 수 없다.

PHP 기반의 멀티페이지가 아닌 SPA 이기 때문에 어플리케이션 어딘가에 REST API 등이 숨어있을 것이라고도 유추할 수 있다. 일반적인 사용자의 눈에는 보이지 않겠지만, 어쨌든 SPA 도 서버와 데이터를 주고받아야하기 때문에 이를 REST API 등으로 처리하는 경우가 많다. 이런 API 요청들에 대해서도 나중에 테스트를 해봐야하니 눈여겨본다.

첫번째 페이지에서 검색을 해보면 별 일이 안 일어나는 것을 볼 수 있다.

하지만 인덱스 페이지를 새로고침만 해도 다양한 REST API 라던지 일반적인 API 요청을 보내는 것을 확인할 수 있다.

/rest/products/search REST 엔드포인트 확인
/api/Quantitys 엔드포인트 확인 

이렇게 환경구축부터 Happy Path 까지 모두 알아봤다. OWASP 단체와 OWASP Top 10, 그리고 주스샵에 대해서 알아본 뒤, 그 다음에는 일반적인 사용자처럼 주스샵을 이용해보며 다양한 정보들을 수집했다. 클릭 몇번으로도 벌써 eCommerce 어플리케이션이며, 유저 정보와 카드 정보를 처리하고, 자바스크립트 기반의 SPA 어플리케이션이며, 유저에게는 보이지 않지만 REST API 요청을 주고 받는 것 또한 볼 수가 있었다.

이런 배경지식을 바탕으로 다음 시리즈 부터는 OWASP Top 10 의 첫번째 취약점인 Injection 부터 배워본다.