UNION Based SQL Injection 정리
이번에는 UNION Based SQL Injection에 대해서 정리를 해보려고 한다.
UNION Based SQL Injection이란
- UNION Based SQL Injection은 질의한 SQL 쿼리의 결과가 응답에 포함될 때, UNION 또는 UNION ALL 을 이용해 원래의 SQL 쿼리에 민감한 데이터를 추출하는 SQL 쿼리를 더하여 공격하는 방법이다.
UNION Based SQL Injection의 조건
- 통합되는 각 SQL 쿼리는 SELECT 절에서 동일한 갯수의 컬럼을 사용해야 한다.
- 원래 SQL 쿼리의 SELECT 절 컬럼의 자료형이 새로 삽입되는 쿼리의 SELECT절 컬럼의 자료형과 호환되어야 한다.
UNION Based SQL Injection을 수행할 때 반환되는 컬럼 수 확인 방법
- ORDER BY 절 사용
- 요청되는 쿼리가 SELECT * FROM WHERE category='gift'라고 가정하면 'ORDER BY 1-- 를 뒤에 붙여 숫자를 하나씩 증가하는 방법
- 지정한 숫자가 실제 컬럼 갯수를 초과하면 오류 반환
- UNION SELECT NULL 사용
- ' UNION SELECTR NULL, NULL-- 를 뒤에 붙여 NULL을 하나씩 늘려 요청하는 방법
- NULL 수가 컬럼 수와 일치하지 않으면 오류 반환
데이터베이스 별 cheat sheet
- 다음은 Oracle, Microsoft, PostgreSQL, MySQL 별로 cheat sheet를 정리해놓은 portswigger 사이트이다.
- https://portswigger.net/web-security/sql-injection/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
...