정보 수집은 모의 해킹에 있어서 가장 중요한 단계 중 하나. 공격 대상이 사용하는 웹 서버와 개발 언어, 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 |