지난 포스팅인 Lord of SQL Injection 사이트 소개에 이어서 해당 워게임 사이트의 첫번째 문제를 풀어보도록 하겠습니다. 첫번째 몬스터인 그램린을 클릭하자 다음과 같은 페이지가 나타나게 됩니다.


페이지에 나타난 부분은 php 소스코드입니다. 실제 웹사이트에서 php와 같은 서버사이드 언어의 소스코드를 획득할 수 있을 가능성은 매우 낮지만, 공부를 목적으로하는 워게임 사이트이다 보니 소스코드를 보여주고, SQL Injection을 이용하여 공격을 해 보라는 뜻입니다. solve("gremlin")이라는 함수를 실행시키도록 하면 문제가 풀릴 것으로 보입니다.


또 관찰해 보면 mysql_fetch_array라는 함수를 실행시키는 모습이 보입니다. 이것으로 보아서 서버는 MySQL DBMS를 사용한다는 것을 알 수 있습니다.


$query 부분에 SQL 쿼리를 생성시키는 모습입니다. 인자값으로 $_GET[id]와, $_GET[pw]의 값을 받습니다. 즉 $_GET[pw]는 사용자가 임의로 변경시킬 수 있는 입력값입니다. $query가 실행되었을 때, 만족되는 값이 하나라도 나타나면 성공입니다.


SQL Injection에 처음 입문 시 많이 사용하는 쿼리인 ' or 1=1 # 또는 ' or 1=1 -- 를 사용해 보겠습니다.


url에 맨 마지막 부분에 다음과 같이 추가적으로 입력한 뒤 엔터를 쳐 봅니다.


?id=%27%20or%201=1--%20a

HTTP GET 방식으로 쿼리 파라메터 id에 %27%20or%201=1--%20a라는 값을 넣어서 전송하겠다는 뜻입니다.


여기서 %27은 URL 인코딩이 된 값으로 ' 문자(싱글쿼터)를 뜻합니다.

F12를 눌러서 크롬 개발자도구를 띄운 뒤, Console 탭에 다음과 같이 입력해서 %27가 싱글쿼터가 맞음을 확인할 수 있습니다. 비슷한 원리로 encodeURI('\'')라고 입력하면 %27가 출력되게 됩니다.


쿼리가 위와 같이 변경되면서 클리어가 됩니다.


왜 이러한 SQL 구문을 통해서 클리어가 될 까요? Subline text에 해당 쿼리를 한번 그대로 입력해보겠습니다.

구문 강조(Syntax Highlighting)을 SQL로 설정한 뒤 해당 쿼리를 입력해 보니, -- 문자 이후는 회색처리가 되어있습니다. 즉 주석으로 인식한다는 뜻입니다.


MySQL에서 지원하는 SQL 문법에 대하여 정확하게 알아보려면 해당 공식 사이트의 레퍼런스 메뉴얼을 참조하는 것입니다.

https://dev.mysql.com/doc/refman/5.7/en/comments.html

위 링크는 MySQL에서 주석문에 대한 매뉴얼 페이지입니다.


MySQL에서 주석은 /* */으로 여러 줄 주석처리가 가능하며, #이나 -- 으로 한 줄 주석처리가 가능합니다. 이 때, -- 로 한 줄 주석처리를 할 경우 -- 이후 공백 문자 1칸이 반드시 필요합니다. 이렇게 뒷 부분이 주석처리가 되다 보니 where 구문은 id='' or 1=1으로 인식되는데, 1=1 구문때문에 항상 참 값을 갖게 되어서, 해당 테이블에 있는 모든 id값이 출력되게 됩니다.

+ Recent posts