[LOS] 18번 nightmare 풀이

2019. 8. 8. 14:03문제풀이/los.rubiya.kr

<?php 
  include "./config.php"; 
  login_chk(); 
  $db = 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 = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if($result['id']) solve("nightmare"); 
  highlight_file(__FILE__); 
?>

이번 금지 문자열은 prob _ . () # -이며, pw의 글자수가 6자를 넘어가면 안된다는 조건이 적혀있다.

 

#을 쓰면 안되니까 쓸 수 있는 주석은 --+과 ;%00가 있는데, --+는 3글자, ;%00는 2글자니까 ;%00를 사용한다.

 

뒷부분의 and id!='admin'를 무효화해야하니까 주석은 반드시 적어야 하고,

나머지 최대 4글자로 pw에 들어가는 부분을 참으로 만들어야한다.

 

알고보면 되게 쉬운문젠데, 알기까지가 엄청 어려운 문제다...

힌트는 논리식은 거짓일 때 0, 참일 때 1을 값으로 갖는다는 것!

 

빠르게 풀어보자면...

일단 pw의 (' 이부분이 있기 때문에 ')로 닫아준다.

그럼 입력할 수 있는 값은 밑의 OO와 같이 2글자가 남는다.

 

where pw=('')OO;%00') and id!='admin'

여기서 아까 말한 힌트, 논리식은 0이나 1을 값으로 갖는다는 것이 쓰인다.

 

바로, pw=('') 이부분이 논리식이라는걸 알면 된다!

pw=('')는 거짓이므로 0을 값으로 갖는다.

 

따라서 OO에 =0이나 <1 등을 넣어주면 전체적으로는 참값을 갖게 되는 것이다.

 

'문제풀이 > los.rubiya.kr' 카테고리의 다른 글

[LOS] 17번 zombie_assassin 풀이  (0) 2019.08.08
[LOS] 16번 succubus 풀이  (0) 2019.08.07
[LOS] 15번 assassin 풀이  (0) 2019.08.07
[LOS] 14번 giant 풀이  (0) 2019.08.07
[LOS] 13번 bugbear 풀이  (0) 2019.08.07