Step 202. ★ 중간 점검: 중급 웹 문제 독립 해결 3연속 — Write-up 금지 구간
Level 3 — CTF 실전과 공격 스킬 심화 | 난이도 ★★★★☆ | 예상 소요 시간 12시간 이상(며칠에 나눠 진행)
전제: Step 131~201의 웹 트랙을 마쳤다. 드림핵 누적 풀이, Juice Shop, Webhacking.kr 구간의 기법과 절차가 손에 익어 있다.
- 준비물: 안 풀어 본 중급 웹 문제에 접근할 계정(드림핵 난이도 3~4 또는 PortSwigger 중급 랩), Burp Suite, 기록용 문서, 그리고 시간을 재는 타이머.
- ⚠️ 이 챕터의 실습은 내 랩·합법 플랫폼 전용입니다. 허가 없는 시스템에 적용하면 범죄입니다. 오늘의 무대인 드림핵과 PortSwigger는 운영자가 공식 개방한 합법 학습 플랫폼입니다.
Web 트랙의 졸업 시험입니다. 규칙은 하나 — 중급 문제를 풀이 없이 3개 연속으로 해결하는 것. 하나라도 막혀서 풀이를 보면 그 문제는 무효입니다. 다만 연속이 깨져도 처음부터가 아니라, 새 문제로 다시 3연속에 도전하면 됩니다.
이 점검의 목적은 실력의 증명이 아니라 실력의 측정입니다. 힌트와 풀이가 사라진 자리에서 여러분의 루틴이 스스로 서는지 — 그것을 보는 날입니다. 점검 챕터이므로 새로운 기법은 없고, 선정 기준과 진행 규칙, 막혔을 때의 체크리스트가 전부입니다. 서버 화면은 출력 예시로 표기합니다.
1. 학습 목표
이 챕터를 끝내면 다음을 할 수 있습니다:
- 공정한 점검이 되도록 문제를 선정하는 기준(랜덤, 유형 사전 차단)을 적용한다
- 문제당 4시간 상한과 체크리스트 루틴으로 독립 해결을 진행한다
- 가설 목록, 시도 페이로드, 실패 이유, 돌파 지점을 포함한 과정 기록을 남긴다
- 실패 시 실패 유형을 분류해 재훈련 주소를 정한다
- 독립 해결한 문제의 Write-up을 직접 작성한다
2. 배경 지식 — 오늘의 도구와 개념
오늘의 도구 한눈에 보기
| 구분 | 내용 |
|---|---|
| 언어·환경 | 지금까지의 웹 도구 전부 — 브라우저 개발자 도구, Burp Suite, 파이썬 |
| 오늘의 절차 | 랜덤 선정 → 4시간 상한 → 과정 기록 → 3연속 판정 → Write-up |
| 필요한 개념 | 독립 해결의 정의, 막힘의 세 유형, 리서치 허용 범위 |
| 오늘의 산출물 | 3연속 기록표 + Write-up 3편 |
2-1. 왜 "3연속"인가
한 문제의 독립 해결은 운일 수 있습니다. 아는 유형을 우연히 뽑았을 수 있으니까요. 두 문제 연속도 우연이 섞입니다. 세 문제 연속부터는 우연이 설명하지 못하는 구간에 들어갑니다 — 서로 다른 재료, 서로 다른 트릭을 연달아 뚫었다는 것은 루틴과 기법 목록이 실제로 작동한다는 증거입니다.
반대로 하나라도 풀이를 보면 그 문제는 측정값이 아닙니다. 연속은 깨지지만, 실패는 패널티가 아니라 데이터입니다. 2-4에서 다룹니다.
2-2. 공정한 선정 — 유형을 알고 고르면 안 된다
점검이 점검답게 되려면 문제 선정이 공정해야 합니다.
- 안 풀어 본 것: 풀이 기록에 없는 문제만 후보로 합니다
- 난이도 범위: 드림핵 난이도 3~4, 또는 PortSwigger의 Practitioner(중급) 랩
- 랜덤 선정: 후보 목록에서 주사위나 난수로 뽑습니다. "이건 SQLi 같으니까"라고 골라 담는 순간 측정이 오염됩니다 — 실전의 침입 대상은 유형을 알려 주지 않습니다
[출력 예시 — 선정 기록]
후보: 드림핵 미해결 난이도 3~4 문제 17개
난수: 7, 13, 2 → 문제 A, B, C 확정 (제목만 확인, 유형 설명은 읽지 않음)
2-3. 진행 규칙 — 4시간과 체크리스트 루틴
각 문제에는 4시간의 상한이 있습니다. 4시간은 "하루의 집중 블록 하나"로, 실제 펜테스트에서 한 벡터에 투자하는 현실적인 시간입니다.
시간 안의 동선은 정해져 있습니다.
0:00~0:30 정찰 — 페이지·파라미터·쿠키·JS 전부 열어 재료 목록 작성
0:30~1:00 가설 — "막고 있는 것/묻는 것" 후보를 서너 개 적는다
1:00~3:30 실험 — 가설별 우회 후보 표를 소거 (방해 금지: 풀이 검색 불가)
3:30~4:00 정리 — 돌파했으면 재현 검증, 못 했으면 막힘 지점을 기록
리서치 허용 범위: 기법 문서(예: "SQLi 필터 우회 기법 목록")를 읽는 것은 허용됩니다 — 모르는 기법을 만나는 것은 실력 부족이 아니라 학습 신호입니다. 금지되는 것은 그 문제의 풀이입니다. 경계선은 명확합니다. "일반 기법을 배우는가"는 허용, "이 문제의 답을 얻는가"는 금지입니다.
2-4. 막힘의 세 유형 — 실패는 분류되면 약이 된다
4시간을 쓰고도 못 풀었다면, 실패를 세 유형으로 분류합니다.
| 유형 | 증상 | 재훈련 주소 |
|---|---|---|
| 정보 부족 | 재료를 못 찾았다 (숨은 파라미터, JS 파일) | 정찰 루틴 복습 (Step 145, 199의 루틴) |
| 기법 부족 | 재료는 봤는데 손이 안 나갔다 | 해당 기법 챕터로 회귀 (Step 135~150) |
| 실행 오류 | 기법은 맞는데 페이로드가 엉켰다 | Burp Repeater 실험 훈련 (Step 133) |
"모르는 기법"이 나오면 리서치 허용 범위 안에서 배우고 재도전하면 됩니다. 중요한 것은 분류입니다 — 분류된 실패는 다음 공부의 목차가 됩니다.
3. 따라 하기
3-1. 점검 시작 전 — 서약과 준비
시작 전에 세 가지를 정해 문서 첫머리에 적습니다.
[출력 예시 — 점검 선언문]
- 문제 선정 방식: 드림핵 미해결 난이도 3~4 중 난수 3개
- 규칙: 문제당 4시간, 풀이 검색 금지, 기법 문서만 허용
- 판정: 3연속 성공 시 통과, 실패 시 유형 분류 후 재도전
이 선언이 있어야 "한 번만 힌트를…"의 흔들림을 붙잡을 수 있습니다. 타이머는 물리적인 것을 켜 두세요.
3-2. 문제 1 — 루틴 그대로 진행 (출력 예시)
첫 문제를 열고 정찰부터 시작합니다.
[출력 예시 — 정찰 기록, 첫 30분]
- 페이지: /challenge/view.php?no=1 형태의 게시판
- 파라미터: no(숫자), search(문자열), 쿠키 sess
- JS: check.js 1개 — 입력 길이만 검사
- 가설: ① no에 SQLi ② search에 XSS ③ sess 쿠키 조작
읽는 법: 지금까지 배운 루틴이 전부입니다. 새로운 것을 하지 않습니다. 점검에서 측정하는 것은 바로 이 "루틴이 자동으로 나오는가"입니다.
3-3. 가설 소거와 돌파 (출력 예시)
[출력 예시 — 실험 기록]
가설 ① no에 SQLi: 1 AND 1=1 / 1 AND 1=2 비교 → 응답 동일. 소거
가설 ② search XSS: <script> 소거됨, <img src=x onerror=> 통과
→ 그러나 목표는 인증 우회. 우선순위 낮춤
가설 ③ sess 쿠키: base64 디코딩 → {"user":"guest","exp":...}
→ user를 admin으로 재인코딩 → 서명 검사에 걸림
→ 서명이 있다 = 서명을 무력화하는 문제. alg/시크릿 층으로 이동
읽는 법: 실패 기록이 길수록 좋은 기록입니다. 소거된 가설마다 "왜 아니었는가"가 붙어 있으면, 돌파 지점에서 "왜 이것이었는가"가 자동으로 설명됩니다.
3-4. 성공의 판정 — 재현으로 검증
정답이 나왔다고 끝이 아닙니다. 독립 해결의 판정은 재현입니다.
- 처음부터 다시 — 세션을 초기화하고 같은 경로를 혼자 다시 걷습니다
- 경로의 각 단계를 "왜 이 단계인가" 한 줄씩으로 설명합니다
- 설명이 막히는 단계가 있으면 그 문제는 아직 온전히 내 것이 아닙니다 — 다시 봅니다
3-5. 실패의 처리 — 분류와 재도전
4시간 초과 시의 절차입니다.
- 타이머를 끄고 손을 뗍니다
- 막힘을 세 유형으로 분류해 기록합니다
- 재훈련 주소로 돌아가 해당 챕터를 복습합니다
- 이 문제는 유효 기록에서 제외하고, 새 문제를 랜덤으로 뽑아 3연속을 다시 시작합니다
실패한 문제는 미래의 연습 문제가 됩니다. 한두 주 뒤에 재도전하면 달라진 손을 확인할 수 있습니다.
3-6. 점검 중 지키는 환경 규칙
측정이 공정하려면 환경도 통일합니다.
- 알림 차단: 메신저와 메일 알림을 끕니다. 4시간 블록은 끊기면 다시 세기 시작합니다
- 기록 창 상시 열기: 페이로드를 치는 창 옆에 기록 문서를 항상 띄워 둡니다. "나중에 적어야지"는 적히지 않습니다
- 도구 고정: 평소 쓰던 Burp 설정과 브라우저 그대로 갑니다. 점검 날에 새 도구를 시험하지 않습니다 — 도구 변수가 섞이면 측정이 흐려집니다
- 타이머는 물리적으로: 화면 구석의 타이머가 아니라 눈에 보이는 별도 타이머를 켜 둡니다. 상한은 기억이 아니라 장치가 지키게 합니다
3-7. 3연속 성공 후 — Write-up 3편 작성
통과하면 각 문제의 Write-up을 직접 씁니다. 이번에는 남의 풀이가 아니라 내 풀이입니다.
[출력 예시 — Write-up 형식]
# 문제 OOO Write-up
- **재료**: (정찰에서 찾은 것)
- **가설과 소거**: (틀린 길과 그 이유)
- **돌파**: (통과한 단계와 페이로드의 구조)
- **왜 이게 답인가**: (서버 코드 관점의 설명)
- **배운 것 한 줄**: (없으면 "없음 — 루틴 확인"이라고 적기)
"왜 이게 답인가" 칸이 Write-up의 심장입니다. 페이로드를 아는 것과 답을 이해하는 것은 다릅니다.
4. 미션과 연습문제
미션 — 독립 해결 3연속
- 2-2의 기준으로 중급 문제 3개를 랜덤 선정하고 선정 기록을 남깁니다
- 각 문제에 4시간 상한과 2-3의 루틴을 적용합니다
- 가설 목록, 시도한 페이로드, 실패 이유, 돌파 지점이 포함된 과정 기록을 남깁니다
- 3연속 성공 시 각 문제의 Write-up을 3-7 형식으로 작성합니다
- 실패했다면 2-4의 유형으로 분류하고, 재훈련 후 새 문제로 재도전합니다
연습문제
문제 1. 문제를 "랜덤으로" 선정해야 하는 이유를 측정의 관점에서 설명해 보세요.
문제 2. 점검 중 허용되는 리서치와 금지되는 리서치의 경계를 한 문장으로 정의해 보세요.
문제 3. 막힘의 세 유형(정보 부족·기법 부족·실행 오류) 중 "기법 부족"으로 분류되는 상황의 예를 들어 보세요.
문제 4. 3연속 중 2번째 문제에서 실패했습니다. 다음에 해야 할 일을 순서대로 적어 보세요.
5. 모범 답안과 완료 기준
미션 모범 답안
완성된 점검 기록의 골격입니다:
[출력 예시 — 3연속 기록표]
문제 | 소요 시간 | 유형(사후 판별) | 돌파 지점 | 판정
A | 2시간 40분 | 쿠키 조작 | 서명 알고리즘 혼동 | 성공(재현 완료)
B | 4시간 초과 | (미확인) | search 필터에서 소거 막힘 | 실패 → 기법 부족 분류
C | 1시간 15분 | SQLi | /**/ 공백 대체 | 성공(재현 완료)
D | 3시간 05분 | 업로드 | 확장자 혼합 + 경로 추측 | 성공(재현 완료)
→ B 실패로 연속 리셋, C·D·(신규 E)로 3연속 달성
검증하는 법: ① 선정이 랜덤이었는가(선정 기록 존재). ② 각 성공에 재현 절차가 붙었는가. ③ Write-up에 "왜 이게 답인가"가 채워져 있는가. ④ 실패가 있다면 유형 분류와 재훈련 주소가 연결됐는가.
연습문제 해답
문제 1 해답. 유형을 알고 고르면 정찰의 상당 부분 — "이 문제는 무엇을 묻는가"를 읽는 과정 — 이 선물로 주어져 측정이 오염되기 때문입니다. 실전의 대상은 유형을 알려 주지 않습니다. 랜덤 선정은 "처음 보는 문제 앞에서도 루틴이 서는가"를 측정하기 위한 조건입니다.
문제 2 해답. "일반 기법을 배우는 것은 허용, 이 문제의 답을 얻는 것은 금지"입니다. 필터 우회 기법 문서를 읽는 것은 도구를 배우는 일이고, 문제 번호를 검색해 풀이를 보는 것은 답을 받는 일입니다. 모르는 기법을 만나는 것은 학습 신호이지 실격 사유가 아닙니다.
문제 3 해답. 예: 서명된 토큰을 발견하고 변조 필요성까지 파악했으나, 서명을 무력화하는 기법 자체를 몰라 손을 못 댄 경우입니다. 재료(정보)는 찾았고 방향도 맞았지만 도구 상자에 해당 도구가 없는 상태 — 재훈련 주소는 그 기법의 챕터(이 예라면 Step 197의 JWT 공격)입니다.
문제 4 해답. ① 타이머를 끄고 손을 뗀다. ② 막힘을 세 유형으로 분류해 기록한다. ③ 분류된 유형의 재훈련 주소로 돌아가 복습한다. ④ 실패한 문제는 기록에서 제외하고 새 문제를 랜덤으로 뽑아 3연속을 다시 시작한다. 처음부터가 아니라 "새 문제로의 교체"입니다.
완료 기준 체크리스트
- [ ] 랜덤 선정 기록(후보 범위와 난수 결과)을 남겼다
- [ ] 각 문제에 4시간 상한과 루틴(정찰→가설→실험→정리)을 지켰다
- [ ] 과정 기록에 가설·페이로드·실패 이유·돌파 지점이 있다
- [ ] 풀이를 보지 않고 기법 문서만 사용했다
- [ ] 성공한 각 문제를 재현으로 검증했다
- [ ] 실패가 있다면 유형 분류와 재훈련 주소를 연결했다
- [ ] 미션: 3연속 달성 + Write-up 3편 완성
6. 흔한 실수와 해결
벽 1. "이 정도 힌트는 괜찮겠지"가 자꾸 올라온다
증상: 1시간쯤 막히면 검색창에 손이 갑니다.
원인: 점검의 목적을 점수로 오해하기 때문입니다. 여기서 측정되는 것은 여러분의 루틴이지 사이트의 점수가 아닙니다.
해결: 3-1의 선언문을 화면 옆에 띄워 두세요. 그리고 막힌 순간의 검색 욕구 자체를 기록에 적으세요 — "1:20, 풀이 검색 욕구 발생, 참음"이 훌륭한 측정 데이터입니다.
벽 2. 4시간이 순삭된다
증상: 가설 하나를 붙잡고 시간을 다 씁니다.
원인: 실험 단계에서의 시간 배분 실패. 한 가설에 1시간 이상이면 후보가 마른 것입니다.
해결: 가설마다 30~40분의 내부 상한을 두세요. 소거된 가설은 실패가 아니라 지도의 완성입니다. 3시간이 지나면 남은 시간은 "정리"에 쓰는 것이 원칙입니다.
벽 3. 아는 문제를 뽑았다고 느껴진다
증상: 문제를 열었는데 비슷한 것을 본 기억이 납니다.
원인: 커뮤니티 글을 읽다가 스포일된 경우가 있습니다.
해결: 정직하게 교체합니다. "핵심 트릭을 알고 있다"고 판단되면 그 문제는 측정에 쓸 수 없습니다. 선정 기록에 "교체 사유: 사전 노출"을 남기고 새 난수를 뽑으세요.
벽 4. 연속이 깨진 뒤 의욕이 꺾인다
증상: 두 문제를 풀고 세 번째에서 무너지면 처음으로 돌아간 느낌입니다.
원인: "연속"을 탑 쌓기로 생각하기 때문입니다. 실제로는 측정의 리셋일 뿐, 실력은 쌓여 있습니다.
해결: 기록을 다시 보세요. 2연속까지의 과정 기록은 사라지지 않았고, 실패의 분류는 다음 훈련의 주소가 됐습니다. 리셋되는 것은 판정 카운터뿐입니다.
벽 5. Write-up이 "페이로드 나열"로 끝난다
증상: Write-up에 명령만 있고 이유가 없습니다.
원인: 풀 때의 흥분으로 "왜"를 적지 않은 채 넘어갔기 때문입니다.
해결: 작성 시점을 성공 다음 날로 미루세요. 하루 뒤에 경로를 다시 설명하려면 "왜 이 단계였는가"가 반드시 필요합니다. 설명이 막히는 칸이 곧 아직 덜 이해한 칸입니다.
7. 정리
오늘의 개념
| 개념 | 한 줄 설명 |
|---|---|
| 독립 해결 | 풀이 없이, 기법 문서만으로 문제를 뚫는 것 |
| 3연속 규칙 | 우연이 설명되지 않는 구간의 시작점 |
| 랜덤 선정 | 측정 오염을 막는 문제 선정 방식 |
| 막힘의 세 유형 | 정보 부족 / 기법 부족 / 실행 오류 — 분류가 곧 처방 |
| 재현 검증 | 성공의 판정은 "혼자 다시 걷기"로 한다 |
| Write-up | 내 사고 경로를 타인이 재현 가능하게 적는 문서 |
오늘의 절차
| 단계 | 하는 일 |
|---|---|
| 선정 | 안 푼 중급 문제 후보에서 난수로 3개 |
| 진행 | 문제당 4시간, 정찰→가설→실험→정리 루틴 |
| 기록 | 가설·페이로드·실패 이유·돌파 지점 |
| 판정 | 재현 성공으로 인정, 풀이 열람 시 무효·교체 |
| 회고 | Write-up 3편 + 실패 유형 분류와 재훈련 |
명령어보다 중요한 감각
이 점검이 묻는 것은 하나입니다 — 아무도 알려 주지 않는 문제 앞에서도 여러분의 손이 움직이는가. 정답은 3연속이 아니라, 3연속에 이르는 동안 기록된 가설과 소거의 밀도입니다. 그리고 실패하더라도 잃는 것은 없습니다. 분류된 실패는 목차가 되고, 리셋된 카운터는 다시 오릅니다. 이 구간을 통과했다면, Web 트랙의 문을 나설 자격이 있습니다.
전부 체크되면 Step 202 완료입니다. 사이드바의 체크박스를 눌러 진도를 저장하세요.