[webhacking.kr] 39번 문제 풀이[PHP,Mysql]

1 분 소요

💡 Webhacking.kr challenge(old) 39번 문제에 대한 풀이입니다.

문제

image

<?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);
    }
  }
?>

문제 풀이

sql 문을 먼저 보면 다음과 같습니다.

  select 1 from member where length(id)<14 and id='{}

위의 쿼리문 중에서 1은 컬럼 명이 아닙니다. member 테이블에서 where 조건으로 나오는 id가 있다면 1을 보여줍니다.

다음이 그 예시입니다.

image

따라서 입력 값을 통해서 쿼리문을 완성시켜서 아무 데이터든 출력이 되게 하면됩니다.

그리고 주의해야 할 것이 sql문의 마지막 조건을 보면 맨 마지막 작은 따옴표가 하나 없습니다. 그러므로 최소한 하나의 '가 있어야 sql문을 오류 없이 완성 시킬 수 있습니다.

문제의 조건을 보면 \ 는 사용할 수 없고, '는 하나를 2개로 바꿔버리기 때문에 결국 '는 가장 마지막에 꼭 입력해 줘야 합니다.

그리고 이 문제를 풀기 위해서 알아야 하는 지식이 있습니다. mysql에서는 다음의 쿼리를 True로 반환한다는 것입니다.

image

즉 mysql 에서는 문자열 비교를 할 때, 끝에 공백이 추가로 붙더라도 같은 문자로 인식합니다.

이를 이용하면 문제에서 공백(또는 널문자)을 이용하여 다음과 같이 작성할 수 있습니다.

  admin         '  : 공백 9개

image

추가) 위의 풀이가 성공한다는 뜻은 member테이블에 id=’admin’인 데이터가 있다는 뜻이며, 추가로 해봤을 때 ‘guest’로 해도 풀렸습니다.

추가2) 만약 다른문제에서 공백(%20)을 필터링 한다면 null 문자를 이용해서 우회를 할 수도 있습니다. null문자를 입력하기 위해서는 Post 방식으로 데이터를 전송할 때는 브라우저에서는 안되고, Burp Suite를 이용해서 수정해 줘야 합니다.

image

image

Reference

https://techblog.woowahan.com/2559/

댓글남기기