webhacking.kr 45번

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
myoskin