web_security/Lord Of SQL

[LOS : Lord Of SQL Injection] 22번 Dark_eyes 문제 풀이

HawordFREAKEK 2022. 6. 24. 01:15

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

바로 문제로 보시죠


<?php
  include "./config.php"; 
  login_chk(); 
  $db = dbconnect(); 
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
  if(preg_match('/col|if|case|when|sleep|benchmark/i', $_GET[pw])) exit("HeHe");
  $query = "select id from prob_dark_eyes where id='admin' and pw='{$_GET[pw]}'";
  $result = @mysqli_fetch_array(mysqli_query($db,$query));
  if(mysqli_error($db)) exit();
  echo "<hr>query : <strong>{$query}</strong><hr><br>";
  
  $_GET[pw] = addslashes($_GET[pw]);
  $query = "select pw from prob_dark_eyes where id='admin' and pw='{$_GET[pw]}'";
  $result = @mysqli_fetch_array(mysqli_query($db,$query));
  if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("dark_eyes");
  highlight_file(__FILE__);
?>

이 문제도 21번 문제처럼 서브쿼리를 사용하면 될 것 같네요.
하지만 필터링에 case, when, if 문이 모두 들어가 있어 같은 함수를 다시 사용하는 건 좀 힘들어보입니다.

이렇게 간단한 서브쿼리를 입력해 참 거짓 값을 판단해보겠습니다.

참 일 시에는 뭔 값이라도 뜨고, 거짓일 경우 error 값을 보여주는 것을 알 수 있습니다.

일단 이 문제 해설에 앞서, select 1 unoin select 1=1 과 select 1 unoin select 1=2 가 왜 이런 차이를 보여주는지 이해를 하시면 앞으로의 문제도 풀기 쉬우실 것 같습니다.

 

select 1 union select 1
select 1 union select 1=1

위에 값이 전 문제에서 풀었던 쿼리이고 밑에 값이 이번 문제에서 사용되는 쿼리입니다.
서브쿼리로 나온 값이 두개 이상일 경우 에러를 내는 것을 저희는 알 수 있었습니다.

기본적으로 select 1을 통하여 1 이라는 값이 나오게 되고, union select 를 통하여 또 1 값이 나오게되면 총 나오는 값은 1 단 하나로 정해질 수 있습니다.

하지만 

select 1 union select 2
select 1 union select 1=2

와 같은 값을 입력한다면 위의 쿼리는 1과 2, 아래의 쿼리는 1과 0을 return 하게 되어 에러를 만들게 되는 것입니다.
간단하지만 이 개념을 이해 안하고 그냥 바로 다음 문제로 넘어가거나 해당 문제를 풀게 되면 다음에 같은 유형으로 문제를 봤을 때, 또 시간만 주구장창 쓰는 모습을 보실 수 있을 것 입니다.

 

다시 문제로 돌아와서

서브쿼리 안에 조건문을 통하여 길이를 구했더니 8글자가 나옵니다.

 

코드를 짰는데 값이 이상하길래 코드를 다시 확인해본 결과, j 변수 쪽에 싱글쿼터로 안 감싸져있더라구요.
그래서 싱글쿼터를 추가하여

위와 같이 pw 값을 찾아준 후

python 기능을 통하여 소문자로 바꾸어주고

해당 pw 값을 get 형식으로 보내준다면

 

 DARK_EYES 문제도 solve가 된 것을 볼 수 있습니다.

 

  • 이 문제로 알 수 있는 점
    - 서브쿼리는 하나의 값만 return 할 수 있다.
    - 참 값은 1, 거짓 값은 0이다
  • Key Point
select 1 union select 1=1
select 1 union select 1