Webhacking Writeup 9번 문제입니다.

사이트에 접속하면 1 2 3과 패스워드 제출칸이 존재합니다.
일단 1 2 3하나씩 들어가 보겠습니다.



3번째의 id가 password라고 알려줍니다.
그럼 id를 찾아야 한다는건데
url을 보면 no=( )를 기준으로 값이 증가하면서 페이지가 넘어가길래
4이상이 있나 입력해봤습니다.

페이지가 존재합니다....
이상하네여 아까 메인페이지에서 입력하면 될걸
왜 4이상의 페이지가 존재하고 입력이 가능할까요?
이걸 계속고민하다 Los orc문제를 해결하러 도망갔었습니다.
못풀어서요....
orc문제를 풀고 돌아와서 생각해보니
블라인드SQL이 가능하겠더라구요.
블라인드 문제를 지금까지 True 와 False를 구분지어서 풀었다면
여기서는 찾아야할 id값이 존재할 no=3인 경우와 그외로 구분짓는다면
가능하지 않을까 라는 생각이였습니다.
해서 일단 여러가지를 삽입해봤는데


네 필터링이 걸려있습니다.
대략 제가 찾은 필터링이 or, and, = , || , % , > , <, 공백 등등 너무많아서
여기서 또 좌절하고 다른 문제 풀러 도망갔습니다.
이후 다른 문제로 필터링 우회를 검색하다가 알게됬는데
=의 대한 필터링 우회가 있더라구요

like를사용하는것으로 =의 우회가 가능해졌지만 and or이 가능하지 않아
삽입식을 어떻게 짜야할지 감이 오지 않더라구요
그러다가 가만히 생각해보니 and or로는 원하는 값의 출력이 안된다는걸 알았습니다.
and, or 을 사용한다면 값이 True를 출력하며 1을 사용하는데
우리가 원하는 값은 True가 아닌 no=3 이니깐요
no=1(True) 이면 우리는 Apple페이지의 아이디가 나오게 될뿐
우리가 원하는 no=3은 나올 수 없다는걸 깨달았습니다.
여기서 고민이 시작됬는데
작성자의 SQL지식이 부족해 어떻게 식을 짜야하나 많은 시간을 좀 썼습니다.
결국 돌고돌아 생각나는게 if문 뿐이더라구요
그래서 식을 세우면
(url)?no=if length(id)=1,3,4
가 될텐데 '=' 필터링이라 like를 사용하면
(url)?no=if length(id)like(1),3,4
이대로 삽입을 시도했더니 또다시 필터링...

공백이 문제인지 아니면 %20이 들어가면서 %로 필터링이 걸린건지 모르겠으나
공백 우회를 시도해야 할것 같습니다.
필터링 공백 우회 키워드로 찾아낸 괄호 방식

(url)?no=if(length(id)like(1),3,4)
괄호를 사용하여 식을 정리 했습니다.
위 식이 필터링이 안걸리기를 바라면서 삽입을 시도하면

Access Denied 대신 패스워드 입력창이 나왔습니다.
즉 if구문이 성공해 False로 출력되며 no=4가 됬다는 것을 알 수 있었습니다.
그럼 이제 like에 대한 값을 한개씩 올려가면서 id의 길이를 찾으면 됩니다.
그렇게 값을 올리다보면

11번째에 Secret가 출력됩니다.
즉 no=3의 id길이는 11임을 알아냈습니다.
그러면 이제 id를 한개씩 뽑아서 값을 비교하면 됩니다.
이전에 풀었던 orc코드를 참고삼아

substr(id,{i},1)형태로 사용하면 될것같습니다.
해서 코드를 작성하면

먼저 위에서 길이가 11임을 찾았으니 11번 반복을 돌려주고
(이전 Los orc를 하면서 지인에게 들은 점인데
MySQL은 대소문자 구분을 하지 않는다고 하더라구요.)
일단 영문자부분만 먼저 돌려보기 위해서 97~122까지 지정
만약 11글자가 전부 나오지 않는다면 중간에 숫자나 특수문자가 있을테니
그부분만 돌려보면 해결될 것입니다.
hex로 바꿔주는 이유는 like를 사용할때 10진수로 삽입해봤는데
값이 나오지를 않더라구요.

예상이지만 아스키코드로 변환해서 비교하는게 아닌 숫자 그대로 비교하는 것 같더라구요
또한 chr로 변환해도


값이 나오지를 않습니다.
이건진짜 모르겠어서 아시는 고수분 계시면 알려주세요.
찾다가 도저히 혼자서는 해결을 못하겠어서
드림핵을 참고해봤는데

ascii함수를 사용하더라구요.
이를 이용하면 가능할것 같았습니다.
if(ascii(substr(id,1,1)like(97),3,0) 으로 시도해봤더니

필터링이 걸려있습니다. 진짜 필터링이 몇개인지....머리가 아픕니다.
돌고돌아 MySQL기초지식까지 찾아보다가
MySQL 16진수 자료형
16진수 값 MySQL은 16 진수 값을 지원한다. 숫자 문장안에서 16진수 값은 정수처럼 동작을 한다 (64-비트 표현식). 반면에, 스트링 문자에서는 바이너리 스트링처럼 동작을 하며, 각각의 16진수 쌍은
bluebreeze.co.kr

MySQL은 16진수를 지원하니 16진수를 자동으로 문자 변환하므로
값을 비교하는게 가능할것 같더라구요
그래서

hex로 변환해 id값을 하나하나 비교하는 식을 구성하였습니다.
코드를 실행해보면

원하던 패스워드가 변환시킨 hex값으로 나왔습니다.
이걸 다시 문자열로 변환시키면

나온 결과값을 메인페이지 패스워드 입력창에 삽입해보면


문제가 해결되었습니다.
진짜 여러번 트라이하고 한개부분 해결해도 또다시 필터링으로 막히고
작성자가 느끼기에는 어려웠던 문제였습니다.
'Wargame(Web) > Webhacking.kr Writeup' 카테고리의 다른 글
Webhacking Writeup 27번 문제 (0) | 2022.08.15 |
---|---|
Webhacking Writeup 39번 문제 (0) | 2022.08.15 |
Webhacking Writeup 20번 문제 (0) | 2022.08.13 |
Webhacking Writeup 49번 문제 (0) | 2022.08.13 |
Webhacking Wrietup 46번 문제 (0) | 2022.08.13 |