SQL Injection-Union Injection
by #독개#Union이란?
Union |
- 둘 혹은 그 이상의 SELECT 구문의 결과를 합치는데 사용되는 연산자 - UNION 앞의 명령어와 뒤의 명령어를 함께 실행 할 수 있게 해주는 연산자 |
Union Injection |
- 앞의 정상 Query와 UNION 뒤의 공격 Query를 함께 실행하는 공격기법 - UNION 명령을 써서 앞의 SELECT구문과 내가 원하는 SELECT구문을 같이 실행시키게 하는 방법이라 보면됨 |
기본 형식 |
- SELECT <필드명> FROM <테이블명> WHERE <조건> UNION SELECT <필드명> FROM<테이블명> WHERE <조건> |
특징 |
- 두개이상의 select문으로 구성되어야 하며 union키워드로 구분 ex) 4개의 select문 결합 : select union select union select union select - SELECT문의 필드명의 갯수와, 조건의 자료형의 수가 일치해야한다. 이게 무슨말이냐? SELECT id,pass FROM member WHERE id='admin' , pass='1234', phone='010-2222-4444' UNION SELECT a,b FROM board WHERE a='x' , b='y', c='z' 필드수일치 2개 , 조건수 일치(Verchar : 2개 , Int : 1개) |
조건 |
조건 테이블명, 컬럼명, 컬럼타입을 획득해야함 |
ex) DB의 다른 테이블의 정보들을 Union으로 모두 확인하기
이는 다음과같은 오류를 만들어낸다
두번째 컬럼명이 tid라는 것을 알 수 있다.
세번째 필드명을 알아내자.
'group by bbs.idx, bbs.tid having 1=1 --
이런식으로 반복하며 모든 컬럼명을 알아낼수 있다. (모든 필드명을 기입시 오류가 더이상 나지 않음)
테이블명 |
컬럼명 |
자료형 |
bbs |
idx |
int |
tid |
verchar |
|
tName |
verchar |
|
tMail |
verchar |
|
tTitle |
verchar |
|
tContent |
verchar |
|
tfilename |
verchar |
|
tfilepath |
verchar |
|
tRead |
int |
|
tDate | datetime |
공격 4 - 데이터 추출하기
목적 |
DB에 저장되어있는 데이터 추출 |
방법 |
테이블 명과 컬럼 명 및 컬럼의 필드 수, 타입이 모두 확인이 되면 union 연산을 통해 결과값을 게시판에 출력 |
Information _schma |
- DB의 메타 데이터를 제공하는 스키마로써 사용자 DB의 대한 정보를 확인해볼수 있음 (각DBMS마다 다름) - Information_schema.tables (모든 테이블의 정보저장) - MySQL - Information_schema.columns (모든 컬럼의 정보저장) - MySQL - sysobjects (name:테이블명 xtype: U인게 유저가 만든거) - MsSQL |
각 DBMS에따라 이런 기본적으로 생성되는 테이블이 있다. 여기서 이 DB의 테이블들을 다확인하거나 컬럼들을 다확인할수 있다.
우리 실습은 MsSQL로 진행되므로 구조를보면 이렇다
즉 xtype중 U인것만 선택해서 추출한다면 DB에 실질적인 테이블명을 다가져올수 있다.
이걸이제 웹에서 union을 통해 추출해보자
4-1 각컬럼의 값들이 어디에 쓰이는지 확인하기
각 필드갯수와 자료형을 잘맞춰서 union 인젝션 해본다.
아하! d와 b의 자리가 보기 좋겟구나. (만약 int형 자료를 나타내야할땐 1,2의 위치를 활용함되겠군)
4-2 필요한 데이터들 추출하기 (테이블, 원하는값)
d와 b의 컬럼에 내가 보고싶은 필드명을 적어서 추출해보자
이 DB에는 bbs라는 테이블과 member라는 테이블이 존재 하는구나
member 테이블의 데이터를 공격1,2를 통해서 추출해보면
테이블명 | 컬럼명 | 자료형 |
member | idx | int |
bid | verchar | |
bPass | verchar | |
bName | verchar | |
bPost | verchar | |
bAddr1 | verchar | |
bAddr2 | verchar | |
bPhone | verchar | |
bMail | verchar | |
bDate | datetime |
우리가 원하는건 bid와 bPass이다. 둘다verchar이므로 4-1의 d와 b자리에 넣으면 되겟군
bid와 bPass를 확인할수 있다.
'🧛♂️ 해킹 > 웹해킹' 카테고리의 다른 글
취약한 직접 객체 참조 (매개변수변조, 파일다운로드) (0) | 2020.07.29 |
---|---|
SQL Injection - Blind Injection (현재비어있음) (0) | 2020.07.29 |
SQL Injection - 인증우회 (0) | 2020.07.29 |
SQL Injection (0) | 2020.07.29 |
URL 메타문자 , 인코딩 (0) | 2020.07.29 |
블로그의 정보
독한 개발자
#독개#