
이번 글에서는 1번과 24번을 간단하게 정리해본다.
정답 값 자체는 적지 않고, 왜 그런 방식으로 풀리는지만 남겨두려고 한다.
학습용 풀이입니다.

처음 화면만 보면 level : 1 같은 문구만 보여서 별 단서가 없어 보인다.
그런데 view-source를 확인해보면 핵심 조건이 꽤 노골적으로 드러난다.
// 핵심 흐름만 정리
if (user_lv가 숫자가 아니면) user_lv = 1;
if (user_lv가 4 이상이면) user_lv = 1;
if (user_lv가 3 초과이면) solve();
숫자가 아니면 안 된다.
4 이상이어도 안 된다.
그런데 3 초과여야 한다.
즉, 결국 3보다 크고 4보다 작은 숫자가 필요하다는 뜻이다.
처음에는 user_lv가 기본값처럼 보이는 값으로 세팅되어 있다.
그래서 이 문제는 복잡한 우회라기보다, 쿠키 값을 직접 바꿀 수 있는지와
조건식을 정확히 읽었는지를 묻는 문제에 가깝다.
여기서 중요한 건 정수만 떠올릴 필요가 없다는 점이다.
숫자 판별을 통과하면서도 3 초과, 4 미만을 만족하는 값이면 되기 때문에
자연스럽게 소수 형태의 값을 떠올리면 된다.
결국 이 문제의 핵심은 “엄청난 기술”이 아니라
if문 두세 줄을 침착하게 해석하는 것이었다.
1번은 딱 이런 문제였다.
쿠키 이름이 무엇인지 찾기
어떤 값이 막히는지 보기
어떤 범위가 허용되는지 계산하기
조건만 읽히면 바로 풀리는 스타일이라,
초반 워게임 문제로 감각 익히기에 꽤 좋았다.
24번은 처음 보면 내 IP와 agent가 출력되고,
아래에는 Wrong IP! 같은 문구가 보여서
그냥 “IP를 맞춰야 하는 문제인가?” 정도로 보인다.
그런데 소스를 보면 핵심은 단순한 IP 체크가 아니라,
어떤 값이 변수에 들어가고,
그 값이 어떤 순서로 치환되는지를 보는 문제다.
// 핵심 흐름만 정리
extract($_SERVER);
extract($_COOKIE);
$ip = $REMOTE_ADDR;
// 문자열 치환
".." -> "."
"12" 제거
"7." 제거
"0." 제거
if ($ip == "127.0.0.1") solve();
이 문제에서 제일 먼저 봐야 하는 건 REMOTE_ADDR 그 자체보다도
그 값이 어디서 왔는가이다.
소스 흐름을 보면 서버 쪽 값뿐 아니라 쿠키 쪽 값도 함께 다뤄지고 있어서,
결국 관건은 입력한 값이 최종적으로 어떤 문자열로 남느냐가 된다.
즉 이 문제는 처음부터 완성된 127.0.0.1을 넣는 문제가 아니라,
특정 값이 REMOTE_ADDR 쪽 흐름에 반영되게 만들고,
문자열 치환이 순서대로 적용된 뒤,
최종 결과가 127.0.0.1이 되도록 맞추는 문제
라고 보는 게 더 정확하다.
처음엔 조금 헷갈릴 수 있는데,
오히려 한 번에 정답을 찾으려 하기보다
문자열이 치환될 때마다 어떻게 바뀌는지 적어보면 금방 감이 온다.
예를 들면 이런 식으로 접근하면 된다.
점 두 개가 점 하나로 줄어드는 부분 보기
특정 문자열이 제거된 뒤 어떤 조합이 남는지 보기
마지막 출력 결과가 127.0.0.1이 되는지 확인하기
그래서 이 문제는 “무엇을 넣느냐”보다
필터를 지나고 난 뒤 무엇이 남느냐가 더 중요했다.
24번은 결국 이런 포인트를 묻는 문제였다.
값이 실제 서버값만으로 정해지는가
입력값이 중간에 어떻게 덮이는가
문자열 필터가 어떤 순서로 적용되는가
최종 비교 대상이 무엇인가
처음엔 하나하나 넣어보면서
최종 출력이 127.0.0.1처럼 보이도록 맞춰가는 방식으로 접근하면
훨씬 직관적으로 풀린다.
이번에 1번과 24번을 같이 보면서 느낀 건,
둘 다 엄청 복잡한 취약점이 필요한 문제는 아니라는 점이었다.
대신 중요한 건 확실했다.
1번은 조건식 해석
24번은 값의 흐름 + 문자열 치환 결과 추적
“어려운 기술을 아느냐”보다
코드를 끝까지 읽고, 조건을 정확히 정리할 수 있느냐를 더 많이 묻는 것 같다.
다음에도 이런 식으로
정답만 적는 풀이보다,
왜 그런 값이 되는지를 같이 정리하는 방식으로 계속 기록해볼 생각이다.
확실히 저번보다는 쉬운것같다~~!!!!!