본문 바로가기
Wargame/Lord of SQLInjection

[Lord of SQLInjection] Level01 write-up

by jjudy 2021. 10. 14.

LOS Level 01번 문제를 풀어보자.

 

gremlin 문제

 

 

 

 

풀이 과정

 

1.  $_GET[id]$_GET[pw] 를 통해 id와 pw를 사용자 입력값으로 받고 있다.

 

 

 

 

2.  preg_match() 함수는 $_GET[id]$_GET[pw]로부터 입력받은 값에서 'prob', '_', '.', '\' 값이 있을 시 No Hack~_~ 화면으로 넘어가게 된다. 그러므로 필터링되는 값을 우회해서 공격해야 한다.

 

문제에서 입력값을 GET 방식으로 받는다.  GET 방식으로 받게 되면 URL에 입력값이 그대로 노출된다.

→  그래서 GET 방식은 입력값에 대해 보안이 필요없거나 빠르게 전송 시 사용한다.

if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~"); 
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");

 

 

 

정규 표현식(regular expression)이란?

 

문자열에서 특정한 규칙을 가지는 문자열의 집합을 찾아내기 위한 검색 패턴이다.

 

 

 

preg_match() 함수?

 

php 에서 자주 사용하는 함수로,  해당 문자열에서 전달받은 정규 표현식과 일치하는 패턴을 검색한다.

 

preg_match($pattern, $subject, $matches);

첫 번째 인수 : 정규표현식 작성

                   '/admin/'i   이렇게 i가 붙는 경우 대소문자를 구분하지 않는다는 뜻

두 번째 인수 : 검색 대상 문자열

세 번재 인수 : 패턴 매치에서 매칭된 값을 배열로 저장. 매칭 성공 시 1, 실패 시 0이 반환

 

 

 

 

3. 다음 문장은 입력받은 id와 pw를 값을 찾아서 $query 변수에 저장하는 쿼리문이다.

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

 

 

 

 

4. 값을 찾은 쿼리문을 출력하고, $result['id']에 값이 있으면 문제를 풀 수 있다.

 echo "<hr>query : <strong>{$query}</strong><hr><br>";
 $result = @mysqli_fetch_array(mysqli_query($db,$query));
 if($result['id']) solve("gremlin");

 

 

 

 

풀이

 

값을 넣을 때는 URL 끝에 ?id = 값&pw=값 이런 식으로 넣어주면 된다.

 

id를 사용자 입력값으로 받으므로, 어떤 값을 넣어 거짓으로 만들어주고 뒷부분을 참으로 만들어준다.

쿼리문을 select id from prob_gremlin where id='' or 1=1-- ' and pw='' 이렇게 해준다.

where id='' 는 거짓(아무값을 넣어줘도 된다) 이 되고, or 1=1 은 무조건 참이 되고, 뒷 부분(pw)은 -- 주석처리를 해줌으로써

$query는 참이 되므로 문제가 풀린다.

 

https://los.rubiya.kr/chall/gremlin_280c5552de8b681110e9287421b834fd.php?id=' or 1=1--%20

 

 

 

 

GREMLIN Clear!가 뜨게 된다.

 

 

 

 

알게된 점

주석 처리시, or 1=1 -- 띄어쓰기를 무조건 해줘야하는데 URL에서 공백이 먹히지 않을 때는 공백을 인코딩된 값인 %20으로 입력해주면 된다.

 

 

 

 

문제 풀이 사이트

https://los.rubiya.kr/

 

댓글