[모의해킹 스터디] 6주차 정리

바울·2024년 11월 29일
0

모의해킹 스터디

목록 보기
13/40

UNION SQL Injection 개념

UNION SQL Injection은 SQL 쿼리의 UNION 연산자를 악용하여 공격자가 자신의 입력값을 통해 추가적인 데이터를 데이터베이스에서 가져오는 공격 방법입니다. 이 공격 방식은 잘못된 입력값 검증과 취약한 쿼리 작성에서 발생합니다.


UNION SQL Injection 이란?

SQL의 UNION 연산자는 두 개 이상의 SELECT 결과를 합쳐 하나의 결과로 반환하는 데 사용됩니다. 공격자는 이 연산자를 사용하여 원래의 쿼리와 별도의 SELECT 문을 결합함으로써 데이터베이스에서 민감한 정보를 추출할 수 있습니다.

예시

SELECT username, password FROM users WHERE id = '1'
UNION
SELECT credit_card_number, cvv FROM credit_cards;

위와 같은 공격으로 인해 원래 쿼리가 반환해야 할 데이터 외에 다른 테이블의 민감한 데이터까지 반환될 수 있습니다.


UNION SQL Injection 동작 방식

조건

  • 두 SELECT 문에서 반환하는 열(column)의 개수와 데이터 타입이 일치해야 합니다.
  • 그렇지 않으면 데이터베이스가 에러를 반환합니다.

단계

  1. 열 개수 확인 공격자는 ORDER BY나 UNION SELECT NULL 등을 사용하여 쿼리에서 반환하는 열 개수를 파악합니다.
' UNION SELECT NULL -- 
' UNION SELECT NULL, NULL -- 
  1. 데이터 타입 확인 각 열의 데이터 타입에 맞는 값을 삽입해 데이터를 성공적으로 추출할 준비를 합니다.
' UNION SELECT 'string', 123 -- 
  1. 민감한 데이터 추출 열 개수와 데이터 타입을 맞춘 후, 공격자는 원하는 테이블의 데이터를 쿼리에 추가합니다.
' UNION SELECT username, password FROM users -- 

UNION SQL Injection Process

union sql injection을 이용해 사용자 정보를 추출 해보고자 한다!

1. sql injection 포인트 찾기
2. column 개수 찾기
3. 출력되는 column 위치 찾기
4. db 이름 확인
5. table 이름 확인
6. column 이름 확인
7. data 추출

위에 순서대로 진행해 보고자 한다!

대상 사이트

게임 이름을 검색할 수 있는 사이트이다.

1. sql injection 포인트 찾기

over로 검색 시 overwatch 게임이 출력 되는 걸 볼 수 있다. 이걸로 알 수 있는 사실은 like %% 구문을 사용하고 있다는 것이다. sql injection을 수행할 수 있는지 확인을 해봐야 하는데 like %% 사용하고 있기 때문에 감안해서 쿼리문을 작성해야 한다.

기존과 동일한 값이 나올 걸로 보아 sql 구문을 사용할 수 있는 것으로 보인다!

2. column 개수 찾기

order by를 사용해 column 개수를 확인해 보았다.

1부터 2,3,4... 계속 입력하다 5를 입력하니 에러가 나왔다. column 개수가 총 4개임을 알 수 있다.

3. 출력되는 column 위치 찾기

union select를 이용하면 값을 덮어서 출력하지 않고 그다음에 출력하기 때문에
over%' union select 1,2,3,4 #를 사용해 column의 위치를 파악해 줬다.

4. db 이름 확인

select database() 쿼리문를 사용하면 현재 사용 중인 db 정보를 볼 수 있다. 이를 이용해 화면에 사용 중인 db를 출력해 보자.

현재 사용 중인 db는 segfault_sql이라는 것을 알아냈다!

5. table 이름 확인

over%' union select 1,table_name,3,4 from information_schema.tables
where table_schema = 'segfault_sql' #

위에 쿼리문을 사용해 table정보를 추출할 것이다. 쿼리문을 보면 information_schema.tables에 위에서 알아낸 segfault_sql db에서 table_name을 가져오는 것이다. 여기서 information_schema.tables이란 SQL 표준의 INFORMATION_SCHEMA 뷰 중 하나로, 데이터베이스에 존재하는 테이블에 대한 메타데이터 정보를 제공하는 시스템 테이블이다.
정리하면 information_schema라는 이름에 데이터베이스에 안에있는 tables라는 이름에 테이블에 segfault_sql db에 테이블 정보를 가져오는 것이다.

쿼리문을 입력하면 테이블 이름을 알 수 있다. 총 4개에 테이블이 존재하는 걸 알 수 있다.

6. column 이름 확인

over%' union select 1,column_name,3,4 from information_schema.columns
where table_name = 'table_name' #

5번과 같이 information_schema에 있는 정보를 가져올 것이다. 위에서 4개의 테이블 이름을 알아냈다. game은 지금 화면에 출력되고 있기 때문에 나머지 3개의 테이블의 컬럼 이름을 확인해 보기 위해 information_schema.columns에서 컬럼정보를 가져올 것이다.

member

secret

secret_member

column 이름까지 전부 알아냈다! 기존 목표였던 사용자 정보를 추출해 보자!

7. data 추출

사용자 정보를 보기 전에 의심스러운 secret 테이블부터 살펴보자

secret 테이블에서는 flag를 획득할 수 있다!

secret_member 테이블에서는 사용자 정보를 확인할 수 있다!

0개의 댓글