[Lord of SQL Injection] Gremlin 1단계
워게임 중 SQL INJECTION 관련 문제를 푸는 것입니다.
노말틱님이 추천해주신 워게임 중 하나입니다.던전의 몬스터를 점령(?)하는 문제인듯 합니다!!!
문제 하나 하나 코드를 확인해보고 답을 찾아가는 식으로 작성하였습니다.

0. Gremlin!
그렘린.... 하면 영화가 생각이 납니다.
어렸을 때 TV에서 나왔던... 착한 그렘린과 나쁜 그렘린이 대립하는 내용이였던 것 같은데.. ㅎㅎ
잡소리는 여기까지하고! 문제를 풀어보겠습니다.

1. 문제 - 01

처음 문제의 답을 기입하는 곳을 찾지못해 재부팅도 해보고 웹브라우저도 사파리에서 크롬으로 변경도 해보고 별짓을 다 해보았지만
문제 코드를 보니... GET 방식으로 URL을 전달한다는 점을 30분만에 알게 되었다....(사실 1시간.....바보인가 ㅠㅠ)

코드 분석
DB와 연결( $db = dbconnect();)하는 부분 아래부터 확인해보겠습니다.
if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~");로 작성되어 있습니다.
해당 문구는 필터링이라고 생각하면 됩니다.
preg_match($pattern, $subject, $matches)로 작성되며 위코드의 경우 해석해보면
/prob
_
.
(
)
id에서 5가지의 표현을 검색합니다. (TMI 검색 결과가 있다면 1, 없으면 0의 값을 반환)
GET 방식으로 id 값을 확인하여 매칭되는 데이터가 있으면 exit 한다는 의미입니다.(= 필터링)
그럼 사용가능한 방법은 무엇일까요?
기본적인 방법으로
#,' " 등이 있습니다.
그 다음줄은
$query = "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
SQL 쿼리문으로 식별/인증 동시하는 것으로 보입니다!!!!!
if($result['id']) solve("gremlin");
구문을 보면 id값이 존재하면 크렘린 문제는 풀리는 것을 알 수 있습니다.
※ admin과 같은 특정 아이디로 로그인하는 문제가 아닙니다.
그럼 아이디 부분'{$_GET[id]}' 에 구문을 맞춰 id' or 1 = 1 #을 사용하여 뒤 구문을 날려 주시면 됩니다.
$query = "select id from prob_gremlin where id=' ' or 1=1 #' and pw='{$_GET[pw]}'";
와 같은 구문으로 작성이 가능 합니다.
그럼 이제 URL에 ' or 1=1 # 을 넣어 주면 됩니다. 다만, url 인코딩하여 값을 작성해야합니다.
입력된 URL은
?id=%27%20or%201%3D1%20%23
[결과]

참조
- 노말틱 취업반 3기 수업 내용 및 보고서
- 정규 표현식의 개념(preg_match) http://www.tcpschool.com/php/php_regularExpression_concept
- URL Decoder/Encoder https://meyerweb.com/eric/tools/dencoder/