webhacking 56번
포스팅에 앞서 내용이 틀릴 수도 있으며, 해당 부분 지적은 감사히 받겠습니다.
56번 문제이다.
테이블이 있으며 검색을 할 수 있게 되어있다.
각 링크를 들어가 보자.
admin은 접근이 거부되었다.
guest는 hello~라는 메시지가 있다.
이것저것 search에 시도를 하던 중 hello~를 입력했을 경우 guest 하나만 뜨는 것을 알게 되었다.
검색어는 subject의 내용을 검색한다는 것을 알아내었다.
또한 hello~ 뒤에 공백을 하나 추가하여 검색했을 경우에는 guest가 출력되지 않았다.
아마 내부 쿼리는 select * from table_name where search > '$_search'의 형태로 되어있다고 추측할 수 있다.
우리는 인젝터를 사용하여 admin의 blind sql injection과 비슷하게 불러와야 한다.
_를 사용해 문자열의 길이를 추출해보자.
테스트 결과 _이 44개까지 일 때 admin이 추출되었으며 그 이후에는 추출되지 않았다.
우리는 내부 내용의 길이가 44자리 인 것을 알아내었다.
이제 인젝터를 만들어 돌려보자.
이번 방식은 get 파라미터를 사용하지 않고 post방식으로 값을 입력받는다.
따라서 post 형식으로 인젝션을 진행해야 한다.
하지만 필자가 만든 코드의 로직상 첫 번째 글자는 수작업으로 찾아 넣어줘야 인젝터가 정상적으로 작동한다.
따라서 막일로 첫자리가 f인 것을 찾아내어 알고 있다는 전제하에 코드를 작성하였다.
찾는 방법은 search값에서 _를 43개로 줄이고 맨 앞자리에 하나씩 넣어가면서 찾으면 된다.
모두 뽑아내었다.
하지만 우리는 한 가지 알아야 할 점이 있다.
_는 ascii 번호에서 {, }보다 우선순위로 있기 때문에 {와 }이 있을 경우 _라 인식되고 다음 단계로 넘어가버린다.
따라서 추출된 flag를 조금 수정해야 한다.
추출된 flag : fLAG_HIMIKO_TOGA_IS_CUTE_DONT_YOU_THINK_SO?_
수정 flag : FLAG{HIMIKO_TOGA_IS_CUTE_DONT_YOU_THINK_SO?}
검증해보자.
문제 해결
시행착오
1. 다음에 인젝터 하나만으로 깔끔하게 풀어보고 싶다.
ㄴ hex 사용하면 될 거 같음