chipkkang9's story

[Webhacking.kr] challenge old-02 문제 write-up 본문

CTF/Web

[Webhacking.kr] challenge old-02 문제 write-up

chipkkang 2022. 3. 9. 04:18

문제소개


[Webhacking.kr] challenge old-02 문제

 

문제풀이


Webhacking.kr 2번 문제이다.

 

IP Logger 문제? 라고 생각되는데 IP Logger가 뭔지 몰라서

일단 관리자 도구를 열어보았다.

 

관리자 도구 Elements를 열어본 화면

 

환경분석


아무래도 힌트가 될만한 건,

주석으로 표시된 시간과 admin.php 페이지이다.

 

표시된 시간은 이 문제를 풀고있는 당시의 시간을 의미한다.

일반적인 코드의 형태는 아니다보니 무언가 힌트가 될 것 같다.

 

또한, 주석은 admin.php에 접속하면 예뻐해주겠다(♡)는 의미이다.

이쁨받기 위해 일단은 admin.php에 접속해보자.

 

admin.php에 접속한 화면

 

secret password를 입력하는 창이 뜬다.

 

음... 이 창은 관리자 도구를 열어도 특이한 점이 보이지 않아서 생각해 본 것은,

FLAG 비슷한 것을 이전 페이지에서 알아내고

해당 페이지에 파라미터 값으로 넣어주면 된다고 생각된다.

 

그렇다면, 이전 페이지에서 조작할만한 거리를 생각해보자.

이전 페이지의 쿠키값들을 보면 'time'이라는 생소한 쿠키값이 들어있는 것을 확인할 수 있다.

 

time 쿠키값

 

1646148604 이 값이 무슨 값일까... 고민해보았다.

그래서 일단은 time에 1을 넣어 변조해주고 새로고침한 뒤 변화를 살펴보았다.

 

time에 1을 넣은 후 변화

 

이 변화를 통해 여러 고민을 해본 결과 짐작되는 점이 하나 있다.

 

지금까지 특성들을 바탕으로 판단해보면 가능할 법한 공격 방법이

우선 찾고자하는 패스워드가 있고,

그 패드워드가 웹 어딘가에 아마도 문자열 형태로 저장되어 있으며,

원하는 문자열을 저렇게 하나하나 알 수 있을 법한

 

Blind SQL Injection

일 가능성이 가장 크다고 보았다.

 

 

익스플로잇


 

쿠키값을 통하여 SQL Injection을 진행할 때에는

소괄호 안에 묶어서 명령 구문을 주입해준다.

 

우선 패스워드를 알려면 패스워드가 저장되어 있는

데이터베이스 테이블에 대하여 알아보아야 한다.

 

우선 테이블이 몇 개인지를 알아보아야 한다.

 

 

1. 테이블 수 추출

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

*information_schema.tables: 데이터베이스에 있는 모든 정보를 가지고 있는 테이블

 

 

위는 해당 페이지의 서버 속에 있는 데이터베이스의 테이블을 추출하는 명령어이다.

 

 

쿠키값을 보내준 후, 새로고침 해보니 '13'이라는 값이 추출되는 것을 확인할 수 있다.

그러면, Blind SQL Injection이라는 것이 확실해졌다.

 

그럼 이 이후는 파이썬으로 페이로드를 작성해서 공격을 시도해보겠다.

 

테이블 길이 추출 소스코드

지금까지 실행한 과정을 페이로드를 작성하면 위와 같다.

아래는 위 코드의 실행 결과이다.

 

테이블 길이 코드의 추출 결과

 

2. 테이블 이름 추출

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

 

테이블 이름 추출 소스코드

 

그 다음에는 테이블의 이름을 추출하는 구문이다.

처음부터 한글자 한글자씩 for문을 돌려가면서 올바른 값을 추출해내는 코드이다.

 

테이블의 이름을 추출하는 이유는

테이블 안에 존재하는 패스워드를 찾아서 추출해야 하기 때문이다.

 

테이블의 이름은 SQL 구문을 작성해주기 위해서 필요하다.

 

위 소스코드까지의 출력은 다음과 같다.

 

테이블 이름의 추출 결과

 

테이블 이름은 "admin_area_pw"이다.

 

 

3. admin_area_pw 테이블의 길이 추출

: (select length(table_name) from table_name)

 

admin_area_pw 테이블의 길이 추출 코드

 

테이블에 존재하는 문자열이 pw가 아닌 것이 있을 수 있겠지만

최대 password의 길이를 조회할 수 있는 코드를 작성했다.

 

위 까지의 결과는 다음과 같다.

 

admin_area_pw 테이블 길이의 추출 결과

 

4. column_name으로 password 변수 이름 알아내기

: (select length(column name) from information_schema.columns where table_name='table_name')

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

 

column_name을 알아내고 password 값이 저장되어 있는 데이터 추출하는 코드

 

생각해보니, 내 블로그에서 언급한 적이 없는 것 같다.

테이블은 다른 말로 '표'와 같아서, row(행)과 column(열)이 존재한다고 말할 수 있다.

 

데이터베이스의 안에는 어떤 값이 들어가있는지 확인할 수 있다.

column 값들을 조회하면, password와 관련되어있는 데이터가 얼마나 있는지 확인할 수도 있을 것이다.

 

위 소스코드까지를 실행한 결과는 아래와 같다.

 

password 값이 저장되어 있는 데이터

 

password가 저장되어 있는 column의 이름은 pw임을 알 수 있다.

 

 

5. column pw에 들어있는 값 추출하기

: (select ascii(substring(column_name, {}, 1)) from table_name)

 

column pw에 들어있는 값을 추출할 수 있는 코드

 

pw 값을 추출할 수 있는 코드이다.

동작 방식은 위에서 설명한 방법과 같다.

 

위 소스코드까지를 실행한 결과는 아래와 같다.

 

pw 값이 저장되어 있는 데이터

 

 

마무리

 

나온 패스워드는 kudos_to_beistlab이다.

 

해당 키를 넣어주면 예쁘게 문제가 풀리는 것을 확인할 수 있다.

상당히 어려운 문제였다.

어떻게 풀어야 할지는 알겠는데, 어떻게 풀어야 할지 모르겠는 문제였다...

 

 

출처


https://ehdtn1219.tistory.com/4

 

Webhacking.kr 2번 문제풀이

문제의 페이지 소스를 보시면 힌트를 얻을 수 있는 단서를 찾을 수 있습니다. 1번 힌트 : 시간 2번 힌트 : admin.php가 존재 힌트를 활용하기 위해 EditThisCookie를 이용하여 쿠키값을 확인해본 결과 쿠

ehdtn1219.tistory.com

 

'CTF > Web' 카테고리의 다른 글

[Webhacking.kr] challenge old-01 문제 write-up  (0) 2022.03.01
[HackCTF] 보물 문제 write-up  (0) 2022.02.10
[HackCTF] Button 문제 write-up  (0) 2022.02.09
[HackCTF] Hidden 문제 write-up  (0) 2022.02.09
[HackCTF] / 문제 write-up  (0) 2022.02.09
Comments