web_security/Lord Of SQL

[LOS : Lord Of SQL Injection] 15번 Assassin 문제 풀이

HawordFREAKEK 2022. 6. 6. 18:45

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

제 기억으로는 이 뒤로는 다 필터링 관련 문제였던거 같은데요.

바로바로 풀어보겠습니다.

<?php 
  include "./config.php"; 
  login_chk(); 
  $db = dbconnect(); 
  if(preg_match('/\'/i', $_GET[pw])) exit("No Hack ~_~"); 
  $query = "select id from prob_assassin where pw like '{$_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("assassin"); 
  highlight_file(__FILE__); 
?>

 

pw로 입력받고 id가 admin이기만 하면 되는 간단한 문제네요.

그냥 ' or id='admin'# 하면 안되나?

 

아.. 싱글 쿼터에 필터링이 있었네요.
싱글쿼터가 필터링되어 있는데 전에 풀던 문제처럼 no 같은 숫자형 파라미터가 없기에 어쩌라는건지 다시 생각해보아야합니다.

저희는 여기에서 와일드카드라는 개념을 알아두면 좋습니다.

like 를 쓴다면 %(와일드카드)를 쓸 수 있는데요.

저희가 어딘가에 값을 입력할 때, 중간 무슨 값은 알겠는데 자세한 정보를 모를 때 평소에는 *를 입력하여 값을 찾곤 합니다. 이 문제에선 * 역할로 %를 쓰면 됩니다.
추가적으로 _(언더바) 는 한 글자를 뜻합니다.

 

예를 들어 이렇게 % 와일드카드 하나만 쓰게 된다면 일단 맞는 말이 됩니다.
하지만 저희가 알아야 하는 부분은 admin의 pw 값이기 때문에 좀 더 찾아봅시다.

이런식으로 _ 를 통하여 pw 길이가 8글자인 것은 알았는데요.

근데 풀다보니까 꼭 이렇게 귀찮게 풀어야하나 라는 생각이 들었습니다.

 

 

저희는 비밀번호 전부를 알던 비밀번호 반만 알던 와일드카드라는 기능을 사용하여 더 빨리 풀수 있으면 해당 방법을 사용하여 넘어가면 더 이득입니다.

그러므로 각자리 단어를 하나하나 찾는 것 보단 위와 같은 방식으로 와일드카드를 이용하여 넘어갈 수 있는 부분은 다 넘어가 핵심만 찾는 코드로 짜보았습니다.

저는 보여드릴려고 이렇게 짰으나 실제로 문제푸는 입장에선 찾자마자 break 잡아서 __2% 만 넘겨도 문제푸는데는 지장이 없습니다.

다른 풀이는 모르겠으나 이 방법대로 하는게 가장 빨라보입니다.

와일드카드 사용하는 문제인 것만 알면 글자수 체크할 필요도 없이 위와 같은 코드를 구하면 3자리 안에 flag를 구할 수 있습니다.

 

 

  • 이 문제로 알 수 있는 것
    - 와일드카드라는 정의를 몰랐다면 푸는데 꽤 오랜 시간이 걸릴 것이며 난이도도 높은 문제로 다가왔을 수도 있습니다.
    - 하지만 와일드카드라는 내용을 알았더라면 3글자 brute force 안에 답이 나오는 쉬운 문제였습니다.
    - 그렇다고 pw 값을 하나하나 다 구해서 푸는 풀이 또한 틀린 풀이는 아니며 모든 풀이는 flag를 구하는데에 목적이 있다는 부분을 다시 생각해보는 문제였습니다.
    - 실무에서 위와 같은 상황이 온다면 계정을 탈취하여 그 해당 권한을 사용하고자 하면 그 땐 저와 같은 대략 유추하여 사용하시는게 더 빠르다는 부분 알려드립니다.
    - 지금까지 기본기, 스킬 위주의 문제였다면 이 문제는 센스가 있다면 더 빨리 풀 수 있는 그런 문제였다 생각합니다.
  • Key Point
각 단어 하나하나는 _
대략 뭉텅이는 %

위 와일드카드를 대응하여 대략 데이터를 조회할 수 있다