일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- CTF-d
- 로그 분석
- 부트스트랩
- 레나 튜토리얼
- 포렌식
- Blind Sql Injection
- 해커팩토리 8번
- 보안
- 시스템 해킹
- 리버싱 기초
- 해커팩토리 7번
- Burp Suite Intruder
- SANS
- SQL Injection
- 네트워크 포렌식
- union sql injection
- 웹 해킹
- 웹해킹 실습
- 게시판 만들기
- 해커팩토리
- 디스크 포렌식
- 테이블명 수집
- Burp Suite
- ftz
- 해커 팩토리
- 해커 팩토리 6번
- python flask
- 리버싱
- 해커팩토리 10번
- 파일 다운로드 취약점
- Today
- Total
Cha4SEr Security Study
[Web Hacking] - Union Based SQL Injection 본문
이번 포스팅에서는 SQL 인젝션 중에서 Union Based SQL Injection 에서 알아보도록 하겠습니다.
Union SQL Injection은 2개 이상의 쿼리를 요청하여 결과를 얻는 UNION 이라는 SQL 연산자를 이용한
SQL 인젝션 공격 입니다.
원래의 요청에 한 개의 추가 쿼리를 사용해서 추가적인 정보를 얻어내는 것이 목적이며
Union SQL Injection을 하기 위해서는
두가지 쿼리문의 출력에 대한 칼럼의 개수와 데이터 형식이 같아야 합니다.
예를 들어서
SELECT id, password from table UNION SELECT email FROM table WHERE id='1'
SELECT `id`, `password` from table UNION SELECT `email` FROM table WHERE `id`='1'
이라는 쿼리를 요청한다고 할 때,
첫번째 SELECT 문은 id, password 두 개의 칼럼을 요청하고 있지만,
두번재 SELECT 문은 email이라는 한 개의 칼럼을 요청하고 있습니다.
칼럼명은 달라도 되지만 칼럼 개수가 다르기 때문에 이 쿼리문은 오류가 나게 됩니다.
그렇다면 테이블의 칼럼 갯수를 모르는 상황에서 어떻게 칼럼 개수를 알아낼 수 있을지 알아보도록 하겠습니다.
방법은 크게 두가지 입니다.
첫번째는 SELECT 를 이용하는 방법이 있습니다.
예시로 다음과 같은 테이블이 있다고 가정합시다.
현재 주어진 테이블의 칼럼은 num, title, writer, views, context 총 5개의 칼럼이 존재합니다.
하지만 우리는 칼럼 개수를 모른다고 가정하고, UNION 을 이용하여 칼럼의 개수를 알아봅시다.
방법은 다음과 같이 SELECT 다음 숫자를 1 / 1,2 / 1,2,3 차례대로 대입해보는 것 입니다.
SELECT * FROM board WHERE num=1 UNION SELECT 1;
SELECT * FROM board WHERE num=1 UNION SELECT 1,2;
SELECT * FROM board WHERE num=1 UNION SELECT 1,2,3;
SELECT * FROM board WHERE num=1 UNION SELECT 1,2,3,4;
SELECT * FROM board WHERE num=1 UNION SELECT 1,2,3,4,5;
개수가 맞지 않을 때는 오류가 뜨다가 오류가 뜨지 않을 때의 수가 바로 칼럼의 개수입니다.
1,2,3,4,5 를 SELECT 했을 때 왼쪽부터 차례대로 각 칼럼에 1,2,3,4,5가 들어가 있는 것을 볼 수 있습니다.
두번째는 ORDER BY를 이용하는 방법입니다.
SELECT * FROM board WHERE num=1 UNION SELECT * FROM board WHERE num=1 ORDER BY 1;
SELECT * FROM board WHERE num=1 UNION SELECT * FROM board WHERE num=1 ORDER BY 2;
SELECT * FROM board WHERE num=1 UNION SELECT * FROM board WHERE num=1 ORDER BY 3;
SELECT * FROM board WHERE num=1 UNION SELECT * FROM board WHERE num=1 ORDER BY 4;
SELECT * FROM board WHERE num=1 UNION SELECT * FROM board WHERE num=1 ORDER BY 5;
SELECT 와 반대로 ORDER BY는 처음에는 오류가 나지 않습니다.
하지만 칼럼의 개수를 초과하는 숫자를 입력하면
다음과 같이 오류가 나게 됩니다.
즉, 대입을 하나씩 해보다가 에러가 나지 않는 최대 숫자가 바로 칼럼 개수를 나타냅니다.
이제 Dreamhack.io 사이트의 웹해킹 강의에 나와있는 예제로 실습을 해봅시다.
사용자로부터 uid와 upw를 입력받은 후, 저장된 데이터와 비교하여 일치하면 uid를 출력해주는 기능입니다.
여기서 해볼 수 있는 것은
1. 해당 테이블에 존재하는 사용자 목록 획득
2. UNION을 사용해서 "admin"의 패스워드 출력
입니다.
1번 문제는
다음과 같이 일반적인 sql injection 처럼 풀 수 있습니다.
1. uid 값에 1이라는 임의의 값을 넣어 준 다음, 따옴표를 추가하여 입력값을 닫아준다.
2. or 1=1을 입력해서 조건문이 항상 참을 만족하도록 한다.
3. # 을 입력해서 or 1=1로 쿼리문을 끝내고, 뒤에 upw 관련 쿼리문은 주석처리를 하여 무시한다.
이렇게 하게 되면 결과값으로
UID라는 칼럼 아래 모든 유저의 uid를 볼 수 있습니다.
다음은 UNION을 이용하여 "admin"이라는 계정의 upw를 알아내봅시다.
우선, 우리는 첫번재 쿼리문으로 인해 출력되는 테이블의 칼럼은 "uid" 하나밖에 없다는 것을 알고있으면서
알고싶은 정보의 칼럼 이름이 "upw"라는 것도 알고 있습니다.
이런 상황이라면 UNION SQL injection을 시도하기가 쉬워집니다.
정답은 다음과 같습니다.
![](https://blog.kakaocdn.net/dn/cLtaRz/btqFBeEgRM7/VEEfRmLFforSeM7SjDiFe0/img.png)
1. 입력받는 uid는 아무값이나 와도 상관없으니 따옴표로 닫아준다.
2. UNION SELECT 다음 우리가 원하는 정보인 upw를 넣는다.
3. FROM 다음 테이블 명을 넣는다.
4. WHERE 조건문으로 uid가 "admin"인 것의 upw를 출력할 것을 설정한다.
5. '#'(주석)으로 upw를 입력받는 곳과 관련된 나머지 쿼리문을 주석처리하여 없앤다.
SELECT uid FROM user_table WHERE uid='' UNION SELECT upw FROM user_table WHERE uid='admin' -- and...
이상으로 Union Based SQL Injection에 대해 알아보았습니다.
다음에는 이를 기반으로 칼럼명과 테이블명을 알아내는 방법에 대해 알아보도록 하겠습니다.
'Web > Web Hacking' 카테고리의 다른 글
[Web Hacking] - Blind SQL Injection_2. 테이블명 수집(2) (0) | 2020.07.20 |
---|---|
[Web Hacking] - Blind SQL Injection_2. 테이블명 수집(1) (2) | 2020.07.18 |
[Web Hacking] - Blind SQL Injection_1. DB 버전 수집 (0) | 2020.07.17 |