klaus

[Lord of SQL Injection] Gremlin 1단계 본문

모의해킹/Wargame

[Lord of SQL Injection] Gremlin 1단계

klus! 2022. 11. 20. 15:47

워게임 중 SQL INJECTION 관련 문제를 푸는 것입니다.

노말틱님이 추천해주신 워게임 중 하나입니다.던전의 몬스터를 점령(?)하는 문제인듯 합니다!!!

문제 하나 하나 코드를 확인해보고 답을 찾아가는 식으로 작성하였습니다.

 

0. Gremlin!

그렘린.... 하면 영화가 생각이 납니다.

어렸을 때 TV에서 나왔던... 착한 그렘린과 나쁜 그렘린이 대립하는 내용이였던 것 같은데.. ㅎㅎ

잡소리는 여기까지하고! 문제를 풀어보겠습니다.

pixabay.com 그렘린!!

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/

 

Comments