본문 바로가기

1. Web hacking (웹 해킹)/2) 개념 정리

[25.04.04]웹 떠봐요 2주차 활동

1. SQL Injection

SQL Injection은 웹 애플리케이션에서 사용자 입력을 적절히 검증하지 않을 경우 발생하는 보안 취약점이다. 공격자는 악의적인 SQL 쿼리를 주입하여 데이터베이스의 정보를 조회하거나 조작할 수 있다.

 

2. SQL Injection 유형

SQL Injection은 다양한 방식으로 발생할 수 있으며, 대표적인 유형은 다음과 같다.

 

1) Union-based SQL Injection

UNION SELECT구문을 활용하여 추가적인 데이터를 조회하는 방식

예시: ' UNION SELECT username, password FROM users --

이 공격을 통해 다른 테이블의 정보를 가져올 수 있음

2) Boolean-based Blind SQL Injection

/거짓 결과에 따라 응답이 달라지는 점을 이용하여 데이터를 추측하는 방식

예시: ' OR 1=1 --

참이면 정상 응답, 거짓이면 오류 발생하는 점을 이용

3) Time-based Blind SQL Injection

데이터베이스의 응답 시간을 이용하여 정보를 유추하는 방법

예시: ' OR IF(SUBSTRING((SELECT database()),1,1)='a', SLEEP(5), 0) --

조건이 참이면 서버가 일정 시간 동안 응답하지 않음

4) Error-based SQL Injection

데이터베이스의 오류 메시지를 이용하여 정보를 획득하는 기법

예시: ' AND (SELECT 1/0) --

오류 메시지를 통해 테이블 및 컬럼 정보를 유추할 수 있음

 

3. SQL Injection 실습 (DreamHack 예제)

드림핵의 SQLi 실습에서는 공격자가 SQLi를 통해 데이터를 탈취하는 과정을 직접 체험할 수 있다. 주요 실습 내용은 다음과 같다.

 

1) 취약한 로그인 우회

SQL Injection을 이용하여 인증을 우회하는 방법

입력값: admin' --

비밀번호 입력 없이 로그인 가능(아무 문자를 입력해도 해결 가능)

 

2) 데이터베이스 정보 획득

UNION SELECT를 활용하여 DB 정보를 가져오는 방법

입력: ' UNION SELECT schema_name, null FROM information_schema.schemata --

 

3) 테이블 및 컬럼 정보 조회

information_schema를 이용하여 테이블과 컬럼 정보를 확인하는 방법

입력: ' UNION SELECT table_name, column_name FROM information_schema.columns WHERE table_schema='database_name' --

 

 

4. 드림핵 SQL Injection 워게임 문제

 

(1) Basic SQLi 문제

로그인 우회를 통해 관리자 계정에 접근하는 기본적인 문제

주어진 로그인 폼에 다음 입력값을 넣으면 관리자 계정으로 로그인 가능

' OR 1=1 --

 

(2) Blind SQLi 문제

화면에 직접적인 오류 메시지가 표시되지 않지만, /거짓을 이용하여 데이터를 추출하는 문제

IF문과 SLEEP함수를 이용하여 데이터베이스 이름을 알아낼 수 있음

' OR IF(SUBSTRING((SELECT database()),1,1)='a', SLEEP(5), 0) --

서버 응답 시간이 지연되면 첫 글자가 'a'임을 알 수 있음

 

(3) Advanced SQLi 문제

UNION SELECT를 이용하여 특정 테이블의 데이터를 추출하는 문제

예제 입력값: ' UNION SELECT username, password FROM users --

사용자 정보 테이블을 유출할 수 있음

 

5. SQL Injection 방어 방법

SQLi를 방어하기 위해 개발자는 다음과 같은 방어 방법 적용해야함

 

(1) 입력값 검증

사용자 입력을 검증하고 허용된 값만 처리

예시: preg_match()또는 정규 표현식을 활용하여 필터링

 

(2) Prepared Statements (준비된 쿼리)

SQL 쿼리를 미리 준비하고, 사용자 입력을 안전하게 삽입하는 방식

예제 코드 (PHP, MySQL):

$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ? AND password = ?");

$stmt->execute([$username, $password]);

 

 

(3) 최소 권한 원칙 적용

DB 계정에 최소한의 권한만 부여하여 피해를 줄임

예시: SELECT권한만 부여하고 DROP, UPDATE권한 제한

 

(4) WAF(Web Application Firewall) 적용

웹 방화벽을 통해 SQLi 공격 패턴을 탐지하고 차단