sql 인젝션을 활용한 문제겠구나.
기본 값으로 guest가 입력되어 있으므로 먼저 이상태로 제출을 눌러보겠다.
이렇게 출력된다. 다른 값을 입력해보니 Wrong이라고 출력됐다.
이제 소스를 살펴보자.
addslashes() : 함수는 백 슬래시를 추가하는 미리 정의 된 문자열 전에 반환.
작은 따옴표 ( ')
큰 따옴표 ( ")
백 슬래시 (\)
가 미리 정의되어 있다고 한다.
mb_convert_encoding() : 문자열을 세번째 인자 🡪 두번째 인자 인코딩 방식으로 바꿈
id의 값을 euc-kr인코딩에서 utf-8인코딩으로 바꿔준다.
admin, select, limit, pw, <, > 등이 필터링 되고 있다.
바로 직접 입력창에 admin이라고 입력해버리면 여기서 걸려서 오류가 날 것이다.
select id from chall45 where id=~ and pw=md5(~)이 보이는데 pw는 md5인코딩이 되어있다.
밑의 if문을 살펴보면 pw의 값은 잘 모르겠지만 id가 admin이면 풀리는거 같긴하다.
mb_convert_encoding()이 그냥 나와있는 함수가 아닐거라고 생각해 인코딩에 대해서 조금 더 적어보겠다.
SBCS : 한문자당 1byte, 문자열 끝마다 NULL, \x00이 반드시 존재한다. 아스키코드가 여기 해당
MBCS : 1byte로 표현 가능한 것은 SBCS로 인코딩하고 한글, 중국어 등과 같은 언어는 더블바이트로 표현한다. euc-kr이 여기 해당한다. 윈도우에서 많이 사용되는 인코딩이다.
WBCS : 모든 문자를 2byte로 표현한다. 유니코드, utf-8, utf-16등이 여기에 속한다.
euc-kr에서 utf-8로 변경되면 2byte씩 늘어나면서 문제가 발생한다.
예를들어 입력값으로 '가 전달되면
addslashes에서 \(역슬래쉬)'가 된다.
euc-kr에서 역슬래쉬는 1바이트이기 때문에 utf-8로 인코딩 될때 슬래쉬 앞에 %a1~%fe의 값이 있다면 함께 멀티바이트로 인식이 된다.
%aa'라는 글자가 입력되면 애드슬래쉬를 지나면 %aa\'가 될것이고 이는 컨버트함수를 지나면 *'로 변해버린다.
주입을 할 때 이런점을 신경써줘야 한다는 것을 기억하고 다시 소스를 살펴본다.
pw는 md5가 걸려있어 sql injection을 하기에 상당히 까다로워 보인다.
그래서 주입을 할 때 주석처리를 해줄 것이다.
sql문을 살펴보면
select id from chall45 where id='~으로 '으로 시작하기 때문에 주입할 때 닫는 '를 넣어줄 필요가 있다.
id에는 ' or id=(admin이 되는것) 이렇게 넣어야 하는데 그냥 admin을 넣으면 당연히 필터링이 되므로 안된다.
id 입력창에 시험삼아 %aa'를 입력하면 url에 다음과 같이 표시된다.
%가 %25로 '이 %27로 변해버렸음을 알 수 있다. 그래서 이와같은 변환을 막기 위해 바로 url을 수정하는 방법을 거칠 것이다.
admin을 헥사값으로 준비하면 0x61646D696E이다. 이걸 이용할 것이다.
%aa를 이용해 '를 닫아주고 id like admin#을 인코딩한 방식으로 입력해준다.
참고로 %23은 #을 아이디창에 입력했을때 자동으로 인코딩된 값이다.
풀렸다.
필터링 함수를 사용해도 소스코드가 그대로 노출된다면 해킹하기엔 쉽다는 것을 알 수 있는 문제다.
'문제풀이 > 보안 writeup' 카테고리의 다른 글
SuNiNaTaS(써니나타스) 7번 (0) | 2021.05.24 |
---|---|
webhacking.kr 39번 (0) | 2021.04.08 |
webhacking.kr 38번 (0) | 2021.04.08 |
webhacking.kr 7번 (0) | 2021.04.08 |
webhacking.kr 8번 (0) | 2021.03.19 |