<<< 27번 문제 >>>
27번 문제에 들어가면 아래와 같은 화면이 뜬다.
음...아무런 힌트가 없다. 그렇다면? 바로 소스보기!!
phps 파일이 있다고 주석으로 친절히 알려주고 있다. 해당 파일로 들어가보자.
위에서 풀었던 18번 문제와 굉장히 흡사하다는 것을 알 수 있다. 여기서 특이한 것은 limit이 막혀있다는 것이다. limit을 이용하면 전체 테이블을 출력하게 한 뒤 하나씩 시도해서 admin이 나오게 할 수 있는데 이 기법을 막아버린 것이다. 우리는 18번에서 풀었던 방식(논리적 에러 sql injection)으로 풀어보자.
일단 칸에 무엇을 넣었을 때 어떤 반응을 보이는지 알아보기 위해 1을 넣어보았다.
그 결과 no에 1이 들어가며 guest라고 뜬다.
그럼 위의 가정과 같이 2가 admin이라 가정하고 풀어보겠다.
2를 넣었을 때 query error 뜨니 2를 이용해 false를 만들겠다
따라서 우리가 제출할 것은
2 or no=2
이다. 좋은 점은 빈칸이 막혀있지 않다. 하지만 =가 막혀있다 ㅠㅠ
=를 무엇으로 대체할지 알아본 결과 like로 대체할 수 있다.
따라서 2 or no like 2라고 하면
응?? 왜 guest가 뜰까?? 다시 코드를 보자.
쿼리문을 자세히 보면 no가 ( )로 막혀있는 것을 알 수 있다. 따라서 2를 통해 false로 만들어버려도 no like 2를 통해 true를 하면 guest의 no가 true가 되어 guest가 출력되는 것이다.
이를 확인해보기 위해 no에 true를 넣어보았다.
예상대로 no에 ture가 들어가면 guest가 출력된다.
그렇다면 문제를 해결하기 위해서는 어떻게 해야할까?
guest에 관련된 no를 닫아버리면 된다.
때마침 (는 막혀있지만 )는 막혀있지 않다.
2) or no like 2 --
이렇게 적어주면
select id from challenge27_table where id=’guest’ and no=(2) or no like 2 -- )”)) or…
이렇게 된다.
그러면 guest에 관련된 no는 막혀버렸기 때문에 or 이후의 문장이 ture가 되어 no가 2인 admin이 뜬다.
이후의 쿼리문은 --를 통해 주석처리 하였다.
(여기서 주의해야 할 것은 --의 앞과 뒤에 빈칸이 있어야 한다는 점!!)
이렇게 해결하였다.
'Solve Problem' 카테고리의 다른 글
[webhacking.kr] 7번 문제 (0) | 2015.07.06 |
---|---|
[webhacking.kr] 49번 문제 (0) | 2015.06.29 |
[webhacking.kr] 21번 문제 (0) | 2015.06.29 |
[webhacking.kr] 18번 문제 (0) | 2015.06.29 |
프로젝트 오일로 문제풀이 (0) | 2014.11.15 |