본문 바로가기

챌린지/los.rubiya.kr

Lord of SQLInjection - gremlin

지난 글에서도 언급했지만 나는 웹, 특히 데이터베이스 부분에 대해서 많이 취약하기 때문에 이 부분에 대해 공부를 좀 할 필요가 있다. 그래서 인터넷에서도 이런저런 문서를 찾아보고 있긴 한데 얼마전 이 글을 읽고서 LoS, 즉 Lord of SQLInjection 문제를 풀면서 공부하기로 했다.

 

Webhacking Techtree – blog.rubiya.kr

2019년 중순 기준으로 해킹의 분야 중에서 수 년 째 포너블의 강세가 계속되고 있습니다. 그러나 실무에서는 웹해킹의 비중이 아직도 압도적으로 높습니다. 모의해킹 업무를 나가면 90%는 웹이고

blog.rubiya.kr

리버스 엔지니어링도 기초 지식을 공부한 후 워게임 문제를 풀면서 흥미를 가졌던 것처럼 SQL Injection도 문제를 풀어보면서 공부하면 효과가 더 좋을거라 생각해서 이렇게 문제를 풀게 되었다. Wargame.kr에도 SQL Injection 문제가 있긴 하지만 아직은 모르는 부분이 좀 많아서 단계별로 SQL Injection 문제만 제공되는 rubiya의 LoS를 먼저 시작하려고 한다.

그래서 첫 번째 문제인 gremlin이다. 지금은 풀었기 때문에 X 표시와 함께 취소선이 그어져 있다. 이 los는 다른 워게임들처럼 따로 설명은 제공되지 않고 문제를 클릭하면 웹 소스 코드와 우리가 입력한 값으로 생성된 쿼리가 어떤 식으로 처리되는지 그대로 보여주는 친절한 문제다. 그래서 이를 참고하며 해당 소스 코드의 검증 로직을 우회할 수 있는 SQL Query를 작성해야 한다.

query 부분에는 생성되어 웹 서버에서 요청되는 mysql query가 나타난다.

첫 번째 문제인 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__);
?>

제일 먼저 보이는 preg_match() 함수는 php에서 정규표현식 매칭을 수행하는 함수로 현재 문제와 상관없는 다른 테이블을 SQL Injection 하는 것을 방지하기 위한 구문이다. 간단히 해석해보자면 "prob"라는 문자열과 매칭되거나 '_'라는 문자와 매칭되거나 '.'라는 문자와 매칭되거나 "()"라는 문자열과 매칭될 경우 문제를 종료한다는 것이다. 테이블 이름이 문제마다 prob_gremlin, prob_cobolt 처럼 구성되어 있기 때문에 이에 대한 접근 시도를 방지하는 것 같다.

 

그렇다면 이 부분은 별로 신경 쓸 필요가 없고 그 아래를 살펴봐야 하는데 사실 사용자의 입력값을 거의 그대로 쿼리에 집어넣고 있기 때문에 SQL Injection의 대표적인 예시인 "' or '1'='1'--" 같은 쿼리를 조금만 변경해서 사용하면 된다. 일단 mysql에서 한 라인의 주석 처리는 '#' 문자를 사용하기 때문에 id 파라미터에 OR 연산으로 참 값을 만든 후 맨 마지막에 '#' 문자를 넣어보자.

확인해보니 '#' 문자는 쿼리에 아예 나타나지 않는데 해당 문자는 필터링되는 것 같다. 그렇다면 이를 URL Encoding으로 넣어보면 어떨까? '#'은 %23으로 인코딩된다.

어렵지 않게 클리어할 수 있었다.

 

 

기초 중의 기초인 맨 첫번째 문제기 때문에 별다른 지식 없이도 쉽게 풀 수 있었던 문제였다. 얼른 다음 문제를 풀어봐야겠다.

'챌린지 > los.rubiya.kr' 카테고리의 다른 글

Lord of SQLInjection - darkelf  (0) 2020.12.27
Lord of SQLInjection - wolfman  (0) 2020.12.22
Lord of SQLInjection - orc  (0) 2020.12.19
Lord of SQLInjection - goblin  (0) 2020.12.17
Lord of SQLInjection - cobolt  (0) 2020.12.16