[webhacking.kr] old-39

asdf·2026년 3월 31일

web

목록 보기
14/32


문제에 접속하면 위와 같이 제출 창과 view-source 링크가 있습니다. 코드를 먼저 확인해 보겠습니다.

<?php
  $db = dbconnect();
  if($_POST['id']){
    $_POST['id'] = str_replace("\\","",$_POST['id']);
    $_POST['id'] = str_replace("'","''",$_POST['id']);
    $_POST['id'] = substr($_POST['id'],0,15);
    $result = mysqli_fetch_array(mysqli_query($db,"select 1 from member where length(id)<14 and id='{$_POST['id']}"));
    if($result[0] == 1){
      solve(39);
    }
  }
?>

최종 목표는 $result[0]의 값을 1로 만드는 것입니다. select 1구문이 존재하므로 쿼리문 조건에 맞는 데이터가 존재할 경우 1을 반환합니다. 따라서 목표는 조건에 맞는 데이터가 존재하도록 쿼리문을 작성하는 것이 됩니다.

코드를 살펴보면 id를 POST 전송으로 전달을 받은 후, \는 공백으로 처리하고 '''으로 변환한 뒤 앞에서부터 15자가 되도록 자릅니다.

'''으로 변환이 되기 때문에 id=' 이후 '을 통해 입력 문자열을 닫고 or 구문을 사용하는 것이 불가능해 보입니다. 쿼리문이 정상적으로 동작하기 위해서는 ' 하나가 반드시 필요하기 때문에 substr을 통해 '' 중 뒤에 있는 따옴표를 제거할 수 있어 보입니다.

id가 실제 존재하는 id여야 1을 반환하기 때문에 가장 있을만한 admin이라는 id를 사용하겠습니다.
substr 길이에 맞춰 입력 값을 사진처럼 넣으면 맨 끝의 '' 중 뒤의 따옴표가 substr에 의해 잘리므로 입력 값과 동일한 값만 남게 됩니다.

이렇게 넣으면 length(id)<14를 만족하지 않는 거 아닌가? 라고 생각할 수도 있지만 length(id)는 id의 길이가 아닌 member 테이블에 저장되어 있는 id 컬럼 값의 길이이므로 조건을 만족합니다.

profile
Rainy Waltz(a_hisa)

0개의 댓글