Server Side Attack - SQL Injection/Directory Traversal

RINM·2022년 10월 2일
0

Web-Hacking

목록 보기
2/3

1. SQL Injection

1. SQL (Structured Query Language)

1) DDL (Data Definition Language)

데이터베이스 생성, 수정, 삭제 명령어

  • create: 데이터베이스 오브젝트 생성
  • alter: 데이터베이스 오브젝트 변경
  • drop: 데이터베이스 오브젝트 삭제
  • truncate: 데이터베이스 오브젝트의 내용 삭제

2) DML (Data Manipulation Language)

데이터베이스 조회, 수정, 삭제, 추가 명령어

  • select: 데이터베이스 컬럼 검색
  • update: 데이터베이스 컬럼 수정
  • delete: 데이터베이스 컬럼 삭제
  • insert: 데이터베이스 컬럼 추가

3) DCL (Data Control Language)

데이터베이스 권한 부여/해제, 작업 저장/취소 명령어

  • grant: 데이터베이스 권한 부여
  • revoke: 데이터베이스 권한 해제
  • commit: 데이터 베이스를 물리 디스크에 저장
  • rollback: 데이터베이스 작업을 복구

2. SQL Injection

1) 개요

악성 SQL문을 삽입하여 데이터베이스의 비정상적인 동작을 유도하는 공격

2) SQL Injection 목적

  • SELECT문의 결과를 조작
  • 데이터베이스의 정보 획득
  • 데이터베이스의 정보 조작

3. SQL Injection 기법

1) Retrieving hidden data

SQL 쿼리를 수정하여 추가 정보 추출

PortSwigger Lab: SQL injection vulnerability in WHERE clause allowing retrieval of hidden data

목표 SQL 쿼리문

SELECT * FROM products WHERE category = 'Gifts' --

뒤이어 오는 AND 문을 주석처리하여 해당 카테고리의 상품을 구분 없이 모두 출력하게 유도

2) Subverting applicaion logic

논리적 결함을 만들어서 Application의 논리적 흐름 변조

PortSwigger Lab: SQL injection vulnerability allowing login bypass

목표 SQL 쿼리문

SELECT * FROM users WHERE username = administrator --

패스워드 조건 무시

3) UNION attacks

다른 데이터베이스 테이블의 데이터 추출

Portswigger Lab: SQL injection UNION attack, retrieving data from other tables

목표 SQL 쿼리문

SELECT name,description FROM products WHERE category='Gifts' UNION SELECT username, password FROM users --

UNION을 통하여 users테이블에 있는 컬럼 2개의 정보 추가 출력

4) Examining the database

데이터베이스 버전, 구조 등 정보 추출

PortSwigger Lab: SQL injection attack, querying the database type and version on MySQL and Microsoft

목표 SQL 쿼리문

SELECT name,description FROM products WHERE category='Gifts' UNION SELECT @@version, NULL --

두개의 칼럼 중 하나에 데이터베이스의 버전정보를 담아 추가 출력
이때, 칼럼 개수를 맞추기 위하여 다른 한 칼럼에는 NULL을 입력한다.

5) Blind SQL injection

응답값을 통하여 데이터베이스 내용 유추

서버의 응답값을 보고 입력값을 적절하게 조작하여 정보를 탈취한다.

PortSwigger Lab: Blind SQL injection with conditional responses

패스워드 값을 알아내기 위하여 Blind SQL Injection 기법을 활용한다.

Burpsuite를 사용하여 cookie 값을 확인한다.

Cookie에 포함된 TrackingId 값을 조작하여 Injection을 수행한다. Burpsuite의 repeater기능을 사용한다. 정상적인 row값에 대한 내용일 경우(SQL쿼리문에서 true값이 반환될 경우) respones 값에 다음과 같이 "Welcome back!"이 포함된다.

반면 false 값인 경우 해당 문자열이 없는 페이지가 반환된다.

패스워드 유추를 위하여 자리값을 확인한다.

조작된 SQL 쿼리문

SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>1)='a'

패스워드의 자릿수가 1이상인 경우 True를 반환한다. 위 request를 계속 수정하여 자리값을 찾는다. 숫자를 계속 늘려가다보면 20에서 false가 반환된다.

즉 패스워드의 자릿수는 20이다.
이제 각 자리에 해당되는 문자를 찾는다. 문자의 범위는 a~z, 0~9로 제한한다. 다음과 같은 쿼리문을 Burpsuite의 intruder 기능을 활용하여 문자를 바꾸어 가며 응답 값을 확인한다.

(SELECT SUBSTRING(password,1,1) FROM users WHERE username='administrator')='a'

첫번째 자리의 패스워드는 'a'이다.

응답값에 포함된 문자열뿐만아니라 응답값의 길이로 쉽게 True반환 여부를 알 수 있다.
다른 자리에도 같은 행위를 반복하여 20자리의 패스워드를 모두 찾는다.

🚩 aoi9jpdhdy5ibsobm0pa

4. SQL Injection 방어

1) Prepared Statement 구문사용

Prepared Statement 구문을 사용하면 사용자의 입력값이 쿼리로 곧바로 들어가지 않고 문자열로 컴파일된다. 즉, 쿼리문에서 사용자 입력은 파라미터의 하나로 취급될 뿐 문자열 속의 명령어는 명령어로 기능하지 못한다.

2) 입력값 검증

키워드 검열을 통하여 SQL Injection 공격 가능성이 있는 키워드(SELECT, UNION) 등을 서버에서 차단한다. 주로 화이트리스트 기법을 사용한다.

3) Error Message 노출 차단

Blind SQL Injection 등 예기치 못한 메시지가 공격자에게 정보를 추는 것을 차단한다. SQL 쿼리 문에서 발생한 에러값이 웹 페이지를 통하여 노출될 경우 이 메시지 정보가 악용될 수 있다. 이를 막기 위하여 오류 발생 메시지를 따로 제작하여 정보 노출을 최소화한다.

5. SQL Injection Oneday Attack

Blind SQL Injection 기법을 사용하여 데이터베이스의 xp_cmdshell 기능에 접근하였다. 이를 통하여 시스템 커맨드를 실행하였으며 그 결과값은 DNS-based exfiltration을 통하여 얻어낸 공격. 출처

2. Directory traversal

1. 개요

서버에 존재하는 임의의 파일을 읽는 공격. 공격자가 서버의 파일시스템에 접근할 수 있는 경우 경로 조작을 통하여 허가되지 않은 곳의 파일을 읽을 수 있다. 경우에 따라 파일 수정이 가능한 경우 서버를 제어하려는 시도로 이어질 수 있다.

2. PortSwigger 예제

Portswigger Lab: File path traversal, simple case

파일 이미지의 경로값을 조작하여 /etc/passwd 파일에 접근한다.

0개의 댓글