[WebHacking.kr] old-20번 문제 풀이 (Write-up)

Web2/Challenge-20 문제
자바스크립트의 동작 방식을 분석 -> 폼 데이터를 자동으로 입력하고 제출하는 Client side scripting 문제

1. 문제 분석 (Analysis)

F12를 통해 소스 코드를 확인하면, 캡차 인증을 포함한 폼 제출 로직이 포함되어 있다.

function ck(){
  if(lv5frm.id.value=="") { lv5frm.id.value.focus(); return; }
  if(lv5frm.cmt.value=="") { lv5frm.cmt.value.focus(); return; }
  if(lv5frm.captcha.value=="") { lv5frm.captcha.focus(); return; }
  if(lv5frm.captcha.value!=lv5frm.captcha_.value) { lv5frm.captcha.focus(); return; }
  lv5frm.submit();
}

제한 시간: 상단에 time limit : 2 second 문구가 있어, 페이지 로드 후 2초 안에 모든 값을 입력하고 제출해야 함
캡차 로직: captcha_라는 이름의 버튼 value에 무작위 문자열이 생성되며, 사용자는 이 값을 captcha 입력창에 똑같이 입력해야 함
검증 과정: ck() 함수는 닉네임, 코멘트, 캡차 값이 비어있는지 확인하고, 특히 입력한 캡차 값과 생성된 값이 일치하는지 대조한 뒤 submit()을 호출

2. 익스플로잇

2초라는 짧은 시간 내에 수동으로 입력하는 것은 어려우므로, 브라우저 콘솔에서 자바스크립트를 실행하여 자동화를 수행

// 1. nickname과 comment에 임의의 값 "admin" 입력
document.lv5frm.id.value = "admin";
document.lv5frm.cmt.value = "admin";

// 2. 캡차 버튼(captcha_)에 생성된 랜덤 value 값을 읽어서 입력창(captcha)에 대입
document.lv5frm.captcha.value = document.lv5frm.captcha_.value;

// 3. 폼 제출 함수 호출 또는 직접 submit
document.lv5frm.submit();

코드 설명:

document.lv5frm.id.value와 cmt.value를 통해 서버가 요구하는 필수 입력값을 채운다.
핵심은 document.lv5frm.captcha_.value를 참조하여 입력하는 것이다.
마지막에 submit()을 실행하면 ck() 함수의 유효성 검사를 거치지 않고 서버로 바로 데이터를 전송하거나, 모든 조건이 충족된 상태로 폼이 제출됨

+ ck()함수의 유효성 검사를 거치지 않는 이유

자바스크립트에서 HTML 폼(Form)을 제출하는 두 가지 방식의 차이 때문에 발생합니다.

결론부터 말씀드리면, form.submit()이라는 메서드(Method)를 직접 호출하면 브라우저는 '사용자가 검증을 마쳤다'고 간주하고 곧바로 서버로 전송하기 때문입니다.

  1. ck() 함수가 호출되지 않는 이유

제공해주신 HTML 코드를 다시 보면, 제출 버튼이 다음과 같이 되어 있습니다.

HTML


일반적인 흐름: 사용자가 버튼을 클릭(onclick) → ck() 함수 실행 → 함수 내부의 유효성 검사 통과 → 마지막 줄의 lv5frm.submit() 실행.

스크립트 실행 시: 콘솔창에 직접 document.lv5frm.submit()을 입력하면, 버튼의 onclick 이벤트(즉, ck() 함수)를 거치지 않고 폼 객체의 전송 기능만 즉시 실행합니다.

  1. onsubmit과 submit()의 차이

만약 HTML이 아래와 같은 구조였다면 스크립트로 실행해도 검증을 거쳤을 것입니다.

구분 일반적인 방식 (onsubmit) 현재 문제의 방식 (onclick)
HTML 구조


특징 폼이 제출될 때 무조건 ck()를 실행함. 버튼을 '클릭'했을 때만 ck()를 실행함.
스크립트 전송 시 submit() 호출 시 검증 로직이 작동함. submit() 호출 시 ck()를 건너뜀.
3. 요약하자면

문제 코드에서 ck() 함수는 '버튼을 눌렀을 때 실행되는 별개의 함수'일 뿐, 폼(Form) 자체에 결속된 필수 검증 절차가 아닙니다.

따라서 우리가 콘솔에서 lv5frm.submit()을 명령하는 것은, "검문소(ck 함수)를 통과해서 정문을 여는 게 아니라, 뒷문(submit 메서드)을 직접 열어버리는 것"과 같습니다.

'wargame > webhacking.kr' 카테고리의 다른 글

[WebHacking.kr] old-54번 문제 풀이 (Write-up)  (0) 2026.01.12
old-39  (0) 2025.04.20
old-16  (0) 2025.04.20
old-26  (0) 2025.04.20
old-15  (0) 2025.04.20