LOS(The Lord of the SQLI) 3 - GOBLIN

2021. 1. 14. 15:51정보보안/웹 해킹

 

3번 문제 GOBLIN

3번 문제인 GOBLIN의 경우 필터식이 살짝 달라졌다.

if(preg_match('/\'|\"|\'/i', $_GET[no])) exit("No Quotes ~_~"); 를 통해

싱궐쿼터 혹은 더블쿼터가 no 파라미터에 입력될 경우 종료시켜버리는것을 확인할 수 있다.

 

문제를 풀기 위해선,

if($result['id'] == 'admin')을 참으로 만들어야 하는데

현재 쿼리를 확인해보면 id가 'guest'로 하드코딩되어 있으므로 이를 우회해야한다

 

 

id 파라미터에 하드코딩되어있는 'guest'를 없애고

id 파라미터를 'admin'으로 바꾸기 위한 파라미터 값은 다음과 같다.

 

 

select id from prob_goblin where id='guest' and no= or id='admin' 

no는 숫자파라미터로 예상이 되어 싱글쿼터가 필요 없고,

and 연산자와 or 연산자가 있을 때 우선순위는 and 연산자가 높으므로 and 연산을 먼저 수행하면

id='guest' and no = (공백) 은 False가 된다.

그 후 False or id='admin' 을 통해 id에는 'admin'이라는 값이 존재하므로 True,

즉 False or True의 결과는 True가 나오게 된다.

하지만 or id='admin'을 입력하게 되면 분명 다음과 같은 창이 출력될 것이다.

 

No Quotes ~_~

 

바로 위에서 살펴봤던 preg_match 함수에 의한 싱글쿼터 필터식 때문인데,

문자열 id 파라미터에 'admin' 을 입력했기 때문에 문제가 발생한다.

이를 우회하기 위해선 싱글쿼터가 아닌 다른 방식으로 문자열 admin을 만들어야 되는데

바로 떠오르는 방법은 hex값을 이용하거나 char 함수를 이용하는 방법이다.

 

나는 그 중에서도 char 함수를 이용해 문제를 해결하였다.

char(97,100,109,105,110) 은 'admin'과 동일하다는 점을 이용해

 

no=-1 or id=char(97,100,109,105,110)을 입력하면 정상적으로 문제가 해결되는것을 확인할 수 있다.

(no=-1은 앞의 id='guest'와 and연산을 통해 False로 만들기 위함)

 

 

3번 문제 GOBLIN Clear!

 

[참고]

hex값을 이용할 수도 있는데,

0x61646d696e가 'admin'과 동일하다는 점을 이용해

no=-1 or id=0x61646d696e 을 입력하는 경우에도 문제를 해결할 수 있다.

 

'정보보안 > 웹 해킹' 카테고리의 다른 글

LOS(The Lord of the SQLI) 5 - WOLFMAN  (0) 2021.01.16
LOS(The Lord of the SQLI) 4 - ORC  (0) 2021.01.14
LOS(The Lord of the SQLI ) 1 - GREMLIN  (0) 2021.01.14
SQLMAP  (0) 2021.01.04
Arachni(무료 웹 취약점 진단 툴)  (0) 2020.12.29