R's Hacking Daily Log

SQLi (4) 본문

Port Swigger/SQL Injection

SQLi (4)

hanhxx 2023. 4. 28. 13:39

이번에 정리할 SQL injection 내용은 

Examining the database in SQL injection Attack이다.

 

 

:) 앞에서 공부한 내용 중에서 username & password column을 갖는 users table이 있는 걸 공격자가 알고 

이 내용을 조회하고 싶어 하는 상황을 가정했다.

:) 사실 이 상황을 살펴보면 공격자는 users table에 대한 정보를 알아내는 단계를 미리 거쳐야 한다.

:) Examining the database는 조회하고자 하는 "other database"의 테이블 정보를 수집하는 과정에서

사용할 수 있는 SQL injection이라 할 수 있다.

 

 


Querying the database type and version

어떤 data base를 사용하냐에 따라서 query가 조금씩 달라질 수 있다.

그렇기 때문에 사람들이 흔히 사용하는 대표적인 DB마다 어떤 query를 사용할 수 있는지 간단히 살펴보도록 하자.

 

우선 DB 종류와 버전을 알아낼 수 있는 query이다.

Database type Query
Microsoft, MySQL SELECT @@version
Oracle SELECT * FROM v$version
PostgreSQL SELECT version()

query 내용을 union keywork를 사용해 실행하면 다음과 같은 결과를 볼 수 있을 것이다.

 

 

Microsoft SQL Server 2016 (SP2) (KB4052908) - 13.0.5026.0 (X64)
Mar 18 2018 09:11:49
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows Server 2016 Standard 10.0 <X64> (Build 14393: ) (Hypervisor)

예시에서는 Microsoft SQL server를 사용한다고 나오는 걸 볼 수 있다.

 

 

 

 

Listing the contents of database 

대부분의 DB는 자체적으로 DB에 대한 정보를 제공하는 information_scheme라는 걸 갖는다.

* information_schemesms DB와 연관된 데이터, 다른 말로 meta data를 저장한다.

 

 

mysql information_scheme를 검색해 보면 

어떤 table이 있는지, 어떤 정보를 알 수 있는 지 확인해 볼 수 있다.

 

 

information_scheme를 이용한 query를 하기 위해서는 다음과 같이 작성하면 된다.

SELECT * FROM information_schema.tables

이 Query는 DB안에 있는 모든 table을 출력하라는 의미이다. 

 

 

TABLE_CATALOG  TABLE_SCHEMA  TABLE_NAME  TABLE_TYPE
=====================================================
MyDatabase     dbo           Products    BASE TABLE
MyDatabase     dbo           Users       BASE TABLE
MyDatabase     dbo           Feedback    BASE TABLE

결과를 보면 이 DB 안에는 products, users, feedback이라는 이름의 table이 있다는 걸 확인할 수 있다.

 

 

이번에는 table이 어떤 column을 갖는지를 확인할 수 있는 query를 살펴보자.

information_scheme에는 columns라는 table name이 있다.

 

SELECT * FROM information_schema.columns WHERE table_name = 'Users'

table_name이 users인 table의 column 정보를 모두 출력해!라고 query를 실행하게 되면 

 

TABLE_CATALOG  TABLE_SCHEMA  TABLE_NAME  COLUMN_NAME  DATA_TYPE
=================================================================
MyDatabase     dbo           Users       UserId       int
MyDatabase     dbo           Users       Username     varchar
MyDatabase     dbo           Users       Password     varchar

int형의 userid, string data인 username, password column이 있다는 것을 알아낼 수 있다.

 

 

 

 

Equivalent to information schema on Oracle

oracle DB는 위에서 살펴본 Query 내용이 조금 다르다.

 

DB 안에 있는 모든 table을 조회하기 위해선 all_tables

SELECT * FROM all_tables

 

 

table에 존재하는 column을 조회하기 위해선 all_tab_columns

SELECT * FROM all_tab_columns WHERE table_name = 'USERS'

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

SQLi (5) - Lab  (0) 2023.05.01
SQLi (5)  (0) 2023.04.30
SQLi (3) - Lab  (0) 2023.04.28
SQLi (3)  (0) 2023.04.27
SQLi (2) & Lab  (0) 2023.04.27
Comments