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 공격 패턴을 탐지하고 차단
'1. Web hacking (웹 해킹) > 2) 개념 정리' 카테고리의 다른 글
[24.11.02] XSS(Cross-Site Scripting) / 파라미터 변조 (0) | 2024.11.08 |
---|---|
[24.10.26] SQL Injectio (0) | 2024.11.01 |
[24.09.28] OS Command Injection & XXE Injection (0) | 2024.10.04 |
[24.09.21] 실습 환경 세팅 & 웹 해킹에 대한 이해 (0) | 2024.09.26 |
[2023.05.20] URL 접근 제한 미흡 취약점 (0) | 2023.05.25 |