Web Hacking/Study

UNION Based SQL Injection 정리

박연준 2024. 1. 13. 22:23

 

이번에는 UNION  Based SQL Injection에 대해서 정리를 해보려고 한다. 

 

UNION Based SQL Injection이란

  • UNION Based SQL Injection은 질의한 SQL 쿼리의 결과가 응답에 포함될 때, UNION 또는 UNION ALL 을 이용해 원래의 SQL 쿼리에 민감한 데이터를 추출하는 SQL 쿼리를 더하여 공격하는 방법이다. 

 

 

UNION Based SQL Injection의 조건

  1. 통합되는 각 SQL 쿼리는 SELECT 절에서 동일한 갯수의 컬럼을 사용해야 한다. 
  2. 원래 SQL 쿼리의 SELECT 절 컬럼의 자료형이 새로 삽입되는 쿼리의 SELECT절 컬럼의 자료형과 호환되어야 한다.

 

 

UNION Based SQL Injection을 수행할 때 반환되는 컬럼 수 확인 방법

  1. ORDER BY 절 사용
    • 요청되는 쿼리가 SELECT * FROM WHERE category='gift'라고 가정하면  'ORDER BY 1-- 를 뒤에 붙여 숫자를 하나씩 증가하는 방법
    • 지정한 숫자가 실제 컬럼 갯수를 초과하면 오류 반환
  2. UNION SELECT NULL 사용
    • ' UNION SELECTR NULL, NULL-- 를 뒤에 붙여 NULL을 하나씩 늘려 요청하는 방법
    • NULL 수가 컬럼 수와 일치하지 않으면 오류 반환

 

데이터베이스 별 cheat sheet

 

SQL injection cheat sheet | Web Security Academy

This SQL injection cheat sheet contains examples of useful syntax that you can use to perform a variety of tasks that often arise when performing SQL ...

portswigger.net

 

 

 

유용한 데이터 유형이 있는 컬럼 찾기

  • 보통 흥미로운 데이터는 일반적으로 문자열 유형
  • 예를 들어 4개의 컬럼 수를 찾았다면 다음과 같이 하나씩 문자열 유형의 컬럼 수를 확인할 수 있음
  • 문자열 유형의 컬럼과 호환되지 않을 경우 데이터베이스 오류 발생
' UNION SELECT 'a',NULL,NULL,NULL--
' UNION SELECT NULL,'a',NULL,NULL--
' UNION SELECT NULL,NULL,'a',NULL--
' UNION SELECT NULL,NULL,NULL,'a'--

 

 

UNION 공격을 통한 흥미로운 데이터 검색

  • 원래 쿼리에 두 개의 컬럼이 있으며 둘 다 문자열 유형의 컬럼이라고 가정
  • 다음과 같이 users의 테이블의 컬럼 조회 가능
' UNION SELECT username, password FROM users--

 

 

portswigger 랩을 해결하면서 더 자세히 알아보자. 다음은 카테고리 필터에서 UNION Based SQL Injection을 통해서 username과 passwrod 컬럼이 있는 users  테이블을 조회하고 administrator로 로그인하라는 내용이다.

 

 

 

Refine your search: 탭에서 Lifestyle을 누르면 주소창에 category 파라미터로 값이 요청되는 것이 보인다. 

 

 

UNION Based SQL Injection을 사용하기 위해서 먼저 컬럼의 갯수를 파악해야 한다. 여기에서는 두 개라고 이미 알려줬지만 NULL를 활용해서 하나씩 찾을 수도 있겠다. 다음은 'abc'라는 문자열 유형이 두 개 다 존재하는지 확인한 모습이다.

 

 

이를 따라서 'abc' 부분에 username과 password를 넣어주고 FROM users-- 를 붙여서 요청해보자. 본문에 administrator의 username과 password의 컬럼 값이 조회된 것을 확인할 수 있다. 이를 통해 로그인하면 랩을 해결할 수 있다.

 

 

 

 

Oracle에서는 단일 열 내에서 여러 값 검색 가능

  • 다음과 같이 컬럼 사이에 ||와 ~의 문자로 연결하여 여러 컬럼을 한 컬럼에서 검색 가능
' UNION SELECT username || '~' || password FROM users--
...
administrator~s3cure
wiener~peter
carlos~montoya
...

 

'Web Hacking > Study' 카테고리의 다른 글

경로 순회 취약점이란?  (0) 2024.01.15
Authentication 취약점이란?  (0) 2024.01.15
Relative Path Overwrite (RPO) 취약점이란  (0) 2024.01.02
CSP(Content Security Policy)  (1) 2023.12.23
XSS 필터링 우회  (2) 2023.12.21