문제에 접속하니 소스만 있어서 바로 소스를 분석해봤다.
1. answer 파라미터 값이 $hidden_table과 같으면 문제 클리어
2. val 파라미터에 select , by 가 들어가면 프로그램 강제종료
3. sql 쿼리를 실행해서 val 값이 $hidden_table 이라는 테이블에 존재하면 화면에 출력
결론적으로 문제를 해결하기 위해서는 쿼리가 실행되는 테이블의 이름($hidden_table)을 알아내야 한다.
DB에서 테이블 이름에 접근하기 위해서는 메타데이터 영역에 접근해야 하는데
문제는 select를 사용할 수 없어서 메타데이터에 접근할 수 없을 것 같다.
그렇다면 어떻게 해야 테이블 이름을 알아낼 수 있을까??
여기서는 테이블 이름을 알아낼 수 있는 다른 방법인 procedure 함수의 취약점을 이용해야 할 것 같다!
sql select문에서는 where의 뒷부분에 procedure analsys() 라는 함수를 사용할 수 있다.
procedure 함수는 쿼리에서 사용되는 테이블에 관련된 모든 정보를 출력하는 함수이다.
procedure analsys()를 사용시 [DB명.테이블명.속성명] 형태의 값을 출력한다.
즉, 이러한 취약점을 이용해 테이블이름을 쉽게 알아낼 수 있을 것이다!!
val=1 procedure analyse()
이제 페이로드를 val 파라미터를 통해 전송해보자!
(사전에 val가 1인 정보가 DB에 있다는 것을 미리 확인했고 DB에 없는 값을 같이 전송할 경우 아무 것도 안뜬다.)
값을 전송하니 [DB명.테이블명.속성명] 형태로 정보가 출력이 됐다.
테이블명이 나왔으니 이제 값을 복사하여 answer 파라미터로 전송해보자.
클리어!!