소소한 IT이야기/WARGAME

[Lord of SQL Injection] hell_fire 23번 (feat. Time Blind SQLi)

Klaus 2023. 8. 7. 09:12

0. Start again

- 기존에 모의해킹 취업을 준비하면서 SQLi 공부에 도움을 받은 사이트이다. 이번엔 한 달 동안 [ALL CLEAR]

 

1. hell fire

[+] query : select id,email,score from prob_hell_fire where 1 order by

 

- 쿼리는 "prob_hell_fire" 테이블에서 "id", "email", "score" 열을 선택하고, "1" 조건으로 모든 레코드를 검색 후 정렬("order by") 

- 기존 문제와는 다르게 쿼리문의 ORDER BY절 사용

 

[+] MySQL의 ORDER BY 절 이해

- DB에서 가져온 결과를 열 기준으로 정리할 때 사용되며, 오름차순(ASC), 내림차순(DESC)으로 정렬

- 기본적으로 입력하지 않을 때, ASC로 사용

- 형태 

~~ order by [컬럼명];			  # DB의 결과를 특정 컬럼을 기준으로 정렬
~~ order by [컬럼명]='값';	     # DB의 조건에 맞는 값을 찾은 후 정렬

종합하면,order by [컬럼명]='값'; 은 주어진 [컬럼명]의 값이 [값]과 일치하는 행을 선택하고,
그 결과를 [컬럼명]을 기준으로 정렬하여 보여주는 기능을 수행합니다.
이를 통해 특정 조건을 만족하는 데이터를 원하는 순서대로 정렬된 형태로 검색 가능
즉, ORDER BY절을 논리적으로 맞게(틀리면 답이 없다...) 사용하여 답을 찾는 Blind SQL Injection!!!!

※ 아래 내용부터는 스포가 될 수 있다. 공부 목적이신 분은 블라인드 SQLi에 대해 스스로 해결!! 하시길~

 

2. code

 

[+] 전체 코드

더보기
<?php
  include "./config.php";
  login_chk();
  $db = dbconnect();
  if(preg_match('/prob|_|\.|proc|union/i', $_GET[order])) exit("No Hack ~_~");
  $query = "select id,email,score from prob_hell_fire where 1 order by {$_GET[order]}";
  echo "<table border=1><tr><th>id</th><th>email</th><th>score</th>";
  $rows = mysqli_query($db,$query);
  while(($result = mysqli_fetch_array($rows))){
    if($result['id'] == "admin") $result['email'] = "**************";
    echo "<tr><td>{$result[id]}</td><td>{$result[email]}</td><td>{$result[score]}</td></tr>";
  }
  echo "</table><hr>query : <strong>{$query}</strong><hr>";

  $_GET[email] = addslashes($_GET[email]);
  $query = "select email from prob_hell_fire where id='admin' and email='{$_GET[email]}'";
  $result = @mysqli_fetch_array(mysqli_query($db,$query));
  if(($result['email']) && ($result['email'] === $_GET['email'])) solve("hell_fire");
  highlight_file(__FILE__);
?>

[+] 필터링 (블랙리스트 기법) Preg_match 사용

- UNION SQLi 방지

 

[+] Solve 조건

- id : admin의 email을 찾기

URL ?order=1 입력시 확인 가능

 

3. Solve

 

[+] 페이로드 작성 및 조건 정리

- admin의 email의 찾는 문제

- email의 길이확인 및 한문자씩 출력하여 찾기

 

[+] 파이썬 코드

- email 길이 추측 : for i in range(100): 반복문을 사용하여 길이 추측

>  i 변수를 ~99까지 해당 범위의 길이로 웹 페이지의 응답 체크 (설마 그이상은 아니겠..)

> 만약 응답에 특정 문자열이 포함되면, 비밀번호 길이를 찾은 것으로 판단하고 반복문 종료

 

- 비밀번호 추측: for i in range(1, email+1): 비밀번호의 각 문자 추측

> 중첩된 반복문을 사용하여 ASCII Printable 문자들을 순회하면서 각 위치의 문자 추측

> 웹 페이지의 응답을 확인하고, 특정 조건이 충족되면 문자를 admin_email 변수 하나씩 추출