웹/webhacking.kr

webhacking.kr 2번

최경환의 해킹공부 2021. 2. 22. 11:35

일단 2번을 들어가면 이런 화면이 뜹니다. 이 화면에서는 무엇을 해야 할 지 모르기 때문에 일단 소스코드를 살펴보겠습니다.

소스 코드에 이런 부분이 있어서 일단 아래의 url로 들어가보았습니다.

들어가보니 비밀번호를 입력하라는 이름이 뜹니다. 아무래도 정확한 비밀번호를 알아내야 할 것 같습니다. 다시 원래 사이트로 돌아가서

쿠키값부터 확인했더니 time이라는 값이 존재해서 100이란 값으로 일단 바꿔 보았습니다.

 

그랬더니 시간이 현재 시각에서 1:40으로 바꿔었습니다. 아마 time이라는 쿠키 값에 따라 다르게 뜨는 것 같아서 여러가지 값이나 조건 문 등을 넣어보았습니다.

위의 값 외에도 여러 가지 값을 넣어본 결과, 조건문이 time의 값일 경우 참일 경우 1, 거짓일 경우 0을 반환하는 것 같고, 만약 정확한 값이 있으면 그 값을 시, 분, 초 형태의 시간의 형태로 보여주는 것 같습니다.

그래서 sfw5때 공부했던 information schema에서 썼던 database()함수를 통하여 database의 길이를 구했습니다. 나중에 안 사실이지만 length(database())를 넣어주면 길이가 바로 반환됩니다. 여기서 db이름부터 알아내야하는 이유는 information schema 문제를 풀 때처럼 db에 관한 아무 정보가 없기 때문에 처음 db이름부터 알아내는 것입니다. 그 후 ascii(substr(database(),{},1))문을 이용하여 하나씩 알아내면

위 사진대로 db 이름을 가져오면

99 104 97 108 108 50 -> chall2 인 것 같습니다.

 

다음은 table 이름을 알아내야 합니다. 이름을 알아내기 위해서는 먼저길이를 알아내야 합니다. 그래서 아래의 쿼리문을 사용하려 했습니다.

그랬더니 아무결과 값이 나오지 않았습니다. 이유를 생각해보니 table이 여러 개 존재 할 경우 한 번에 불러오지 못하는 것 같았습니다. 그래서 한 줄로 모아주는 group_concat 함수를 사용해서 결과값을 가져왔습니다. group_concat 함수를 사용하면 아래처럼 table을 가져와서 결과값을 반화해줍니다.

그렇게 만든 결과값을 가져오면 일단 17이라는 길이값을 반환하는데 이 길이는 아마 table 여러 개의 이름이 붙은 길이이기 때문에 아마 중간에 쉼표가 있을거라고 생각하고 그 기준으로 일단 한 번 데이터를 반환받아 보겠습니다.

 

아래가 결과값

여기서 보면 14번째 글자의 아스키 코드 값이 44입니다. 44를 문자로 바꾸면 쉽표인데, 이를 보면 아마 table이 2개인 것 같습니다. 그러면 위의 결과값을 정리해서 각 테이블의 이름을 찾아보겠습니다.

 

첫 번째 테이블 : 97 100 109 105 110 95 97 114 101 97 95 112 119 -> admin_area_pw

두 번째 테이블 : 108 111 103 -> log

 

여기서 이제 column 이름을 쿼리문을 이용해서 찾으면 되는데, 두 개의 테이블 중에서 하나를 골라야 합니다. 여기서 이름을 보고 추측을 해서 골랐는데 아마 첫 번째 테이블이지 않을까 싶어서 일단 첫 번째 테이블에서 찾아보았습니다.

 

일단 정보를 가져와보니 길이가 1입니다. 정확한 이름을 가져와보겠습니다.

column_name : 112 119 -> pw

column 이름을 보니 아마 이것이 맞지 않을까 생각합니다. 이제 모든 정보를 찾아냈으니 db에 저장되어 있는 비밀번호를 가져와 보겠습니다. 

일단 길이는 17입니다. 비밀번호의 값을 가져왔습니다.

pw : 107 117 100 111 115 95 116 111 95 98 101 105 115 116 108 97 98 -> kudos_to_beistlab

 

이제 처음 찾았던 admin.php에 들어가서 알아낸 비밀번호를 넣어보겠습니다.

넣어서 제출하면 문제가 풀리게 됩니다.

 

* 풀이가 굉장히 길어졌지만 엄청나게 어려운 문제는 아니었던 것 같습니다. information_schema 문제를 풀이법을 알고 있고, time의 값을 적절하게 조정하는 것을 알았다면 시간을 걸릴 수 있어도 다 풀 수 있지 않을까 싶습니다. 그리고 제 풀이는 굉장한 단순 노가다 방법이기 때문에 파이썬 코드를 이용한 풀이도 있다는 것을 알면 좋을 것 같습니다.