여러분 안녕하세요. 세이버입니다.
이번 강에서는 Webhacking.kr Challenge old 2번 문제를 풀어보겠습니다.
과거의 2번 문제와 비슷한 유형이니 기존의 강의를 보고 오셔도 푸실 수 있습니다.
Webhacking.kr 문제풀이_Part3_2번 문제 : https://poci.tistory.com/54
1. 문제 파악하기
2번 문제를 클릭합니다.
데이터베이스 마크가 있는 걸로 보아 데이터베이스와 관련된 문제인 거 같습니다.
2번을 클릭하면 'Restricted area'라는 제목과 글이 적혀있는 창으로 이동합니다.
클릭되는 것도 없고, 더 이상 확인할 것도 없으니 페이지의 소스코드를 확인해봅시다.
4줄의 간단한 코드가 쓰여있습니다.
마지막에 주석으로 써인 if you access admin.php i will kick your ass가 저를 흥분시키네요.
(전 그런 취향이 아니에요...)
admin.php로 이동하면 비밀번호를 입력하는 창이 나옵니다.
지금은 비밀번호를 모르니 일단 패스합시다.
이제 남은 단서는 주석에 적힌 시간입니다. 하지만 시간으로 뭐 어쩌라는건지 모르겠습니다.
2. 쿠킷값 알아보기
단서를 찾기 위해 EditThisCookie를 이용해서 쿠키의 값을 확인해봅시다.
EditThisCookie의 다운법과 사용법은 1번 문제풀이를 참고하세요.
Webhacking.kr Challenge(old)_1번문제 : https://poci.tistory.com/98
쿠킷값을 확인하니 time 쿠키가 있습니다.
이걸 보고 주석에 적힌 시간이 중요한 키워드라는 걸 알 수 있습니다.
그래서 값을 1로 바꿔보았습니다. 그랬더니 주석 부분의 시간이 바뀐 걸 확인할 수 있습니다.
2를 입력해보았습니다.
시간의 초 부분이 2로 바뀌었습니다.
자연수는 참이라는 의미이기에 참인 값을 입력하면 시간의 초 부분이 입력한 값으로 바뀌는 것을 알 수 있습니다.
거짓을 의미하는 0도 한번 입력해봅시다.
0을 입력하면 엉뚱한 코드가 나와서 시간 확인이 불가능합니다. 심지어 쿠킷값도 초기화됩니다.
아마 거짓일 때의 주석 부분을 일부러 안 보여주게 하려는건가 봅니다.
그럼 거짓일 때의 주석 부분은 어떻게 알 수 있을까요?? 한번 SQL Injection 공격을 해보겠습니다.
SQL Injection 공격에 대한 설명은 아래 링크를 확인해주세요.
SQL 공격으로 거짓인 구문을 입력하면 초부분이 0으로 출력됩니다.
즉, time 쿠킷값이 참일 경우는 초 부분이 쿠킷값과 일치하게 되고, 거짓일 경우는 09:00:00으로 나오게 된다는 것을 알 수 있습니다.
3. Blind SQL Injection 공격
이처럼 SQL문에 대하여 참과 거짓의 대답이 있을 경우에는 Blind SQL Injection 공격을 할 수 있습니다.
Blind SQL Injection 공격에 대한 설명은 아래 링크를 참고해주세요.
예전 사이트의 2번 문제는 힌트로 DB명과 테이블명을 알려줬었는데, 이번 사이트에서는 안 알려줬더라고요...
그래서 정공법으로 해봤습니다.
먼저 테이블의 이름을 알아야 합니다.
select count(table_name) from information_schema.tables where table_schema=database()
이 SQL문은 현재 위치한 데이터베이스의 테이블의 수를 검색하는 구문입니다.
09:00:02가 나온 걸로 보아 테이블의 개수가 2개임을 알 수 있습니다.
그럼 이제 테이블의 이름을 알아보죠
select length(table_name) from information_schema.tables where table_schema=database() limit 0, 1
이 SQL문은 현재 위치한 데이터베이스의 테이블 중 첫 번째 테이블명의 길이를 검색하는 구문입니다.
첫 번째 테이블은 13자리임을 알 수 있습니다.
이제 여러분은 선택하셔야 합니다.
노가다로 한 글자씩 검색을 할 건지, 파이썬으로 웹크롤링을 할 건지
저는 웹크롤링 코드까지 썼지만... 네트워크 오류로 결국 노가다를 했습니다.
select ascii(substring(table_name, 1, 1)) from information_schema.tables where table_schema=database() limit 0,1
이 SQL문은 현재 위치한 데이터베이스의 테이블 중 첫 번째 테이블명의 첫 번째 단어를 아스키코드로 출력하는 구문입니다.
1분 37초는 97초입니다. 즉, 아스키코드가 97인 'a'가 첫번째 단어입니다.
그다음에는 select ascii(substring(table_name, 2, 1)) from information_schema.tableswhere table_schema=database() limit 0,1을 입력해서 두 번째 단어를 알아냅니다.
100초가 나왔으니 아스키코드가 100인 'd'가 두 번째 단어입니다.
이런 방법으로 13번째 단어까지 모두 알아내시면 됩니다.
여러분들이 직접 하시라는 의미로 테이블명은 공개하지 않겠습니다.
select length(table_name) from information_schema.tables where table_schema=database() limit 1, 1
이 SQL 구문을 입력하면 두 번째 테이블명의 길이가 나옵니다.
다행히 3글자로 짧은 편이네요.
select ascii(substring(table_name, 1, 1)) from information_schema.tableswhere table_schema=database() limit 1,1 (첫 번째 단어 검색)
select ascii(substring(table_name, 2, 1)) from information_schema.tableswhere table_schema=database() limit 1,1 (두 번째 단어 검색)
이렇게 한 단어씩 검색하시면 테이블명을 알 수 있습니다.
너무 노가다가 길어져서 이번 강의는 여기까지 하고 다음 강의에서 이어가도록 하겠습니다.
크롤링 코드는 직접 만들어 보심을 추천드립니다.
이번 강의는 여기까지입니다.
오늘도 수고하셨습니다.
정리
- EditThisCookie를 이용하여 쿠킷값을 변조해서 Blind SQL injeciton을 수행한다.
강의가 유익하셨거나 마음에 드셨으면 구독과 좋아요, 댓글 부탁드립니다.
궁금하신 점이나 질문은 댓글이나 메일 남겨주세요.
'Write Up > webhacking.kr_old' 카테고리의 다른 글
Webhacking.kr Challenge(old)_5번문제 (2) | 2020.01.13 |
---|---|
Webhacking.kr Challenge(old)_4번문제 (10) | 2019.12.05 |
Webhacking.kr Challenge(old)_3번문제 (0) | 2019.11.30 |
Webhacking.kr Challenge(old)_2번문제_part2 (0) | 2019.11.24 |
Webhacking.kr Challenge(old)_1번문제 (0) | 2019.11.10 |