여러분 안녕하세요. POCI입니다.
이번 시간에는 Webhacking.kr의 2번 문제를 풀어보도록 하겠습니다.
1. 사이트 둘러보기
2번 문제에 들어가시면 'BEISTLAB FOR SECURITY'라는 사이트가 나옵니다.
한번 사이트의 목록들을 확인해보겠습니다.
글이 하나 올라와 있지만, 비밀번호를 입력해야 확인할 수 있습니다.
이렇게 메인화면까지 해서 7가지의 페이지가 있습니다.
여기서 한 가지 의심이 가는 건 비밀번호가 필요한 게시글입니다.
어떻게 해서 비밀번호를 얻어 게시글을 볼 수 있는지가 문제의 핵심인지 의심됩니다.
2. 소스코드 확인하기
사이트의 소스코드를 확인해보면 한 가지 특이한 게 있습니다.
map 태그는 이미지에 링크를 걸어둠으로써 이미지의 구역을 클릭하면 특정 url로 이동시키는 html 태그입니다.
여기서 중요한 것은 19줄의
<area shape="rect" coords="851,7,890,65" href="admin/" target="" alt="" />
입니다.
[851,7,890,65]의 구역을 클릭하면 admin/로 이동한다는 의미입니다.
그럼 [851,7,890,65]의 구역이 어디냐? 바로 화면 오른쪽 위에 있는 용의 머리입니다.
저 부분을 클릭하면 admin page라는 글자와 함께, 아이디를 입력하는 란이 나옵니다.
그럼 이제 저 아이디를 찾아내는 것도 하나의 문제라는 것을 알 수 있습니다.
또, 소스코드를 보시면 한 가지 이상한 것도 발견할 수 있습니다.
33줄의 시간을 나타내는 주석입니다. 왜 굳이 시간을 주석으로 처리했을까...... 의심이 됩니다.
3. 쿠킷값 확인하기
혹시나 싶으니 EditThisCookie로 쿠킷값을 확인해줍니다.
EditThisCookie의 설치법은 1강에 나와있으니 참고하세요.
Webhacking.kr 문제풀이_Part2_1번 문제 : https://poci.tistory.com/47
사이트의 쿠킷값이 PHPSESSID와 time 두 개입니다.
왜 쿠킷값의 이름이 time인지 의심이 갑니다. 위에서 봤던 시간이 표시된 주석과 연관이 있나 봅니다.
쿠킷값을 1로 바꾼 후 다시 소스코드를 확인해봅시다.
주석 부분의 시간이 바뀐 것을 확인할 수 있습니다.
이로써 time 쿠킷값과 주석 부분이 연관 있다는 것을 확인할 수 있습니다.
한번 쿠킷값에 다른 값도 넣어봅시다.
다른 수를 넣으면 초 부분이 쿠킷값의 수로 바뀐다는 것을 알 수 있습니다.
거짓을 의미하는 0도 한번 입력해봅시다.
0을 입력하면 주석이 사라지게 되어 확인이 불가합니다. 심지어 쿠킷값도 초기화됩니다.
아마 거짓일 때의 주석 부분을 일부러 안 보여주게 하려는 건가 봅니다.
그럼 거짓일 때의 주석 부분은 어떻게 알 수 있을까요?? 한번 SQL Injection 공격을 해보겠습니다.
SQL Injection 공격에 대한 설명은 아래 링크를 확인해주세요.
주석의 시간이 09:00:00으로 바뀐 걸 확인할 수 있습니다.
즉, time 쿠킷값이 참일 경우는 초 부분이 쿠킷값과 일치하게 되고, 거짓일 경우는 09:00:00으로 나오게 된다는 것을 알 수 있습니다.
4. Blind SQL Injection 공격
이처럼 SQL문에 대하여 참과 거짓의 대답이 있을 경우에는 Blind SQL Injection 공격을 할 수 있습니다.
Blind SQL Injection 공격에 대한 설명은 아래 링크를 참고해주세요.
비밀번호의 자릿수를 확인하는 SQL문을 입력해봅시다.
참고로 webhacking.kr 측에서 admin 페이지의 테이블명이 admin이라는 힌트를 줬습니다.
초 부분이 10인 걸로 보아 비밀번호는 10자리인 것을 알 수 있습니다. 그럼 이제 각 자리별로 무슨 단어가 들어가는지만 알면 됩니다.
이 사이트는 SQL문에 대한 응답을 숫자로만 하기 때문에 문자를 숫자로 표현한 아스키코드를 이용해야 합니다.
주석의 반환값이 48이니 password의 첫자리는 0인걸 알 수 있습니다.
아스키코드 표를 참고하세요. : https://ko.wikipedia.org/wiki/ASCII
이런 식으로 각 자리별로 어떤 문자가 들어가는지 알아내면 admin 페이지의 비밀번호를 알 수 있습니다.
(select ascii(substring(password, 2, 1)) from admin), (select ascii(substring(password, 3, 1)) from admin), ...
총 10번만 해보시면 됩니다.
분단위는 60으로 변환해서 보시면 됩니다. ex) 00:01:20 -> 80
비밀번호는 공개하지 않겠습니다. 직접 해보시길 바랍니다.
알아낸 비밀번호로 로그인을 하면 매뉴얼 패스워드를 알 수 있습니다.
BOARD에 올라온 게시물의 비밀번호인가 했는데 그건 아니더라고요.
게시물의 비밀번호를 알아내기 위해 다시 Blind SQL Injection 공격을 합시다.
게시물의 비밀번호가 있는 테이블명은 FreeB0aRd라는 힌트가 공개되었습니다.
아까와 같이 비밀번호의 자릿수를 알아낸 다음, 각 자리에 들어가는 단어를 조합하면 비밀번호를 알 수 있습니다.
알아낸 비밀번호를 입력해줍니다.
admin manual을 클릭하면 압축파일을 다운로드할 수 있습니다.
압축을 풀려면 또 패스워드가 필요합니다. admin 페이지에서 얻은 패스워드를 입력하면 압축을 해제할 수 있습니다.
압축을 해제하면 html 문서가 나오고, 문서를 열면 문제를 풀 키값을 얻을 수 있습니다.
Challenges 옆에 Auth를 클릭하면 키값을 입력하는 란이 나옵니다.
얻은 키값을 입력하면 문제가 풀렸다는 메시지가 나옵니다.
이번 강의는 여기까지입니다.
2번 문제는 좀 까다롭기는 했지만, 테이블명이 공개됨으로써 Blind SQL Injection 공격을 할 수 있다면 풀 수 있는 문제였다고 생각합니다.
오늘도 수고하셨습니다.
정리
- 소스코드를 확인하여 admin 페이지로 이동
- time 쿠킷값과 소스코드의 주석 처리된 시간을 확인해가며 Blind SQL Injection 공격을 수행해 admin의 비밀번호와 FreeB0aRd의 비밀번호를 획득
- BOARD에서 압축파일을 다운 후, admin 페이지에서 얻은 패스워드를 입력해 압축을 해제하여 키값을 획득
강의가 유익하셨거나 마음에 드셨으면 댓글과 좋아요 부탁드립니다.
궁금하신 점이나 질문은 댓글이나 메일 남겨주세요.
'Write Up > webhacking.kr' 카테고리의 다른 글
Webhacking.kr 문제풀이_Part6_5번 문제 (0) | 2019.07.04 |
---|---|
Webhacking.kr 문제풀이_Part5_4번 문제 (0) | 2019.07.02 |
Webhacking.kr 문제풀이_Part4_3번 문제 (2) | 2019.06.26 |
Webhacking.kr 문제풀이_Part2_1번 문제 (0) | 2019.06.16 |
Webhacking.kr 문제풀이_Part1_회원가입 (0) | 2019.06.15 |