LOS - gremlin 해설

2020. 3. 16. 20:49문제연습/LordOfSql(LOS)

반응형

 

티스토리 블로그는 PC 환경에 최적화되어 있습니다.

모바일 유저분들은 아래 네이버 블로그를 이용해 주세요.

 

LOS - gremlin 해설

네이버 블로그는 모바일 환경에 최적화되어 있습니다.PC 유저분들은 아래 티스토리 블로그를 이용해 주세...

blog.naver.com

 

안녕하세요, ICMP입니다.

이번 시간에는 웹 해킹 워게임 사이트인 LOS 문제를 풀어보도록 하겠습니다.

 

아래 링크로 접속하신 후 회원가입하고 바로 gremlin 사진을 누르면 문제를 바로 푸실 수 있습니다.

 

Lord of SQLInjection

 

los.rubiya.kr

바로 문제를 보도록 하겠습니다.

(참고로 https://los.eagle-jump.org/gate.php이 사이트의 상위 버전입니다. 서로 다른 사이트입니다.)

 

문제 내용

아래 php 코드를 해석하고 SQl injection 취약점을 이용하여 로그인을 시켜야 합니다.

 

들어가기 전

What is SQL?, Injection???

 

SQL???

SQL은관계형 데이터베이스 관리 시스템(RDBMS)의 데이터를 관리하기 위해 설계된 특수 목적의프로그래밍 언어이다.

관계형 데이터베이스 관리 시스템에서 자료의 검색과 관리,데이터베이스 스키마생성과 수정, 데이터베이스 객체 접근 조정 관리를 위해 고안되었다. 많은 수의 데이터베이스 관련 프로그램들이 SQL을 표준으로 채택하고 있다. (위키 백과)

 

SQL Injection???

SQL 삽입(영어:SQL Injection, SQL 인젝션, SQL 주입)은 응용 프로그램 보안 상의 허점을 의도적으로 이용해, 악의적인SQL 문을실행되게 함으로써 데이터베이스를 비정상적으로 조작하는코드 인젝션공격 방법이다. (위키 백과)

SQL과 같은 인터프리터를 사용하는 언어 계열은 공격자의 입력 필터가 없이 바로 인터프리터에 들어가 실행되는 취약점입니다.

 

특히 인젝션 취약점은 웹 TOP10 취약점에 계속 선정될 정도로 정말 위험한 문제입니다.

 

문제 해설

일단 아래 php 코드를 읽어보도록 하겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
<?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__);
?>
 
 

요약하면, 사용자로부터 id, pw를 입력받아 로그인 시키는 기능인 듯합니다.

 

 

1
2
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 ~_~");
 

위 코드는 GET 함수를 통해 입력받은 id, pw의 문자열 검사하는 부분입니다.

GET 함수는 action에 명시된 URL의 주소 뒤에?를 붙이고 변수가 여러 개일 경우에는 &로 구분하여 입력합니다.

 

이렇게 입력받은 id와 pw는preg_match라는 함수를 통해 문자열 필터링을 합니다.

(탐지하는 문자는 [prob | _ | . | \]입니다.)

 

만약 필터에 걸리는 문자를 id 또는 pw에 넘기면 if 문 조건이 만족되어 문자열이 출력되고 바로 exit 함수를 호출합니다. (아래 사진처럼 말이죠.)

 

계속해서 코드를 해석하도록 하겠습니다.

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

query라는 변수에 select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'문자열을 저장합니다. (쿼리 문에 대한 설명은 후술하도록 하겠습니다.)

 

 

1
echo "<hr>query : <strong>{$query}</strong><hr><br>";
 

echo를 이용화 화면에 query 변수의 내용을 출력하는 구문입니다.

화면에서 query : ~~를 출력하는 부분이 바로 이 코드 때문입니다.

 

 

1
2
$result = @mysqli_fetch_array(mysqli_query($db,$query));
  if($result['id']) solve("gremlin");
 

result라는 변수에 @mysqli_fetch_array(mysqli_query($db,$query)) 값을 저장하고 있습니다.

 

mysqli_query() : (아래 링크를 참고해 주세요.)

 

PHP MySQL 쿼리 실행하기(mysqli_query)

- PHP mysqli_query 란? mysqli_query 함수는 mysqli_connect 를 통해 연결된 객체를 이용하여 MySQ...

blog.naver.com

함수의 리턴값은 아래와 같습니다.

Return Values

 

Returns FALSE on failure.

For successful SELECT, SHOW, DESCRIBE or EXPLAIN queries mysqli_query() will return a mysqli_result object.

For other successful queries mysqli_query() will return TRUE.

 

@mysqli_fetch_array : (아래 링크를 참고해 주세요.)

 

PHP MySQL 레코드 가져오기 (mysqli_fetch_array)

- PHP mysqli_fetch_array 란? mysqli_fetch_array 함수는 mysqli_query 를 통해 얻은 리절트 셋(result...

blog.naver.com

result 변수에 함수 결괏값을 저장하고, result에 연관 배열의 결괏값을 찾아 TRUE 값이 나와야 로그인 처리가 됩니다.

 

현재 우리가 알고 있는 정보를 다시 정리해보도록 하겠습니다.

1. 문자 필터링 : . prob \ _

2. id, pw를 입력받음

3. 현재 DB의 이름, pw, id를 모름.

 

그러면 2가지 방법이 있습니다.

1. DB 이름을 알아낸 후 전수조사를 통해 id, pw를 알아낸다.

2. pw, id의 조건 검사 부분을 무조건 논리적 참의 값을 반환하도록 하여 로그인 되도록 한다.

 

현재 제가 php, DB에 대한 문법을 많이 모르므로 2번 방식을 이용하도록 하겠습니다.

 

아까 query 변수에 "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'"가 저장되어 있었습니다.

 

만약 제가 id와 pw에 아무런 값을 입력하고 그 뒤에 논리적 참을 만들어 주는 구문을 삽입해 주면 어떨까요?

아래 제가 작성한 인젝션 공격입니다.

(물론 인젝션 방식은 정말 다양합니다. 이 방식 말고도 주석을 이용해도 가능합니다.)

 

이렇게 입력하면 최종적으로 논리적 참(true) 값이 반환되기에 로그인이 될 것입니다.

 

브라우저 상단에 다음과 같이 입력하면 로그인이 됩니다.

?id=ICMP&pw=Hahaha!!!%27or%271%27=%271

(%~~은 브라우저의 Encoding에 의한 것입니다. 정확한 내용은 아래 링크를 참고해 주세요.)

 

HTML Encoding Reference - krypted

URL-encoding : ASCII Character %20 : space %21 : ! %22 : “ %23 : # %24 : $ %25 : % %26 : & %27 : ‘ %28 : ( %29 : ) %2A : * %2B : + %2C : , %2D : – %2E : . %2F : / %30 : 0 … Continue reading HTML Encoding Reference

krypted.com

 

gremlin 클리어!!!

다음 시간에는 cobolt 문제를 풀어보도록 하겠습니다.

이상 ICMP였습니다!!!

 

반응형

'문제연습 > LordOfSql(LOS)' 카테고리의 다른 글

LOS - goblin 해설  (0) 2020.03.21
LOS - cobolt 해설  (0) 2020.03.17