web_security/Lord Of SQL

[LOS : Lord Of SQL Injection] 19번 Xavis 문제 풀이

HawordFREAKEK 2022. 6. 18. 14:09

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

원래 쭉 끝까지 쓰려했는데.. 피곤해서 자버렸네요. 그래도 남은 글 최대한 꾸준하게 예약글 걸어두겠습니다.

 

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

이번 문제 스포하자면 왜 이 정도 위치에 있는지 모르겠습니다.
그렇기에 이번 문제는 flag를 먼저 보여드리고 제가 왜 이런 방식을 썼는 지 설명하는 두괄식 느낌으로 적어보도록 하겠습니다.

일단 보시면 엥 굳이 이걸 필터링 하다고? 싶을 수준에 평소에 잘 안쓰는 함수들이 hehe 필터링이 되어 있습니다.

그렇기에 ' or 1=1# 같은 평소에 잘 막히던 pw는 이번에 잘 뚫리는 모습을 보여줍니다. 그래서 이를 기반으로 코드를 짜본다면 

이런 식으로 값을 찾을 수 있고

여기서 나온 0000C6B00000C6550000AD73 값을 평소에 해주던 것 같이

소문자로 바꾸어줍니다.

그리고 입력해주면? 안됩니다.

그래서 다시 HXD를 켜주고 해당 hex 값을 다 입력한 후

decode 된 값을 입력해도 solve 가 안됩니다.

값이 24개가 나오고, hex 한 글자당 8개를 잡아먹으니 손수 풀어봅시다.

? 팬치신가요

 

아무튼 위에서 얻은 pw를 문제에 입력해보면 

 

문제를 넘어갈 수 있습니다.

 

이 뒤로는 제가 왜 이렇게 풀었나에 대해서 알려드리겠습니다.(풀이 방법이 개인차를 탈 것 같아서..)

 

1. 그냥 substr로 풀기

평소와 같은 쿼리문을 쓰게된다면 length는 12개 인 것을 확인 할 수 있습니다.

하지만 위와같이 각 단어를 못찾고 substr을 넘겨버리기에 그냥 ascii로는 안풀린다 생각했습니다.

그래서 bin값으로도 해보려했는데

2. Binary

 

 

총 16글자의 bin 값을 얻을 수 있었습니다.

하지만 해당 값을 어떻게 복호화 해보아도 flag와 관련된 정보는 안나오기에 binary 방법도 넘어갔습니다.

 

3. 추가 Solve 방법

'or (select @gh:=pw where id='admin') union select @gh#

이런식으로 쿼리를 날렸는데요.
평소의 접근법 과는 많이 다른 접근법 입니다.
일단 select @value:="test"는 value 라는 지역변수에 test라는 값을 넣는다는 뜻입니다.
위 코드로 해석하자면 gh 라는 변수에 id 가 'admin' 인 계정의 pw를 저장하는 것인데요. 그 후에 union select로 admin 계정의 pw가 저장되어 있는 gh 변수를 출력하게 도와줍니다.

 

솔직히 이게 더 풀기 쉬웠겠네요

 

  • 이 문제로 알 수 있는 것
    - blind sql 로 떨어진 값이 flag로 제출이 안되더라도 조금씩 변형을 해가면서 내보자
    - table view 가 아닌 곳에서도 union select를 사용 할 수 있다.
    - password 가 영어가 아닌 한글로만 바뀌어도 문제를 푸는 입장에서 꽤 어려울 수도 있다
  • Key Point
select @value:="text";
는 value라는 지역변수에 text라는 값을 입력해주는 쿼리이다.

hex 값으로 뽑은 값이 8의 배수라면 8자리로 끊어서 디코딩하여 디코딩 한 값도 한 번 입력해보자