본문 바로가기
Web/SQL Injection

System table

by ㅇㅅㅇ.. 2024. 8. 15.

정보 수집은 모의 해킹에 있어서 가장 중요한 단계 중 하나. 공격 대상이 사용하는 웹 서버와 개발 언어, DBMS와 내부 정보 등을 알아내는 과정이 이에 해당되는데 SQL Injection 취약점이 존재하는 경우  System table을 활용할 수 있다.

 

모든 DBMS에는 데이터베이스의 정보를 포괄하는 시스템 테이블이 존재한다. 시스템 테이블에는 설정 및 계정 정보 외에도 테이블과 칼럼 정보, 그리고 현재 실행되고 있는 쿼리의 정보 등 다양한 정보를 포함하고 있다. 

 

실제로 SQL Injection을 수행할 때 특정 계정이나 비밀번호를 알아내기 위해 쿼리를 삽입하는 경우, 해당 정보가 포함된 테이블명과 칼럼명을 알아야 하기 때문에 이를 모르는 경우에 시스템 테이블을 먼저 공격하여 해당 정보를 알아낼 수 있다. 


⬇️Click

MySQL MSSQL PostgreSQL Oracle SQLite

 

 

 


1. MySQL

information_schema, mysql,  performance_schema, sys

 

 

스키마 정보

(schema == database)

  • mysql> show databases; 
    => 위의 시스템 테이블을 제외한 다른 DB가 이용자가 정의하고 사용하는 DB
  • mysql> SELECT TABLE_SCHEMA FROM information_schema.TABLES GROUP BY TABLE_SHCEMA;
    => 위와 동일한 결과

 

테이블 정보

  • mysql> SELECT TABLE_SCHEMA, TABLE_NAME FROM information_schema.TABLES;
    => TABLES 테이블의 내용 중 TABLE_SCHEMA와 해당 스키마에 있는 TABLE_NAME을 출력

 

칼럼 정보

  • mysql> SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME FROM information_schema.COLUMNS;
    => COLUMNS 테이블에 있는 모든 칼럼의 정보를 출력하는데 해당 칼럼이 있는 DB명과 테이블명도 모두 같이 출력 

 

실시간 실행 쿼리 정보

  • mysql> SELECT * FROM information_schema.PROCESSLIST;
  • mysql> SELECT user, current_statement FROM sys.sesstion;
    => 실행 중인 계정과 함께 실시간 쿼리 조회

 

DBMS 계정 정보

  • mysql> SELECT GRANTEE, PRIVILEGE_TYPE, IS_GRANTABLE FROM information_schema.USER_PRIBILEGES;
    • GRANTEE: 계정 정보
    • PRIVILEGE_TYPE: 특정 사용자가 가진 권한의 종류
    • IS_GRANTABLE: 특정 사용자가 자신의 권한을 다른 유저에게 줄 수 있는지(YES 또는 NO로 표시됨)

 

  • mysql> SELCET User, authentication_string FROM mysql.user;
    • authentication_string: 사용자의 비밀번호 해시

 

 


2. MSSQL

master, tempdb, model, msdb

 

 

데이터베이스 정보

  • SELECT name FROM sys.databases
  • SELECT name FROM master..sysdatabases;
  • SELECT DB_NAME(num)
    => num=0, 현재 데이터베이스

 

테이블 정보

  • SELECT name FROM dreamhack..sysobjects WHERE xtype = 'U';
    => xtype='U': 이용자 정의 테이블
  • SELECT table_name FROM dreamhack.information_schema.tables;

 

칼럼 정보

  • SELECT name FROM syscolumns WHERE id = (SELECT id FROM sysobjects WHERE name = 'users');
  • SELECT table_name, column_name FROM dreamhack.information_schema.columns;

 

DBMS 계정 정보

  • SELECT name, password_hash FROM master.sys.sql_logins;
    => master 데이터베이스의 sys.sql_logins 테이블을 통해 MSSQL 서버의 계정 정보를 조회
  • SELECT * FROM master..syslogins;
    => master 데이터베이스의 syslogins 테이블 조회도 가능

 

 


3. PostgreSQL

postgres, template1, template0

pg_catalog, information_schema

 

 

데이터베이스, 스키마 정보

  • postgres=$ select datname from pg_database;
    => 결과로 postgres, template1, template0 데이터베이스가 출력
  • postgres=$ select nspname from pg_catalog.pg_namespase;
    => 결과로 pg_catalog, information_schema... 주요 정보를 담고 있는 테이블을 포함한 스키마가 출력

 

테이블 정보

  • postgres=$ select table_name from information_shema.tables where table_schema='pg_catalog';
  • postgres=$ select table_name from information_shema.tables where table_schema='information_schema';
  • postgres=$ select table_schema, table_name form information_schema.tables;

 

DBMS 정보

  • postgres=$ select usename, passwd from pg_catalog.pg_shadow;

 

DBMS 설정 정보

  • postgres=$ select name, setting from pg_catalog.pg_settings;

 

실시간 실행 쿼리 확인

  • postgres=$ select username, query from pg_catalog.pg_stat_activity;

 

칼럼 정보

  • postgres=$ select table_shcema, table_name, column_name from information_schema.columns;

 

 


4. Oracle

all_tables

(현재 사용자가 접근할 수 있는 테이블의 집합)

 

 

데이터베이스 정보

  • SELECT DISTINCT owner FROM all_tables
  • SELECT owner, table_name FROM all_tables

 

칼럼 정보

  • SELECT column_name FROM all_tab_columns WHERE table_name = 'users'

 

DBMS 계정 정보

  • SELECT * FROM all_users

 

 


5. SQLite

sqlite_master

 

 

  • sqlite> .hader on
    => 콘솔에서 실행 시 칼럼 헤더를 출력하기 위해 설정
  • sqlite> open dreamhack.db
    => DB 연결
  • sqlite> select * from sqlite_master;

'Web > SQL Injection' 카테고리의 다른 글

DB 종류, 버전 알아내기  (0) 2024.08.15
Error & Time based SQL Injection  (0) 2024.08.07
Blind SQL Injection  (0) 2024.08.06
UNION / Subquery  (0) 2024.08.06
DML  (0) 2024.08.06