web_security/Lord Of SQL

[LOS : Lord Of SQL Injection] 13번 Bugbear 문제 풀이

HawordFREAKEK 2022. 6. 4. 17:12

네 안녕하세요. Godhaword 입니다.

bugbear 문제에서 고난을 겪다가 이 문제 풀고 다음 문제부턴 술술 풀렸던 기억이 있는 문제입니다.

바로 문제 보겠습니다.

<?php 
  include "./config.php"; 
  login_chk(); 
  $db = dbconnect(); 
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[no])) exit("No Hack ~_~"); 
  if(preg_match('/\'/i', $_GET[pw])) exit("HeHe"); 
  if(preg_match('/\'|substr|ascii|=|or|and| |like|0x/i', $_GET[no])) exit("HeHe"); 
  $query = "select id from prob_bugbear where id='guest' and pw='{$_GET[pw]}' and no={$_GET[no]}"; 
  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>"; 
   
  $_GET[pw] = addslashes($_GET[pw]); 
  $query = "select pw from prob_bugbear where id='admin' and pw='{$_GET[pw]}'"; 
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("bugbear"); 
  highlight_file(__FILE__); 
?>
if(preg_match('/\'|substr|ascii|=|or|and| |like|0x/i', $_GET[no])) exit("HeHe");

like 도 막고 0x도 막혔네요..
일단 막힌 부분만 다시 생각해보자면 0x 는 다시 admin으로 넘어가면 될 것 같습니다.
like 는... in을 한번 써볼까요?

그 외에도 걸리는 부분이 두 부분 더 있습니다.

  1. ord에 or 이 들어갑니다.
  2. 공백 또한 필터링 됩니다.

공백은 %0c 같은걸로 우회하면 되고 ord 말고 다른 방법을 찾아 보아야 합니다.

 

 

후.. 일단 코드를 짜면서 몇가지 참고하시면 좋을만한 것이 있습니다.

  1. ord엔 or이 들어간다.
  2. like 가 안되면 in 이나 instr 을 쓰자
  3. 코드 짜다가 뭔가가 이상하다 싶으면 response 값을 보자
  4. url encoding 값을 파라미터로 날리면 그걸 한 번더 url encoding 해서 날리기에 이런 꼴에선 url+param 형식으로 날려주자

계속 안되는데 response 값 안보고 버팅기다가 hehe 뜨는거 보고 알았네요..

제가 주로 get 형식이여도 파라미터로 날리는걸 좋아하는데요. 이 문제 같은 경우 %0a를 날리게 된다면 각각의 문자를 한 번씩 더 url encoding 하기에 저희가 원하는 쿼리문을 날리기 힘들어집니다.
그렇기에 url에 태워서 같이 보내주면 flag를 뽑을 수 있습니다.

  • 이 문제로 알 수 있는 점
    - 저는 코드가 한 번 이상 꼬여서 시간을 잡아먹게 되면 주석이 점점 많아집니다.
    - 여러가지 스페이스바 필터링 우회 언어를 알아두자
  • Key Point
hex(mid(pw,1,1)) in (hex(55))
와 같은 식으로도 두 변수를 비교할 수 있습니다.