본문 바로가기

wargame/LOS

[LOS]20번 DRAGON

DRAGON



20번 문제

<?php 
  include "./config.php"; 
  login_chk(); 
  dbconnect(); 
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); 
  $query = "select id from prob_dragon where id='guest'# and pw='{$_GET[pw]}'";
  echo "<hr>query : <strong>{$query}</strong><hr><br>"; 
  $result = @mysql_fetch_array(mysql_query($query)); 
  if($result['id']) echo "<h2>Hello {$result[id]}</h2>"; 
  if($result['id'] == 'admin') solve("dragon");
  highlight_file(__FILE__); 
?>



우리가 입력해야하는 pw 앞에 #으로 주석처리가 되어있다.
처음에는 두 가지 방안으로 문제를 풀 수 있을거라 생각했다. 하나는 #이 한 줄을 주석처리하므로 %0a로 줄을 바꿔 유효한 쿼리를 입력하는 방법.
다른 하나는 새로운 지식을 익혀 푸는 방법.

뭐가 정답인지 모르기 때문에 우선은 %0a를 이용해서 풀고자 했다.
하지만 어째선지 해결이 안 돼서 구글링하면서 주석과 관련된 지식을 익히고자 하였다.
하지만 그와 관련된 sql injection방법을 찾을 수 없었다.

그렇다면 지금 할 수 있는 건 내가 할 수 있는 범위에서 시도하는 것뿐이므로 무작정 알고 있는 키워드를 넣기로 했다.
두 번째로 넣은 %00에서 바로 다른 결과를 확인할 수 있었다.

%00를 이용해서 푸는거구나 생각해서 다양하게 시도했다.

뭐 이것저것 했는데 결과는 실패.
관련해서 구글링도 많이 했는데 주석을 무시하는 방법은 나오지 않았다.

원점으로 돌아와 %0a를 이용하는 방법으로 다시 풀려고 했다.
pw=%0a+or+id=%27admin이라고 입력했다.

실패.
생각해보니 id=‘guest’# pw=‘\n or id=‘admin’ 즉, id=‘guest’ or id=‘admin’이 되어 “hello guest”가 출력된 것 같다.
그럼 어떻게 하면 id=‘guest’를 무시할까 고민하다가 and 조건을 이용하여 앞의 조건을 거짓으로 만들면 될 것 같았다.

pw=%0a+and+pw=q+or+id='admin을 입력했다.

문제해결!

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

[LOS]22번 DARK EYES  (0) 2019.08.26
[LOS]21번 IRON GOLEM  (0) 2019.08.25
[LOS]19번 XAVIS  (0) 2019.08.15
[LOS]18번 NIGHTMARE  (0) 2019.08.15
[LOS]17번 SUCCUBUS  (0) 2019.08.09