Season 1/워게임

Old - 39 Write Up

작성자 - LRTK

이번에도 입력값에 통해 PHP에 어떤 조건이 되어있는 것으로 판단이 된다.

 

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

코드를 보니, 첫번째 replace인 str_replace(“\\”,””,$_POST[‘id’])은 입력값에서 ::\::이 있는 경우 제거한다.
두번째 replace인 str_replace(“’”,”’’”,$_POST[‘id’])은 입력값에서 ::’::을 ::’’::으로 변환한다.

 

이 2가지를 통과한 후, Substr 함수에 0, 15을 줘서 입력값의 0번째부터 14번째 인덱스까지 추출하여 쿼리문에 삽입한다.

 

쿼리는 length(id)<14 and id=‘{$_POST[‘id’]}이 True면 1를 출력한다.

 

결과가 1이 나와야 조건문이 실행이 되면서 Flag를 얻을 수 있다.

 

일단 쿼리에서 from이 member인 것을 보아서 지금까지 나온 admin, guest를 이용하면 될 것으로 판단이 된다.

 

문제는 id=‘{$_POST[‘id’]}가 쿼리문으로 될려면 뒤에 ’이 있어야 하는데, 두번째 replace 때문에 ’’으로 변환이 된다는 것이다.
그래서 될지 모르겠지만, 인덱스 0부터 14까지만 반영된다는 것을 이용하여 admin '을 입력하였다.

이유는 admin '가 두번째 replace에 의해 admin ''으로 변환되고, 인덱스 0 ~ 14까지는 admin ‘임으로 ’의 문제는 해결이 되기 때문이다.

 

값을 서버로 보내니, Flag를 받을 수 있었다.

 

SQL 쿼리에서 스페이스 공간이 있어도 어떻게 가능한 것인지 궁금하여 검색을 해보니, 우아한형제 기술블로그에서 해답을 찾을 수 있었다.
MySQL에서 ‘a’ = ‘a ‘가 true로 평가된다? - 우아한형제들 기술 블로그

결론, Table 생성 시 컬럼의 길이 제한을 맞추기 위해 부족한 공간을 공백처리를 한다는 것이다.

'Season 1 > 워게임' 카테고리의 다른 글

Old - 19 Write Up  (0) 2021.05.16
Old - 07  (0) 2021.05.16
Old - 54 Write Up  (0) 2021.05.15
Old - 38 Write Up  (0) 2021.05.15
Old - 26 Write Up  (0) 2021.05.15
Contents

이 글이 도움이 되었다면, 응원의 댓글 부탁드립니다.