정보보안핵심 · 18분 읽기

SQL 인젝션: 데이터와 명령의 경계

SQL 인젝션은 입력값이 SQL 문법의 일부로 해석될 때 발생한다. 매개변수화와 최소 권한을 중심으로 원인과 방어를 이해한다.

개념부터 찾아보기

정의·역할·동작 원리를 독립 페이지에서 확인하세요. 본문의 밑줄 용어에도 설명이 있습니다.

이 노트에서 설명할 수 있게 되는 것

  1. 문자열 결합과 매개변수 바인딩의 처리 차이를 설명한다.
  2. 값 자리와 SQL 구조 요소를 구분한다.
  3. 응답 차이·DB 오류·권한을 연결해 영향 범위를 판단한다.

01개념과 구성 요소

  • 외부 값이 문자열에 합쳐져 데이터가 아닌 문법으로 해석되면 쿼리 구조가 변할 수 있다.
  • HTTP 입력, 애플리케이션의 쿼리 생성, DB 파서, DB 계정 권한, 결과 출력이 연결된다.
  • 값은 바인딩하고 구조 선택은 으로 제한한다. DB 최소권한과 비밀번호 검증은 별도 방어층이다.

02조회 입력이 DB 결과가 되는 순서

  1. 서버가 GET·POST·세션 등 실제 입력 위치를 읽고 필요한 정규화와 형식 검증을 수행한다.
  2. 개발자가 고정한 구조를 선택한다. 문자열 연결 방식은 외부 값이 문법에 들어갈 수 있는 지점이다.
  3. prepare/execute 등 드라이버가 지원하는 인터페이스로 값을 전달한다. 값 을 테이블명·정렬 구문에 대신 쓰지 않는다.
  4. DB가 애플리케이션 계정의 권한 안에서 문장을 처리한다. 가 DB의 모든 권한을 자동으로 우회하는 것은 아니다.
  5. 결과 행을 업무 규칙에 맞게 사용하고 안전하게 출력한다. 단순히 행이 있다는 이유만으로 비밀번호 검증을 대신하지 않는다.

03입력이 데이터에서 SQL 문법으로 넘어가는 지점

  • 은 DB가 사용자 입력이라는 출처를 자동으로 기억하지 않는다는 점에서 시작한다. 애플리케이션이 외부 값을 문자열에 연결하여 완성된 문장을 DB에 보내면 파서는 전체를 문법으로 해석한다.
  • 따옴표는 문자열의 경계, OR는 조건 연산, 주석은 뒤 문법을 무시하는 역할을 하므로 입력이 구조를 바꿀 수 있다.
  • 아래 비교의 목적은 요청값이 최종 과 어떻게 연결되는지 보는 것이다. 정상 이름에 작은따옴표가 들어오는 경우에도 문자열 연결 방식은 깨질 수 있다.
  • 취약점의 기준은 특수문자의 존재 자체가 아니라 값으로만 쓰여야 할 내용이 구문이 되는 경계다.
$id = $_GET["id"];
// 취약한 구조: 데이터가 SQL 문자열 일부가 된다.
$sql = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";

// 매개변수 방식: 쿼리 구조와 값을 API에서 분리한다.
$stmt = $pdo->prepare(
  "SELECT first_name, last_name FROM users WHERE user_id = ?"
);
$stmt->execute([$id]);

원문의 PDO 비교를 실제 주소·계정 없이 재구성했다. 두 예시는 구조 비교이며 원본 코드를 실행하지 않았다.

04WHERE는 행마다 조건을 평가한다

  • WHERE는 각 행의 조건을 평가해 참인 행을 결과에 남긴다. DB가 단순히 boolean 한 개만 애플리케이션에 반환하는 것이 아니다.
  • 정상 user_id=1 조건이 특정 행만 고르는 것과 OR 1=1 조건이 모든 행에서 참이 되는 것은 결과 집합의 차이다. 문자열 리터럴을 닫는 따옴표와 조건을 추가하는 연산자의 역할을 분리하면 변화가 보인다.
  • 학습용 예에서는 실제 사용자 데이터 대신 세 개의 가상 행을 생각할 수 있다. ID 1,2,3 가운데 WHERE id=1은 첫 행을 남기지만 WHERE id=1 OR 1=1은 세 행을 남긴다.
  • 이 결과를 로그인 성공 여부로 잘못 사용하면 비밀번호 검증이 생략되는 별도의 애플리케이션 오류와 연결될 수 있다.
-- 가상 테이블에 대한 SQL 의미 비교
SELECT label FROM demo_items WHERE id = 1;
SELECT label FROM demo_items WHERE id = 1 OR 1 = 1;

-- 첫 번째: id=1인 행
-- 두 번째: 조건이 모든 행에서 참

조건식의 결과 집합을 보여 주는 교육용 이다. 외부 대상으로 보내는 공격 요청이 아니다.

05로그인 쿼리와 비밀번호 검증의 위치

  • 사용자명 뒤에 평문 비밀번호 조건을 문자열로 붙인 로그인 쿼리는 주입된 주석에 의해 뒤 조건이 무효화될 수 있다. 입력이 문자열을 닫고 나머지를 주석으로 만들면 애플리케이션은 의도하지 않은 행을 받을 수 있다.
  • 여기에 “행이 있으면 로그인 성공”이라는 처리까지 있으면 인증 상태가 잘못 만들어진다.
  • 안전한 흐름은 매개변수로 계정을 조회하고 서버의 비밀번호 검증 함수로 저장된 비밀번호 해시와 입력을 확인한 뒤 세션을 발급하는 것이다. 매개변수화와 비밀번호 해시 검증은 서로 다른 문제를 해결한다.
  • 계정이 없을 때와 비밀번호가 틀릴 때의 외부 오류 차이를 줄이는 것도 정보 노출을 제한하는 별도의 설계다.

06UNION이 합치는 것은 같은 모양의 결과 집합이다

  • UNION은 두 SELECT의 결과를 연결한다. 양쪽 열 수가 같고 위치별 자료형이 호환되어야 하며 UNION은 중복을 제거하고 UNION ALL은 유지한다.
  • 첫 SELECT의 WHERE는 두 번째 SELECT에 자동 상속되지 않는다. 따라서 애플리케이션이 첫 쿼리에만 걸어 둔 행 제한과 별개로 다른 결과를 같은 화면 통로에 실을 수 있다.
  • 111·222 같은 상수 표식은 화면에 결과의 어느 열이 표시되는지 구분하는 데 사용할 수 있다. 실제 비밀번호나 테이블 자료 대신 두 개의 상수만으로도 출력 통로를 설명할 수 있다.
  • ORDER BY의 숫자 위치 오류는 결과 열 위치에 대한 단서이며 테이블에 정의된 모든 컬럼 수를 직접 알려 주는 것은 아니다.
SELECT '원래 결과' AS label, '표시 값' AS detail
UNION ALL
SELECT '표식 A', '표식 B';

UNION의 열 수·표시 위치를 설명하는 가상 상수 예제다.

07애플리케이션 권한과 DB 계정 권한은 다르다

  • 로 사용자가 웹 화면에서 허용되지 않은 데이터를 보더라도 DB의 GRANT 자체를 무조건 우회한 것은 아니다. 주입된 쿼리는 보통 애플리케이션 DB 계정의 권한으로 실행된다.
  • 그 계정이 모든 사용자의 행을 읽을 수 있는데 웹 코드가 사용자별 범위를 담당하고 있었다면 쿼리 구조 변조로 그 제한이 깨질 수 있다.
  • SECURITY DEFINER 뷰는 정의된 권한 문맥에서 기반 데이터를 읽을 수 있고 INVOKER는 호출자 권한 문맥을 사용한다. 뷰에 위임된 접근과 권한 없는 테이블을 마법처럼 읽는 것은 다르다.
  • 최소권한은 주입 자체를 없애지는 않지만 파일 기능·다른 스키마·관리 작업으로 피해가 확장되는 범위를 제한한다.

08응답에 보이는 유형과 보이지 않는 유형

  • In-band 유형에서는 같은 요청의 응답에 결과나 DB 오류가 나타난다. Error-based는 오류 내용이나 오류의 유무가 단서가 되고 UNION-based는 결과 집합의 출력 통로를 이용한다.
  • 상세 오류를 숨기면 일부 정보가 사라지지만 입력이 구문이 되는 설계가 그대로라면 취약점은 남는다.
  • Blind 유형에서는 결과가 직접 보이지 않아도 참·거짓에 따른 본문 길이, 문구, JSON 필드, 리다이렉트나 시간 차이가 단서가 된다. 는 안정적인 응답 차이를, 는 조건에 따른 지연을 관찰한다.
  • 네트워크 지연·캐시·개인화와 DB 조건의 효과를 구분해야 하며 한 번 느린 응답을 취약점 확정으로 해석하지 않는다.

09GET·POST·세션을 재현하지 못하면 다른 기능을 시험한다

  • 예제의 id는 GET 쿼리에 있고 의 author는 POST 본문에 있었다. 같은 URL만 복사하고 본문을 빼면 원래 기능과 다른 요청이다.
  • 로그인 Cookie나 보안 단계, 토큰이 달라져도 서버가 실행하는 경로가 달라진다. 도구의 취약점 판정 이전에 정상 요청이 같은 기능까지 도달하는지가 중요하다.
  • 302 로그인 이동, 반복 404, 다른 보안 단계는 취약점 유무보다 요청 재현 실패를 먼저 설명할 수 있다. 자동 도구의 Parameter·Type·Title· 필드는 추정 결과를 요약하지만 데이터에 대한 근거와 성공 조건을 대신하지 않는다.
  • 과도한 요청이나 데이터 덤프 없이 가상 표식과 정상 대조군으로 원리와 수정 효과를 읽을 수 있다.
text
POST /training/search HTTP/1.1
Host: app.example
Content-Type: application/x-www-form-urlencoded
Cookie: sid=<가상 세션>

author=sample-user&action=search

응답 비교: 상태 코드 / 리다이렉트 / 본문 구조 / 요청 ID

본문 가 URL과 별도로 존재한다는 점을 보여 주는 가상 정상 요청이다.

10URL 문법과 SQL 주석 문법을 구분하기

  • 브라우저 URL의 # 뒤 조각은 일반적으로 서버 요청 대상으로 전송되지 않는다. DB에서 #이 주석 문법으로 쓰이는 경우와는 다른 파서의 동작이다.
  • 또한 계열의 -- 주석은 뒤 공백 또는 제어문자 조건이 있고 다른 의 문법은 다를 수 있다. 문자 하나가 어디서 해석되는지를 명확히 해야 서버에 실제 도달한 값을 이해할 수 있다.
  • 이 차이를 근거로 특정 주석 문자열을 차단하는 것은 근본 방어가 아니다. 입력이 숫자·문자열· 중 어느 문맥에 놓였는지와 드라이버의 처리 방식에 따라 구조가 달라진다.
  • URL 디코딩과 문자열 정규화 뒤 실제 값이 무엇인지 로그와 소스의 대응 관계로 추적한다.

11매개변수로 묶을 수 없는 구조는 허용 목록으로 선택한다

  • 매개변수는 값 자리를 위한 것이며 테이블명·컬럼명·정렬 방향을 임의로 바인딩하여 문법으로 사용하는 인터페이스가 아니다. 정렬 옵션이 필요하면 외부의 짧은 선택값을 서버가 정한 컬럼 표현에 매핑한다.
  • ORM을 사용해도 raw 문자열에 입력을 연결하면 같은 경계 문제가 다시 생긴다.
  • PDO prepare와 execute의 API 분리는 학습 원리다. 모든 드라이버가 네트워크에서 구조와 값을 반드시 두 개의 독립 메시지로 보내는 것은 아니며 네이티브·에뮬레이션 설정도 실제 구현에 영향을 준다.
  • 사용 중인 드라이버가 지원하는 방법으로 구조를 분리하고 그 위에 DB 최소권한과 외부 오류 제한을 결합한다.
$sortMap = [
  "name" => "display_name",
  "recent" => "created_at"
];
$column = $sortMap[$_GET["sort"] ?? "recent"] ?? "created_at";
$sql = "SELECT display_name FROM demo_users ORDER BY " . $column;

외부 문자열을 그대로 로 쓰지 않고 서버의 고정 후보로 매핑하는 예제다.

원리 심화

12쿼리 구조·매개변수 값·검색 의미의 분리

  • 매개변수화된 쿼리는 구조를 고정하고 값을 별도로 전달한다. DB 드라이버의 API와 실제 동작에 맞게 사용해야 한다.
  • 테이블명·열 이름·정렬 방향은 일반 값 매개변수 자리가 아니다. 외부 문자열을 직접 이어 붙이지 않고 서버가 정한 선택지로 매핑한다.
  • IN 조건의 여러 값은 필요한 수의 매개변수 자리를 만들거나 DB가 지원하는 배열 방식을 사용한다. 쉼표가 든 문자열 하나를 여러 값으로 착각하지 않는다.
  • LIKE의 %와 _는 값 안에서도 패턴 의미가 있다. 구문 주입 방지와 사용자가 의도한 문자 그대로 검색하는 처리는 별개다.
  • 안전한 도 과도한 DB 권한이나 잘못된 업무 조건을 보완하지 못한다. 조회·변경 범위는 계정 권한과 조건식에서 따로 제한한다.
예제로 추적

13가상 이름 검색에서 따옴표와 와일드카드 비교

  1. 가상 쿼리는 SELECT id FROM people WHERE name = ? 이고 값은 O'Reilly라고 가정한다.
  2. 작은따옴표는 문자열 값의 일부로 전달된다. 사용자가 보낸 문자 때문에 WHERE 뒤의 구조가 새로 만들어지지 않는다.
  3. 쿼리를 name LIKE ?로 바꾸고 A%를 전달하면 A로 시작하는 이름을 찾는다. 이는 정상 LIKE 의미이며 주입 성공의 증거가 아니다.
  4. 실제 A%라는 이름만 찾으려면 DB의 ESCAPE 문법과 애플리케이션 정책에 맞춰 패턴 특수 문자를 처리해야 한다.
  5. 결과 행· 값·고정 쿼리 형태를 비교한다. 오류가 안 났다는 사실만으로 쿼리 구조가 안전하게 고정되었는지 알 수는 없다.
검증·예외

14바인딩을 썼는데도 결과가 다른 경우

  • 일부 조건은 바인딩하면서 정렬·검색 연산자·조건 조각을 외부 입력으로 연결하고 있지 않은지 최종 쿼리 구성을 본다.
  • 문자열과 숫자의 자동 변환·NULL·빈 문자열이 DB별로 다르게 비교될 수 있다. 타입과 업무 규칙을 입력 검증에 명시한다.
  • 문자셋·드라이버의 에뮬레이션 설정·다중 문장 허용 등 실제 연결 옵션을 확인한다. 다른 환경의 결과를 그대로 적용하지 않는다.
  • DB 오류 원문에는 스키마·쿼리·내부 경로가 포함될 수 있다. 사용자에게는 제한된 오류를, 내부에는 상관 ID로 연결한 진단 자료를 남긴다.

15수정 결과는 쿼리 구조와 정상 기능에서 드러난다

  • 수정 후 같은 따옴표 포함 이름이 정상 데이터로 저장·검색되고 조건식 모양의 입력도 문자열 값으로만 취급되어야 한다. 오류가 사라졌다는 사실만으로는 충분하지 않다.
  • 화면 출력이 끊겼거나 요청을 전부 막아도 오류는 보이지 않을 수 있기 때문이다. 소스의 , DB 계정 권한, 정상 결과와 변조 입력의 결과를 함께 연결한다.
  • 재현 자료에는 메서드·입력 위치·인증 문맥, 최종 구조, 애플리케이션과 DB의 권한 경계, 응답 관찰값을 연결한다. 같은 입력에 대한 결과가 바뀐 이유를 쿼리의 구조로 설명하면 자동 도구의 성공·실패 표시와 무관하게 수정의 효과를 해석할 수 있다.
  • 실제 DB 오류는 내부에서 요청 ID와 연결하되 비밀값은 불필요하게 남기지 않는다.

설명과 함께 보는 보조 도식

메시지 순서

모식도 · SQL 구조와 값의 분리

매개변수 API의 논리적 처리 흐름이며 실제 전송 메시지 수를 나타내지 않는다.

애플리케이션DB 드라이버DB 엔진1. 구조 전달2. 안전한 바인딩3. 권한과 실행4. 결과 반환
전체 단계를 한 번에 읽기
  1. 01

    구조 전달

    값 자리를 가진 쿼리와 별도의 입력값을 API에 전달한다.

    입력의 역할
    데이터 값
  2. 02

    안전한 바인딩

    드라이버의 지원 방식으로 값과 문법의 경계를 보존한다.

  3. 03

    권한과 실행

    DB 계정 권한 안에서 쿼리를 처리한다.

    정렬·컬럼명
    별도 허용 목록 필요
  4. 04

    결과 반환

    행 데이터 또는 일반화한 오류와 추적 가능한 내부 기록을 남긴다.

메시지와 상태 변화를 단순화한 학습용 모식도입니다. 생략한 메시지와 예외는 본문의 설명을 함께 확인하세요.
LEARN THROUGH PRACTICE

DVWA의 문자열 결합 쿼리와 결과 열을 연결하기

입력→ 문자열→DB 결과→화면의 연결을 읽고, 이 바꾸는 경계를 설명한다.

실습 구성과 전제

  • 격리된 의 폐기 가능한 데이터베이스를 사용한다.
  • 사진은 구형 · 코드다. 현재 서비스에 복사하지 않고 원리 비교 자료로만 읽는다.
  1. 입력이 SQL 문법 안으로 들어가는 위치를 찾는다

    • 소스에서 GET의 id를 읽은 뒤 WHERE user_id = '$id'에 그대로 넣는 흐름을 따라간다. 따옴표와 변수 값이 하나의 문자열로 합쳐진다.
    • mysql_query 계열은 구형 API다. 보안 교정은 다른 함수 이름으로 바꾸는 것만이 아니라 값과 쿼리 구조를 분리해야 한다.
    SQL Injection 실습 · 실습환경 (2)원본 크기로 보기 ↗
    • $_GET['id']가 SELECT 문자열에 연결되고 mysql_query로 실행된다.
    • 반복문은 결과 열 first_name·last_name을 화면에 출력한다. DB 결과의 두 열과 표시 위치를 연결할 수 있다.
    확인 기준

    문자열 결합 지점과 출력 지점을 각각 표시한다.

  2. 결과 열의 모양이 유지되는 이유를 읽는다

    • 교육 화면은 UNION으로 결합된 두 열이 기존 이름·성 표시 위치에 나타나는 사례다. 결과 집합의 열 수와 호환 가능한 형식이 맞아야 결합될 수 있다.
    • 조회에 사용하는 DB 계정의 권한이 넓으면 애플리케이션이 의도하지 않은 자료도 결과에 섞일 수 있다. 화면의 테스트 해시를 다시 배포하지 않는다.
    SQL Injection 실습 · 실습환경 (4)원본 크기로 보기 ↗
    • User ID 입력 뒤 여러 행이 표시되고 First name·Surname 위치에 계정명과 해시 형태의 값이 나타난다.
    • 표시 레이블은 여전히 이름·성이다. 화면 레이블이 데이터의 실제 의미나 안전성을 보증하지 않는다.
    확인 기준

    한 결과 화면만으로 데이터베이스 전체 권한이나 모든 공격 유형의 성공을 일반화하지 않는다.

  3. 정상 조회를 유지하면서 구조를 고정한다

    • 준비된 쿼리의 값 자리에 사용자 입력을 바인딩한다. 정렬 열처럼 바인딩할 수 없는 구조는 으로 고른다.
    • 정상 ID·존재하지 않는 ID·따옴표 포함 입력을 비교하고 오류 내용이나 다른 행이 노출되지 않는지 확인한다.
    cursor.execute('SELECT first_name, last_name FROM users WHERE user_id = %s', (user_id,))

    DB-API 드라이버가 %s 을 지원한다는 조건의 비교 코드. 문자열 포매팅으로 직접 치환하지 않는다.

    확인 기준

    정상 기능이 유지되고 입력이 쿼리 문법으로 해석되지 않아야 한다.

실습에서 확인한 동작 원리

  • UNION 결과는 기존 출력 열을 통해 보일 수 있다.
  • 과 DB 최소 권한은 서로 다른 방어층이다.

설정·출력 추가로 확인하기 22장

아래 화면을 펼쳐 위 실습의 설정값, 명령과 확인 기준을 비교해 보세요. 각 묶음은 별도 실습 기록입니다.

실습 화면 묶음 01 5장
FTP · 실습·개념 참고 화면 4원본 크기로 보기 ↗
  • 「SQL INJECTION」 문맥에 삽입된 원본 실습·개념 참고 화면이다. SQL 인젝션 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
FTP · 실습·개념 참고 화면 8원본 크기로 보기 ↗
  • 「SQL INJECTION」 문맥에 삽입된 원본 실습·개념 참고 화면이다. SQL 인젝션 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
FTP · 패킷 캡처 5원본 크기로 보기 ↗
  • 「SQL INJECTION」 문맥에 삽입된 원본 패킷 캡처이다. SQL 인젝션 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
FTP · 패킷 캡처 6원본 크기로 보기 ↗
  • 「SQL INJECTION」 문맥에 삽입된 원본 패킷 캡처이다. SQL 인젝션 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
FTP · 패킷 캡처 7원본 크기로 보기 ↗
  • 「SQL INJECTION」 문맥에 삽입된 원본 패킷 캡처이다. SQL 인젝션 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
실습 화면 묶음 02 2장
SQL Injection 실습 · 실습환경 (1)원본 크기로 보기 ↗
  • 수업 원본 자료 · 격리된 웹 실습에서 입력에 따른 SQL 처리와 응답 차이. 원문에서 「실습환경」에 배치된 그림 또는 화면이다.
SQL Injection 실습 · 실습환경 (3)원본 크기로 보기 ↗
  • 수업 원본 자료 · 격리된 웹 실습에서 입력에 따른 SQL 처리와 응답 차이. 원문에서 「실습환경」에 배치된 그림 또는 화면이다.
실습 화면 묶음 03 2장
ruleset · 실습·개념 참고 화면 1원본 크기로 보기 ↗
  • 「SQL Injection」 문맥에 삽입된 원본 실습·개념 참고 화면이다. SQL 인젝션 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
ruleset · 실습·개념 참고 화면 2원본 크기로 보기 ↗
  • 「SQL Injection」 문맥에 삽입된 원본 실습·개념 참고 화면이다. SQL 인젝션 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
실습 화면 묶음 04 1장
격리 환경의 SQL 인젝션 관찰원본 크기로 보기 ↗
  • 학습 원본 · 격리 환경의 SQL 인젝션 관찰의 해당 절에 수록된 화면·도식이다.
실습 화면 묶음 05 1장
격리 환경의 SQL 인젝션 관찰원본 크기로 보기 ↗
  • 학습 원본 · 격리 환경의 SQL 인젝션 관찰의 해당 절에 수록된 화면·도식이다.
실습 화면 묶음 06 1장
격리 환경의 SQL 인젝션 관찰원본 크기로 보기 ↗
  • 학습 원본 · 격리 환경의 SQL 인젝션 관찰의 해당 절에 수록된 화면·도식이다.
실습 화면 묶음 07 1장
격리 환경의 SQL 인젝션 관찰원본 크기로 보기 ↗
  • 학습 원본 · 격리 환경의 SQL 인젝션 관찰의 해당 절에 수록된 화면·도식이다.
실습 화면 묶음 08 1장
격리 환경의 SQL 인젝션 관찰원본 크기로 보기 ↗
  • 학습 원본 · 격리 환경의 SQL 인젝션 관찰의 해당 절에 수록된 화면·도식이다.
실습 화면 묶음 09 1장
격리 환경의 SQL 인젝션 관찰원본 크기로 보기 ↗
  • 학습 원본 · 격리 환경의 SQL 인젝션 관찰의 해당 절에 수록된 화면·도식이다.
실습 화면 묶음 10 1장
격리 환경의 SQL 인젝션 관찰원본 크기로 보기 ↗
  • 학습 원본 · 격리 환경의 SQL 인젝션 관찰의 해당 절에 수록된 화면·도식이다.
실습 화면 묶음 11 1장
격리 환경의 SQL 인젝션 관찰원본 크기로 보기 ↗
  • 학습 원본 · 격리 환경의 SQL 인젝션 관찰의 해당 절에 수록된 화면·도식이다.
실습 화면 묶음 12 1장
격리 환경의 SQL 인젝션 관찰원본 크기로 보기 ↗
  • 학습 원본 · 격리 환경의 SQL 인젝션 관찰의 해당 절에 수록된 화면·도식이다.
실습 화면 묶음 13 1장
격리 환경의 SQL 인젝션 관찰원본 크기로 보기 ↗
  • 학습 원본 · 격리 환경의 SQL 인젝션 관찰의 해당 절에 수록된 화면·도식이다.
실습 화면 묶음 14 1장
격리 환경의 SQL 인젝션 관찰 · Sql Blind Injection원본 크기로 보기 ↗
  • 학습 원본 · 격리 환경의 SQL 인젝션 관찰의 Sql Blind Injection에 수록된 화면·도식이다.
실습 화면 묶음 15 1장
격리 환경의 SQL 인젝션 관찰 · Sql Blind Injection원본 크기로 보기 ↗
  • 학습 원본 · 격리 환경의 SQL 인젝션 관찰의 Sql Blind Injection에 수록된 화면·도식이다.
실습 화면 묶음 16 1장
격리 환경의 SQL 인젝션 관찰 · Sql Blind Injection원본 크기로 보기 ↗
  • 학습 원본 · 격리 환경의 SQL 인젝션 관찰의 Sql Blind Injection에 수록된 화면·도식이다.
동작·명령 참고 문서
READ · OBSERVE · CONNECT

함께 보는 학습 자료

아래 공식 자료를 본문의 개념·예제와 함께 읽어 보세요. 자료별로 확인할 위치와 관찰할 내용을 적었습니다.

실습 가이드

DVWA SQLi Low: 입력이 질의 문자열에 들어가는 위치

에서 id를 읽는 지점과 문자열 생성 지점을 코드로 연결한다.

읽으면서 확인할 것
  • 요청 id의 취득 위치
  • 문자열 연결이 만드는 데이터· 구문 경계
  • DB 종류별 분기와 실제 선택된 코드 경로
실습 가이드

DVWA SQLi Impossible: 검사와 바인딩의 역할

Low와 나란히 읽으며 token·숫자 검사·정수 변환·준비된 질의를 서로 다른 통제로 구분한다.

읽으면서 확인할 것
  • checkToken과 is_numeric의 선후 관계
  • :id 자리표시자와 정수형
  • 입력 형식 검사와 구조 분리의 차이
공식 가이드

OWASP: 값 바인딩과 SQL 구조의 경계

안전한 PreparedStatement 예제와 동적 테이블 이름 예제를 대조하여 값 이 가능한 부분을 구분한다.

읽으면서 확인할 것
  • 질의 틀과 setString 등 값 전달의 분리
  • 테이블·열·정렬 방향의 허용목록
  • 저장 프로시저 내부 동적 의 예외
학습 확인

이해했는지 확인하기

  • 외부 입력이 SQL 값으로 바인딩되는지 확인한다.
  • 정렬·테이블 선택 등 구조 요소가 허용 목록을 사용하는지 확인한다.
  • 스캐너 경고와 실제 재현 결과·영향 범위를 구분한다.

함께 확인할 공식 자료