2021. 1. 14. 15:51ㆍ정보보안/웹 해킹
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'을 입력하게 되면 분명 다음과 같은 창이 출력될 것이다.
바로 위에서 살펴봤던 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로 만들기 위함)
[참고]
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 |