SQL 인젝션: 데이터와 명령의 경계
SQL 인젝션은 입력값이 SQL 문법의 일부로 해석될 때 발생한다. 매개변수화와 최소 권한을 중심으로 원인과 방어를 이해한다.
개념부터 찾아보기
정의·역할·동작 원리를 독립 페이지에서 확인하세요. 본문의 밑줄 용어에도 설명이 있습니다.
이 노트에서 설명할 수 있게 되는 것
- 문자열 결합과 매개변수 바인딩의 처리 차이를 설명한다.
- 값 자리와 SQL 구조 요소를 구분한다.
- 응답 차이·DB 오류·권한을 연결해 영향 범위를 판단한다.
01개념과 구성 요소
- 성립 원리외부 값이 문자열에 합쳐져 데이터가 아닌 문법으로 해석되면 쿼리 구조가 변할 수 있다.
- 구성 경계HTTP 입력, 애플리케이션의 쿼리 생성, DB 파서, DB 계정 권한, 결과 출력이 연결된다.
- 핵심 방어값은 바인딩하고 구조 선택은 으로 제한한다. DB 최소권한과 비밀번호 검증은 별도 방어층이다.
02조회 입력이 DB 결과가 되는 순서
- 요청값 수신서버가 GET·POST·세션 등 실제 입력 위치를 읽고 필요한 정규화와 형식 검증을 수행한다.
- 쿼리 구조 결정개발자가 고정한 구조를 선택한다. 문자열 연결 방식은 외부 값이 문법에 들어갈 수 있는 지점이다.
- 매개변수 전달prepare/execute 등 드라이버가 지원하는 인터페이스로 값을 전달한다. 값 을 테이블명·정렬 구문에 대신 쓰지 않는다.
- DB 권한으로 실행DB가 애플리케이션 계정의 권한 안에서 문장을 처리한다. 가 DB의 모든 권한을 자동으로 우회하는 것은 아니다.
- 행과 응답 처리결과 행을 업무 규칙에 맞게 사용하고 안전하게 출력한다. 단순히 행이 있다는 이유만으로 비밀번호 검증을 대신하지 않는다.
03입력이 데이터에서 SQL 문법으로 넘어가는 지점
- 문법 경계은 DB가 사용자 입력이라는 출처를 자동으로 기억하지 않는다는 점에서 시작한다. 애플리케이션이 외부 값을 문자열에 연결하여 완성된 문장을 DB에 보내면 파서는 전체를 문법으로 해석한다.
- 구조 변경 문자따옴표는 문자열의 경계, OR는 조건 연산, 주석은 뒤 문법을 무시하는 역할을 하므로 입력이 구조를 바꿀 수 있다.
- PDO 비교아래 비교의 목적은 요청값이 최종 과 어떻게 연결되는지 보는 것이다. 정상 이름에 작은따옴표가 들어오는 경우에도 문자열 연결 방식은 깨질 수 있다.
- 취약점의 기준취약점의 기준은 특수문자의 존재 자체가 아니라 값으로만 쓰여야 할 내용이 구문이 되는 경계다.
$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 평가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 열 구조UNION은 두 SELECT의 결과를 연결한다. 양쪽 열 수가 같고 위치별 자료형이 호환되어야 하며 UNION은 중복을 제거하고 UNION ALL은 유지한다.
- 독립 조건첫 SELECT의 WHERE는 두 번째 SELECT에 자동 상속되지 않는다. 따라서 애플리케이션이 첫 쿼리에만 걸어 둔 행 제한과 별개로 다른 결과를 같은 화면 통로에 실을 수 있다.
- 상수 표식111·222 같은 상수 표식은 화면에 결과의 어느 열이 표시되는지 구분하는 데 사용할 수 있다. 실제 비밀번호나 테이블 자료 대신 두 개의 상수만으로도 출력 통로를 설명할 수 있다.
- ORDER BY 단서ORDER BY의 숫자 위치 오류는 결과 열 위치에 대한 단서이며 테이블에 정의된 모든 컬럼 수를 직접 알려 주는 것은 아니다.
SELECT '원래 결과' AS label, '표시 값' AS detail
UNION ALL
SELECT '표식 A', '표식 B';UNION의 열 수·표시 위치를 설명하는 가상 상수 예제다.
07애플리케이션 권한과 DB 계정 권한은 다르다
- DB 실행 권한로 사용자가 웹 화면에서 허용되지 않은 데이터를 보더라도 DB의 GRANT 자체를 무조건 우회한 것은 아니다. 주입된 쿼리는 보통 애플리케이션 DB 계정의 권한으로 실행된다.
- 웹의 행 제한그 계정이 모든 사용자의 행을 읽을 수 있는데 웹 코드가 사용자별 범위를 담당하고 있었다면 쿼리 구조 변조로 그 제한이 깨질 수 있다.
- DEFINER·INVOKER SECURITY DEFINER 뷰는 정의된 권한 문맥에서 기반 데이터를 읽을 수 있고 INVOKER는 호출자 권한 문맥을 사용한다. 뷰에 위임된 접근과 권한 없는 테이블을 마법처럼 읽는 것은 다르다.
- 최소권한최소권한은 주입 자체를 없애지는 않지만 파일 기능·다른 스키마·관리 작업으로 피해가 확장되는 범위를 제한한다.
08응답에 보이는 유형과 보이지 않는 유형
- In-bandIn-band 유형에서는 같은 요청의 응답에 결과나 DB 오류가 나타난다. Error-based는 오류 내용이나 오류의 유무가 단서가 되고 UNION-based는 결과 집합의 출력 통로를 이용한다.
- 정보 은닉의 한계상세 오류를 숨기면 일부 정보가 사라지지만 입력이 구문이 되는 설계가 그대로라면 취약점은 남는다.
- BlindBlind 유형에서는 결과가 직접 보이지 않아도 참·거짓에 따른 본문 길이, 문구, JSON 필드, 리다이렉트나 시간 차이가 단서가 된다. 는 안정적인 응답 차이를, 는 조건에 따른 지연을 관찰한다.
- 지연 대조네트워크 지연·캐시·개인화와 DB 조건의 효과를 구분해야 하며 한 번 느린 응답을 취약점 확정으로 해석하지 않는다.
09GET·POST·세션을 재현하지 못하면 다른 기능을 시험한다
- 입력 위치 예제의 id는 GET 쿼리에 있고 의 author는 POST 본문에 있었다. 같은 URL만 복사하고 본문을 빼면 원래 기능과 다른 요청이다.
- 세션·보안 단계로그인 Cookie나 보안 단계, 토큰이 달라져도 서버가 실행하는 경로가 달라진다. 도구의 취약점 판정 이전에 정상 요청이 같은 기능까지 도달하는지가 중요하다.
- 재현 실패302 로그인 이동, 반복 404, 다른 보안 단계는 취약점 유무보다 요청 재현 실패를 먼저 설명할 수 있다. 자동 도구의 Parameter·Type·Title· 필드는 추정 결과를 요약하지만 데이터에 대한 근거와 성공 조건을 대신하지 않는다.
- 대조군과도한 요청이나 데이터 덤프 없이 가상 표식과 정상 대조군으로 원리와 수정 효과를 읽을 수 있다.
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 fragment브라우저 URL의 # 뒤 조각은 일반적으로 서버 요청 대상으로 전송되지 않는다. DB에서 #이 주석 문법으로 쓰이는 경우와는 다른 파서의 동작이다.
- DB별 주석 문법또한 계열의 -- 주석은 뒤 공백 또는 제어문자 조건이 있고 다른 의 문법은 다를 수 있다. 문자 하나가 어디서 해석되는지를 명확히 해야 서버에 실제 도달한 값을 이해할 수 있다.
- 문자 차단의 한계이 차이를 근거로 특정 주석 문자열을 차단하는 것은 근본 방어가 아니다. 입력이 숫자·문자열· 중 어느 문맥에 놓였는지와 드라이버의 처리 방식에 따라 구조가 달라진다.
- 파싱 추적URL 디코딩과 문자열 정규화 뒤 실제 값이 무엇인지 로그와 소스의 대응 관계로 추적한다.
11매개변수로 묶을 수 없는 구조는 허용 목록으로 선택한다
- 값과 매개변수는 값 자리를 위한 것이며 테이블명·컬럼명·정렬 방향을 임의로 바인딩하여 문법으로 사용하는 인터페이스가 아니다. 정렬 옵션이 필요하면 외부의 짧은 선택값을 서버가 정한 컬럼 표현에 매핑한다.
- ORM의 경계ORM을 사용해도 raw 문자열에 입력을 연결하면 같은 경계 문제가 다시 생긴다.
- PDO 전달 방식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가상 이름 검색에서 따옴표와 와일드카드 비교
- 조회 구조가상 쿼리는 SELECT id FROM people WHERE name = ? 이고 값은 O'Reilly라고 가정한다.
- 결과작은따옴표는 문자열 값의 일부로 전달된다. 사용자가 보낸 문자 때문에 WHERE 뒤의 구조가 새로 만들어지지 않는다.
- 패턴 검색쿼리를 name LIKE ?로 바꾸고 A%를 전달하면 A로 시작하는 이름을 찾는다. 이는 정상 LIKE 의미이며 주입 성공의 증거가 아니다.
- 리터럴 요구실제 A%라는 이름만 찾으려면 DB의 ESCAPE 문법과 애플리케이션 정책에 맞춰 패턴 특수 문자를 처리해야 한다.
- 관찰 결과결과 행· 값·고정 쿼리 형태를 비교한다. 오류가 안 났다는 사실만으로 쿼리 구조가 안전하게 고정되었는지 알 수는 없다.
14바인딩을 썼는데도 결과가 다른 경우
- API 혼용일부 조건은 바인딩하면서 정렬·검색 연산자·조건 조각을 외부 입력으로 연결하고 있지 않은지 최종 쿼리 구성을 본다.
- 타입 변환문자열과 숫자의 자동 변환·NULL·빈 문자열이 DB별로 다르게 비교될 수 있다. 타입과 업무 규칙을 입력 검증에 명시한다.
- 연결 설정문자셋·드라이버의 에뮬레이션 설정·다중 문장 허용 등 실제 연결 옵션을 확인한다. 다른 환경의 결과를 그대로 적용하지 않는다.
- 오류 노출DB 오류 원문에는 스키마·쿼리·내부 경로가 포함될 수 있다. 사용자에게는 제한된 오류를, 내부에는 상관 ID로 연결한 진단 자료를 남긴다.
15수정 결과는 쿼리 구조와 정상 기능에서 드러난다
- 정상 기능수정 후 같은 따옴표 포함 이름이 정상 데이터로 저장·검색되고 조건식 모양의 입력도 문자열 값으로만 취급되어야 한다. 오류가 사라졌다는 사실만으로는 충분하지 않다.
- 오류 제거의 한계화면 출력이 끊겼거나 요청을 전부 막아도 오류는 보이지 않을 수 있기 때문이다. 소스의 , DB 계정 권한, 정상 결과와 변조 입력의 결과를 함께 연결한다.
- 재현 근거재현 자료에는 메서드·입력 위치·인증 문맥, 최종 구조, 애플리케이션과 DB의 권한 경계, 응답 관찰값을 연결한다. 같은 입력에 대한 결과가 바뀐 이유를 쿼리의 구조로 설명하면 자동 도구의 성공·실패 표시와 무관하게 수정의 효과를 해석할 수 있다.
- 내부 오류 기록실제 DB 오류는 내부에서 요청 ID와 연결하되 비밀값은 불필요하게 남기지 않는다.
설명과 함께 보는 보조 도식
모식도 · SQL 구조와 값의 분리
매개변수 API의 논리적 처리 흐름이며 실제 전송 메시지 수를 나타내지 않는다.
구조 전달
값 자리를 가진 쿼리와 별도의 입력값을 API에 전달한다.
- 입력의 역할
- 데이터 값
전체 단계를 한 번에 읽기
- 01
구조 전달
값 자리를 가진 쿼리와 별도의 입력값을 API에 전달한다.
- 입력의 역할
- 데이터 값
- 02
안전한 바인딩
드라이버의 지원 방식으로 값과 문법의 경계를 보존한다.
- 03
권한과 실행
DB 계정 권한 안에서 쿼리를 처리한다.
- 정렬·컬럼명
- 별도 허용 목록 필요
- 04
결과 반환
행 데이터 또는 일반화한 오류와 추적 가능한 내부 기록을 남긴다.
DVWA의 문자열 결합 쿼리와 결과 열을 연결하기
입력→ 문자열→DB 결과→화면의 연결을 읽고, 이 바꾸는 경계를 설명한다.
실습 구성과 전제
- 격리된 의 폐기 가능한 데이터베이스를 사용한다.
- 사진은 구형 · 코드다. 현재 서비스에 복사하지 않고 원리 비교 자료로만 읽는다.
입력이 SQL 문법 안으로 들어가는 위치를 찾는다
- 소스에서 GET의 id를 읽은 뒤 WHERE user_id = '$id'에 그대로 넣는 흐름을 따라간다. 따옴표와 변수 값이 하나의 문자열로 합쳐진다.
- mysql_query 계열은 구형 API다. 보안 교정은 다른 함수 이름으로 바꾸는 것만이 아니라 값과 쿼리 구조를 분리해야 한다.
원본 크기로 보기 ↗- $_GET['id']가 SELECT 문자열에 연결되고 mysql_query로 실행된다.
- 반복문은 결과 열 first_name·last_name을 화면에 출력한다. DB 결과의 두 열과 표시 위치를 연결할 수 있다.
확인 기준문자열 결합 지점과 출력 지점을 각각 표시한다.
결과 열의 모양이 유지되는 이유를 읽는다
- 교육 화면은 UNION으로 결합된 두 열이 기존 이름·성 표시 위치에 나타나는 사례다. 결과 집합의 열 수와 호환 가능한 형식이 맞아야 결합될 수 있다.
- 조회에 사용하는 DB 계정의 권한이 넓으면 애플리케이션이 의도하지 않은 자료도 결과에 섞일 수 있다. 화면의 테스트 해시를 다시 배포하지 않는다.
원본 크기로 보기 ↗- User ID 입력 뒤 여러 행이 표시되고 First name·Surname 위치에 계정명과 해시 형태의 값이 나타난다.
- 표시 레이블은 여전히 이름·성이다. 화면 레이블이 데이터의 실제 의미나 안전성을 보증하지 않는다.
확인 기준한 결과 화면만으로 데이터베이스 전체 권한이나 모든 공격 유형의 성공을 일반화하지 않는다.
정상 조회를 유지하면서 구조를 고정한다
- 준비된 쿼리의 값 자리에 사용자 입력을 바인딩한다. 정렬 열처럼 바인딩할 수 없는 구조는 으로 고른다.
- 정상 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장
원본 크기로 보기 ↗- 「SQL INJECTION」 문맥에 삽입된 원본 실습·개념 참고 화면이다. SQL 인젝션 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「SQL INJECTION」 문맥에 삽입된 원본 실습·개념 참고 화면이다. SQL 인젝션 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「SQL INJECTION」 문맥에 삽입된 원본 패킷 캡처이다. SQL 인젝션 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「SQL INJECTION」 문맥에 삽입된 원본 패킷 캡처이다. SQL 인젝션 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「SQL INJECTION」 문맥에 삽입된 원본 패킷 캡처이다. SQL 인젝션 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
실습 화면 묶음 02 2장
원본 크기로 보기 ↗- 수업 원본 자료 · 격리된 웹 실습에서 입력에 따른 SQL 처리와 응답 차이. 원문에서 「실습환경」에 배치된 그림 또는 화면이다.
원본 크기로 보기 ↗- 수업 원본 자료 · 격리된 웹 실습에서 입력에 따른 SQL 처리와 응답 차이. 원문에서 「실습환경」에 배치된 그림 또는 화면이다.
실습 화면 묶음 03 2장
원본 크기로 보기 ↗- 「SQL Injection」 문맥에 삽입된 원본 실습·개념 참고 화면이다. SQL 인젝션 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「SQL Injection」 문맥에 삽입된 원본 실습·개념 참고 화면이다. SQL 인젝션 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
실습 화면 묶음 04 1장
원본 크기로 보기 ↗- 학습 원본 · 격리 환경의 SQL 인젝션 관찰의 해당 절에 수록된 화면·도식이다.
실습 화면 묶음 05 1장
원본 크기로 보기 ↗- 학습 원본 · 격리 환경의 SQL 인젝션 관찰의 해당 절에 수록된 화면·도식이다.
실습 화면 묶음 06 1장
원본 크기로 보기 ↗- 학습 원본 · 격리 환경의 SQL 인젝션 관찰의 해당 절에 수록된 화면·도식이다.
실습 화면 묶음 07 1장
원본 크기로 보기 ↗- 학습 원본 · 격리 환경의 SQL 인젝션 관찰의 해당 절에 수록된 화면·도식이다.
실습 화면 묶음 08 1장
원본 크기로 보기 ↗- 학습 원본 · 격리 환경의 SQL 인젝션 관찰의 해당 절에 수록된 화면·도식이다.
실습 화면 묶음 09 1장
원본 크기로 보기 ↗- 학습 원본 · 격리 환경의 SQL 인젝션 관찰의 해당 절에 수록된 화면·도식이다.
실습 화면 묶음 10 1장
원본 크기로 보기 ↗- 학습 원본 · 격리 환경의 SQL 인젝션 관찰의 해당 절에 수록된 화면·도식이다.
실습 화면 묶음 11 1장
원본 크기로 보기 ↗- 학습 원본 · 격리 환경의 SQL 인젝션 관찰의 해당 절에 수록된 화면·도식이다.
실습 화면 묶음 12 1장
원본 크기로 보기 ↗- 학습 원본 · 격리 환경의 SQL 인젝션 관찰의 해당 절에 수록된 화면·도식이다.
실습 화면 묶음 13 1장
원본 크기로 보기 ↗- 학습 원본 · 격리 환경의 SQL 인젝션 관찰의 해당 절에 수록된 화면·도식이다.
실습 화면 묶음 14 1장
원본 크기로 보기 ↗- 학습 원본 · 격리 환경의 SQL 인젝션 관찰의 Sql Blind Injection에 수록된 화면·도식이다.
실습 화면 묶음 15 1장
원본 크기로 보기 ↗- 학습 원본 · 격리 환경의 SQL 인젝션 관찰의 Sql Blind Injection에 수록된 화면·도식이다.
실습 화면 묶음 16 1장
원본 크기로 보기 ↗- 학습 원본 · 격리 환경의 SQL 인젝션 관찰의 Sql Blind Injection에 수록된 화면·도식이다.
함께 보는 학습 자료
아래 공식 자료를 본문의 개념·예제와 함께 읽어 보세요. 자료별로 확인할 위치와 관찰할 내용을 적었습니다.
DVWA SQLi Low: 입력이 질의 문자열에 들어가는 위치
에서 id를 읽는 지점과 문자열 생성 지점을 코드로 연결한다.
- 요청 id의 취득 위치
- 문자열 연결이 만드는 데이터· 구문 경계
- DB 종류별 분기와 실제 선택된 코드 경로
DVWA SQLi Impossible: 검사와 바인딩의 역할
Low와 나란히 읽으며 token·숫자 검사·정수 변환·준비된 질의를 서로 다른 통제로 구분한다.
- checkToken과 is_numeric의 선후 관계
- :id 자리표시자와 정수형
- 입력 형식 검사와 구조 분리의 차이
OWASP: 값 바인딩과 SQL 구조의 경계
안전한 PreparedStatement 예제와 동적 테이블 이름 예제를 대조하여 값 이 가능한 부분을 구분한다.
- 질의 틀과 setString 등 값 전달의 분리
- 테이블·열·정렬 방향의 허용목록
- 저장 프로시저 내부 동적 의 예외
이해했는지 확인하기
- 외부 입력이 SQL 값으로 바인딩되는지 확인한다.
- 정렬·테이블 선택 등 구조 요소가 허용 목록을 사용하는지 확인한다.
- 스캐너 경고와 실제 재현 결과·영향 범위를 구분한다.