web_security/Lord Of SQL

[LOS : Lord Of SQL Injection] 20번 Dragon 문제 풀이

HawordFREAKEK 2022. 6. 19. 01:24

네 안녕하세요. Godhaword 입니다.
맨날 주말만 되면 평일날에 힘들게 일했으니까 주말은 푹 쉬어야지 하고 아무것도 안하기가 일상이였습니다.
그런데 그것도 몇 달간만 힐링되고 좀 더 지나니까 무기력해지더라구요. 그래서 블로그 글 다시 써보기도 하고, CTF 문제 풀어보기도 하고, 웹린이 분들 개인적으로 웹 알려드리기도 하니까 무기력증은 좀 나아진 것 같습니다.
이 글을 읽는 분들도 혹시나 번아웃이 온다고 느끼거나 무기력증에 걸린 것 같으신 분들은 쉬는 날에 쉬는 것 말고도 무언가를 해보시기 바랍니다. (나가서 돌아다니는 건 죽어도 못하겠더라구요;; 집돌이)

문제 보겠습니다.

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


문제는 간단한 SQLI 문제 같아보입니다.

주석역할을 하는 #이 id='guest' 쪽에 붙어서 저희가 guest id 에서 admin id로 바꾸는 것은 조금 힘들어보입니다.
하지만 생각을 조금 바꾸면 아주 쉬운 문제로 바뀝니다.

이 글은 테스트 입니다1#이 글은 테스트 입니다2
이 글은 테스트 입니다3

위 테스트 글을 보시면 1번 뒤에 주석이 있으나 개행 한 번으로 2번은 필터링 되고, 3번 글은 필터링이 되지 않는 모습을 볼 수 있습니다. 이 점을 이용하여 쿼리를 작성한다면

바로 문제가 풀리는 것을 보실 수 있습니다.
중간에 gh는 id='admin' 이 되기 전 모든 값을 거짓(0) 값으로 만들기위해 대충 쓴 pw 값입니다.
개행이라는 Key Point를 빨리 알아내는 것이 중요한 문제였습니다.

 

  • 이 문제로 알 수 있는 것
    - 개행은 %0a, \n 이다
    - 주석은 해당 주석 뒤로 한 줄만 주석처리가 가능하다
  • Key Point
%0a