27번 문제를 보면 다음과 같이 no를 입력 받는 form이 존재한다. 제목을 보면 SQL Injection이 가능할 것으로 보인다.
form의 action이 index.php이기 때문에 index.phps를 보면 다음과 같은 코드를 볼 수 있다.
solve()가 호출되기 위해서는 $q[id]가 admin이어야한다.
따라서 쿼리문의 수행 결과가 admin이 되어야하는데 쿼리문의 조건을 보면
where id=’guest’ and no=($_GET[no])인 것을 볼 수 있다.
여기서 id가 admin일 때로 조건을 변경하기 위해서 or를 사용할 수 있다.
where id=’guest’ and no=0 or no=2 와 같이 작성하면 된다.
이렇게 되면 실제로는
(id=’guest’ and no=0) or no=2 가 된다.
이 때 주의할 것은 no=($_GET[no])에서 괄호가 있기 때문에 입력 값을 이용하여 괄호를 닫아주고 뒤에 존재하는 괄호는 주석처리를 해야 한다는 것이다.
또다른 주의 사항은 필터링이다. 닫는 괄호의 경우 필터링 대상이 아니지만, =은 필터링의 대상이다. 따라서 =을 대신하여 like를 이용하였다.
결과적으로 input 값은
0) or no like 2 --
이 된다.
0은 guest의 no를 제외한 숫자, 2는 admin의 no를 의미한다.
여기서는 1을 제출해봄으로써 guest의 no가 1임을 알 수 있고, admin은 그 다음인 2일 것이라고 추정하였다.
참고로 이 때 -- 뒤에 띄어쓰기를 해야만 하는데
입력 값이 들어가면
where id=’guest’ and no=(0) or no like 2 -- )
와 같이 되기 때문에 주석 문자와 주석의 대상 사이에 공백이 있어야하기 때문이다.
위와 같이 입력하면 clear할 수 있다.
'Wargame > webhacking.kr' 카테고리의 다른 글
webhacking.kr 58번 (0) | 2019.01.29 |
---|---|
webhacking.kr 31번 (0) | 2019.01.29 |
webhacking.kr 25번 (0) | 2019.01.29 |
webhacking.kr 4번 (0) | 2019.01.29 |
webhacking.kr 54번 (0) | 2019.01.29 |
댓글