본문 바로가기

wargame/LOS

[LOS]18번 NIGHTMARE

NIGHTMARE



18번 문제

이번에는 추측만으로는 어려운 감이 있어 현재 공부중인 SQL 책의 예제를 이용하였다.
아래는 그 테이블.

<?php 
  include "./config.php"; 
  login_chk(); 
  dbconnect(); 

  if(preg_match('/prob|_|\.|\(\)|#|-/i', $_GET[pw])) exit("No Hack ~_~"); 
  // (), #, - 필터링
  if(strlen($_GET[pw])>6) exit("No Hack ~_~"); 
  // $_GET[pw]의 길이가 6이하여야함

  $query = "select id from prob_nightmare where pw=('{$_GET[pw]}') and id!='admin'"; 
  echo "<hr>query : <strong>{$query}</strong><hr><br>"; 
  $result = @mysql_fetch_array(mysql_query($query))
; 
  if($result['id']) solve("nightmare"); 
  // $result['id']가 존재하면 문제 해결
  highlight_file(__FILE__); 
?>



주석이 필터링되었고 입력할 수 있는 길이가 6이하다.
내가 알기로는 preg_match와 strlen을 우회할 방법은 없다. 그러니 위 조건을 지키며 문제를 풀어야 한다.
다만 문제에서 길이를 제한할 때 모자라거나 남게 제한하지 않을 테니 아마 답은 6자리이다.
또한 조건이 TRUE가 되면 mysql_fetch_array 함수가 임의의 record 하나를 가져와 문제를 해결할 수 있다.
일단은 조건은 TRUE로 만드는 쪽으로 방향을 잡았다.

괄호 안을 TRUE로 만들어 문제를 해결하고자 했다. 다음과 같이 1'='1 (총 5자리)를 입력해보았다.
pw = ('1' = '1') and id != 'admin' 안에 '1'='1'가 TRUE가 되므로 가능할 것 같았다.

실패.(이유)

처음에는 이 테이블에는 id가 'admin'인 레코드 하나만 있어서 안되는 건가 싶어서 뒤에 주석을 넣으려고 시도했다.

실패.

고민하던 도중 진짜 id가 'admin'인 레코드 하나만 있는지 확신하고자 SQL 예제로 위의 쿼리를 확인해보았다.

'1'='1'은 TRUE이지만 auto type cast로 인해 WHERE CATEGORYID = 1;가 되어 실패한 것 같다.

이제 다른 방식을 생각해야 한다.
이번에는 1'='1';을 입력했다. where pw = ('1'='1';가 되어 될지도 모른다고 생각했다.

근데 6자리 넘어서 실패. 물론 그 조건이 없어도 실패할 쿼리였다.

가장 어려운 건 6자리 이하로 입력해야하는 조건이었다. 이래저래 해보다가 SQL에서 or 1 조건이 되는 것을 확인했다.

OR조건을 이용해서 해보기로 했다.

다 좋은데 6자리 넘지 않기가 어렵다.

주석까지 넣으면 8자리가 된다.

OR 대신 ||을 쓰면 띄어쓰기 한 자리를 줄일 수 있다.

이렇게 만들고 뒤에 주석을 붙여야 한다.

주석을 넣으면 7자리가 되어서 실패한다.

문제를 해결하기 위해 계속 구글링 하던 중에 이 문제를 해결할 수 있는 힌트를 발견했다.(주소)
계속 고민하다가 일단 해보자!하고 FALSE = FALSE 의 값은 TRUE이므로 아래와 같이 시도했다.

그랬더니 성공.
굉장히 어려운 문제였다. 힌트를 발견해서 내가 푼 것 같지도 않고.

예제에서도 다음과 같이 하면 모든 레코드가 출력된다.

그럼 왜 이전의 pw = ('1' = '1') 은 안 됐는지 고민하다가 아래와 같이 시도했다.

이유가 '1'='1'이 괄호 안에 있어서 안 됐음을 깨달았다.
('') = 0도 괄호 안에 있으면 (1)이 돼서 CATEGORYID가 1인 레코드만 출력되는 걸 확인할 수 있다.

개인적으로 이렇게 해석해서 풀었는데 구글링해보니 AUTO TYPE CASTING를 이용하는 문제라고 한다.
MYSQL에서 문자열은 0으로 치환되기 때문에 0 = 0이 된다는 것. (참고 주소)

'wargame > LOS' 카테고리의 다른 글

[LOS]20번 DRAGON  (0) 2019.08.16
[LOS]19번 XAVIS  (0) 2019.08.15
[LOS]17번 SUCCUBUS  (0) 2019.08.09
[LOS]16번 ZOMBIE ASSASSIN  (0) 2019.08.09
[LOS]15번 ASSASSIN  (0) 2019.08.09