poltergeist

poltergeist 문제를 풀기 위해서는 $poltergeistFlag === $_GET['pw'] 값이 일치해야 한다.
문제에서는 플래그가 member 테이블이 아닌 flag_{$hash} 라는 테이블에 저장되어 있다고 힌트를 줬다.


SQLITE3 에서는 MySQL, Oracle 같은 여타 RDBMS와는 달리 INFORMATION_SCHEMA.{?} 사용이 불가능하다.
그 대신, 이와 유사한 기능을 수행하는 것으로 SQLITE_MASTER 테이블이 있다.
SQLITE_TABLE의 NAME 혹은 TBL_NAME 컬럼을 조회하면 DB가 보유한 테이블 목록을 확인할 수 있으며
특정 테이블의 SQL 컬럼을 조회하면 그 테이블이 생성될 때의 CREATE 절이 출력되어 컬럼 정보를 확인할 수 있다.


위에서 언급한 내용들을 토대로 아래와 같이 페이로드를 작성하여 플래그가 저장된 테이블 정보를 확인했다.
(확인 결과, poltergeist.db 파일에는 2개의 테이블( flag_70c81d99, member )이 저장되어 있었다.)

(페이로드) 
?pw=%27%20UNION%20SELECT%20LENGTH(name)%20FROM%20sqlite_master%20--+
?pw=%27%20UNION%20SELECT%20name%20FROM%20sqlite_master%20LIMIT%200,1--+


이어서, flag_70c81d99 테이블의 flag_0876285c 컬럼의 값을 추출한다.


획득한 플래그 값을 pw 파라미터에 입력하면 문제 클리어 성공이다.


🐛.. 🐛.. 🐛..


REFERENCE

  1. https://wonder12.tistory.com/138