Webhacking - challenge(old) 18번
웹해킹 challenge(old) 18번 문제이다.
클릭해서 들어가면 SQL INJECTION 문제임을 확인 가능하다.
아래 view-source를 누르면 소스 코드 확인이 가능하다.
후반부에 php 코드가 있고, 해당 부분을 살펴봐야 할 것 같다.
preg_match 함수에 대해 알고 넘어가야한다.
preg_match는 정규식 표현을 작성하는 함수로, 매칭되는 값을 찾게 되면 그 시점에서 검색이 종료된다.
첫번째 인수를 통해 정규식 표현을 작성하고,
두 번째 인수를 토애 검색 대상 문자열을, 세 번째 인수를 통해 배열 변수를 반환하고
패턴 매치에서 매칭된 값을 배열로 저장한다.
1 이라는 값을 입력해보니 hi guest라고 나타난다.
no 값이 1 이면 guest 임을 알 수 있다.
select id from chall18 where id = 'guest' and no = $_GET[no]
select id from chall18 where id = 'guest' and no = 1 // hi guest
select id from chall18 where id ='guest' and no = 0 // 해당하는 값 없음
현재 원하는 값은 admin이기 때문에 0을 넣어서
해당하는 값이 없도록 만들어줘야한다.
0 or no=2
라고 입력하면 admin 값이 나올 줄 알았지만, preg_match 함수에 의해
no hack이 나타난다.
우회법을 찾기 위해 퍼센트 인코딩값으로 문자를 표현하면 문자인 것으로
인식하기 때문에 아래 표를 참고하였다.
0%09or%09no=2
공백의 문제였기 때문에 이를 %09로 대신 나타내주니
문제를 해결할 수 있었다.