web_security/Lord Of SQL

[LOS : Lord Of SQL Injection] 17번 zombie_assassin 문제 풀이

HawordFREAKEK 2022. 6. 12. 01:57
반응형

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

이번에 기회 잡아서 글 쓰느라 한 번에 los 관련 글 쓰는데 하루에 15개 밖에 글을 업로드 못하더라구요.

일단 코드는 다 작성해 놓고 천천히 쓰는 중입니다. 15번 부터 글은 아마 예약 글로 천천히 풀 예정입니다.

 

<?php 
  include "./config.php"; 
  login_chk(); 
  $db = dbconnect();
  $_GET['id'] = strrev(addslashes($_GET['id']));
  $_GET['pw'] = strrev(addslashes($_GET['pw']));
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~"); 
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); 
  $query = "select id from prob_zombie_assassin where id='{$_GET[id]}' and pw='{$_GET[pw]}'"; 
  echo "<hr>query : <strong>{$query}</strong><hr><br>"; 
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if($result['id']) solve("zombie_assassin"); 
  highlight_file(__FILE__); 
?>

 

코드가 기네요. 어림도 없지 바로 admin'#  때려박기

admin'# 이 거꾸로 #'minda로 표현되고, '는 \'이 반대로 출력되며 '\로 출력되는 것을 볼 수 있습니다.
위에서 사용되는 strrev 함수가 입력받은 id, pw 값을 반대로 출력해주고 있습니다. (String Reverse 인 듯)
그리고 addslashes 함수가 ' 앞에 \(역슬래시) 를 추가하여 '를 문자로 입력받게 도와줍니다.

흠.. 이 전에 assassin 문제가 \를 이용해서 싱글쿼터를 문자형으로 우회하여 넘어가는 느낌이였는데, assassin_zombie 는 오히려 그걸 역으로 이용해서 풀기 까다롭게 해주네요.
하지만 위 쿼리를 보시면 id='#'\minda 로 표현되며 그냥 간단하게 휴먼 코딩으로 정리를 조금 더 해서 쿼리를 날려보겠습니다.

 

바로 풀리네요.

일단 null byte를 보내 \0 을 보내어 역슬래시를 뒤로 보냅니다.
그러면 뒤로간 역슬래시가 싱글 쿼터를 문자형으로 받아주고, pw 값에 저희가 원하는 쿼리를 날릴 수 있게 해줍니다.

그 뒤부터는 저희가 쉽게 assassin 풀던대로 넘어가면 됩니다.

null byte 빼고 다른 특수기호들은 슬래시가 안박혀서 나오더라구요

 

  • 이 문제로 알 수 있는 것
    - 문제 이름이 비슷하면 해결 방법 또한 비슷하다
    - 전에 한 번 썼던 기법이 다시 사용될 때가 많다
     - 백슬래시로 싱글쿼터가 문자형이 된다는 것을 알아두자
  • Key Point

%00은 Null byte 이며 \0 을 뜻한다
반응형