본문 바로가기

LOS 풀이

[Lord Of SQL injection] LOS 1단계 - Gremlin 코드 분석 및 문제풀이

최근에 LOS라는 것을 하루에 한 문제씩 풀기 시작했다.

LOS란 Lord Of SQL injection의 약자로 SQL injection에 초점을 둔 wargame 사이트다.

 

LOS링크 : https://los.eagle-jump.org/

 

1단계는 Gremlin이다.

대충 이렇게 생겼다.

 

↓답 보기 링크

더보기

기본적으로 ?를 이용해 GET방식 파라미터들을 받아온다.

'or 1=1은 SQL Injection에서 가장 기본이 되는 인증 우회 방법이라고 할 수 있다.

 

'을 사용해 쿼리문을 닫아주고 OR논리 연산을 진행한다.

 

OR논리 연산자는 AND논리 연산자보다 우선순위가 빨라 먼저 실행된다.

 

그다음 쿼리결과를 항상 참으로 만들고 기존 코드의 뒷부분을 주석을 이용해 주석 처리한다.

 

이 문제에서는 MySQL을 사용하였으므로 MySQL주석인 #을 사용한다.

 

특수문자는 URL인코딩한 값을 사용한다.

 

# = %23 " "(공백) = %20 ' = %27

Glemlin CLEAR!

 

오늘 우리가 풀 Gremlin문제 코드이다.

<Gremlin단계 문제 코드>

코드를 해석해보자. 

 

3번째 코드까지는 딱히 알 필요가 없어 보이니(쉬워 보이니) 4번째 코드부터 해석하겠다.

 

먼저 preg_match()함수가 눈에 띈다.


preg_match 함수는 문자열을 찾는 함수

preg_match(인자1, 인자2)라는 형식을 가질 때 인자2를 인자1에 매치시킨다.


그 결과가 매치가 된다면 exit를 통해 No Hack ~_~ 이라는 문구와 함께 종료된다.

<No Hack ~_~ 문구가 뜬 화면>

코드와 코드에 대한 주석으로 봤을 때 데이터베이스 내의 테이블을 이용한 쿼리 공격을 막기 위한 코드로 보인다.

그 외에도 ".", "\", i에 대한 매치가 이루어진다.

여기서 i는 차후에 다룰 내용이지만 간단하게 설명하자면 대소문자를 구분하지 않는다는 뜻이다.

 

다음 코드를 살펴보자.

 

Select : 검색, 열

From : 테이블

Where : 조건

 

prob_gremin테이블의 id컬럼에서 GET방식으로 받아온 id와 pw파라미터를 검색하는 쿼리문을 query라는 변수에 담겠다는 코드다.

 

 

echo 출력을 의미한다. 참고로 echo는 함수로 취급되지 않는다.

 

echo에 의한 출력

이어서 사용된 태그에 대한 설명이다. 그리 어렵지 않으니 간단히 설명하겠다.

<hr>태그 : 수평선 출력

<strong>태그 : 텍스트 강조

<br>태그 : 줄 개행

 

mysql_fetch_array() 함수가 눈에 띈다.


mysql_fetch_array()함수는 결과를 배열로 저장하는 함수

위의 코드 형식은 mysql_fetch_array(쿼리 실행 명령어(쿼리문))과 같다.


쿼리문은 $query변수에 저장된 쿼리문을 말한다.

 

추가로 위의 코드로 Mysql를 사용한다는 것을 알 수 있는데

Mysql은 #을 주석으로 사용하고

MSSQL은 --을 주석으로 사용한다.

SQL Injection 공격에서 주석은 매우 중요하다고 생각한다.


MySQL 주석 : #

MSSQL 주석 : --


 

드디어 마지막 코드다.

 

mysql_fetch_array()함수 실행의 결과로 얻은 배열 id가 존재하면 gremlin이 해결된다는 코드다.

쿼리에 대한 실행만을 성공시키면 해결할 수 있는 구조로 보인다.

 

이번 문제는 아주 손쉽게 풀 수 있는 문제다.

첫 스테이지라서 코드 분석까지 진행해 보았지만 다음 스테이지부터는 기본적인 코드 분석 없이 진행할 예정이다.

 

##

문제를 풀다 보면 막히는 것은 당연한 것이다.

여기서 중요한 것은 문제가 막히더라도 답을 보지 말고 조금이라도 생각해보는 것이다.

문제의 의도라던지 현재 무엇 때문에 막힌 것일까?를 고민해보는 습관을 들여야 한다는 말이다.

반응형