이전 문제에서 sleep이나 benchmark 함수를 사용하지 못 한다는 점만 빼고 모든 것은 다 똑같다. SQL에서는 order로 table을 정리할 적에, 만약 order 에 대한 값이 오류를 일으킨다면 정상적인 table을 return 해주지 못하게 된다. 예를 들어서 order에 싱글쿼터만을 전달해주면, 과 같이 mysqli_fetch_array 함수가 아무런 값도 return 해주지 않아 우리가 보는 문제 페이지에도 아무런 table 값이 출력되지 않는다. 정상적인 query문이라면, 과 같이 모든 사용자들이 출력된다. 동작 그만. 이 점을 이용하면 되지 않을까? 우리는 Error-Based SQL Injection에서 수행한 방법처럼 특정 문자열이 출력되는 것을 이용하여 query문의 오류 여..
드디어 table이 시각적으로 출력되기 시작하였다. query문도 order by 를 통하여 정렬하는 query문으로 변경되었다. 문자열 필터링에서 sleep, benchmark 가 빠진 것을 보아 time-based sql injection 에 관한 문제인 것 같다. Time-Based SQL Injection 이란, query문에 시간을 delay 시키는 함수, sleep/benchmark 등을 사용하여 요청에 대한 응답시간을 의도적으로 지연시키는 방법이다. 어떻게 사용하는 것인가? 우선 문제에 간단하게 테스트해보자. ?order=1 위와 같이 query 를 전달할 경우, 1번 column, 즉 id column 을 기준으로 table 이 정렬된 것을 볼 수 있다. admin 의 email 주소는 p..
기본적인 Blind SQL Injection 문제인 것 같아 보이지만 참값을 확인할 방법이 보이지 않는다. 이전 문제들에서는 'Hello admin 이라는 문자열을 출력시켜줌으로써 우리가 전달한 query문에 대한 참값을 알 수 있었다. 코드 line 8 을 보면 myslqi_error() 함수를 사용하고 있다. 이 함수는 query 문에 오류가 있을 시에 해당하는 오류를 출력시켜주는 함수이다. 이것을 이용하면 될 것 같다. 어떤 오류를 출력시키는지 한 번 살펴보자. ?pw=' 위와 같은 query 문을 전달하였더니 아래와 같은 오류 메세지가 출력되었다. You have an error in your SQL syntax; check the manual that corresponds to your MySQ..
간만에 간단한 문제가 나왔다. id 바로 뒤에 주석이 있어 pw 단에 어떠한 값을 입력해도 무력화된다. MySQL 에서 주석 사용은 다음과 같다. 주석 설명 # 해당 라인을 주석화 -- 해당 라인을 주석화 /* */ 여러 라인을 주석화 그렇다. #은 한 줄만 comment(주석)화 한다. 따라서 줄바꿈 제어문자를 pw 입력값에 넣으면 될 것 같다. pw=%0a or id='admin'%23 하지만 위와 같이 넘겨주면 id='guest'가 우선적으로 처리되어 guest로 로그인된다. 앞에 guest를 무력화시키자. 간단하다. and 0 으로 거짓으로 만들어주면 된다. pw=%0a and 0 or id='admin'%23