CSS Tutor Study Hub 메인으로

Computersystemsicherheit 2025/26

3.2. Schwachstellenanalyse einer Webanwendung

실제 시험 Abschnitt 3.2 · 7개 학습 항목 초보 해설

3. Websicherheit / Web Security · 실제 시험 Abschnitt 3.2

3.2. Schwachstellenanalyse einer Webanwendung

시험지의 HTML form, users table, PHP listing을 공통 자료로 두고 1–7번을 줄 단위로 분석합니다.

이 페이지는 비슷한 주제를 임의로 다시 묶지 않고 실제 시험지의 Chapter → subsection → 소문제 순서를 그대로 따릅니다.

ACTUAL EXAM · VERBATIM TRANSCRIPT

시험지 원문 1:1 전사

아래 내용은 해설자가 바꿔 쓴 요약이 아닙니다. 실제 시험 전사본의 문장·순서·수치·배점·코드·표를 그대로 두고, Markdown 기호만 읽기 쉬운 제목·표·코드 모양으로 표시했습니다.

3.2. Schwachstellenanalyse einer Webanwendung (22 Punkte)

Ein Entwickler implementiert eine Login-Funktionalität. Diese besteht aus einem Login-Formular, einer Datenbank-Tabelle und einem PHP-Skript zur Validierung der Login Daten.

Login-Formular (index.html)

1 <form action="http://api.example.com/login.php" method="GET">
2   Username: <input type="text" id="user" name="user">
3   Password: <input type="password" id="pw" name="pw">
4   <input type="submit" value="Login">
5 </form>

Datenbank-Tabelle users

loginpasswordroleemail
adminking2026administratorbob.king@example.com
alicewonderland2002useralice303@gmail.com
bobking2026userbob.king@gmail.com
charlie123456guestch.ar.lie.xxx@gmail.com
eve34@s5wa-rPg5.5readonlyeve.online.1997@gmail.com

Serverseitige Verarbeitung (login.php)

1  <?php
2  $user = $_GET['user'];
3  $pass = $_GET['pw'];
4  $sql = "SELECT * FROM users WHERE login = '$user' AND password = '$pass'";
5  $result = $conn->query($sql);
6  if ($result->num_rows > 0) {
7      echo "<div>Erfolgreich angemeldet!</div>";
8  } else {
9      echo "<div>Fehlgeschlagener Login für Nutzer: " . $user . "</div>";
10 }
11 ?>

1. Welches Risiko besteht bei der Datenübertragung zum Webserver? (2 Punkte)

2. Warum ist GET bei einem Login-Formular eine schlechte Wahl? (2 Punkte)

3. Welchen Wert muss ein Angreifer in das Feld user eingeben, um sich ohne Passwort als admin anzumelden? (4 Punkte)

4. Die Datei login.php enthält eine Schwachstelle in der Datenausgabe. Identifizieren Sie die betroffene Codezeile der Schwachstelle und warum diese gefährlich ist. (4 Punkte)

5. Nennen Sie zwei Folgen, die die Art der Speicherung von Passwörtern in der Tabelle users ermöglichen und wie man die Datenspeicherrung verbessern kann. (4 Punkte)

6. Nennen Sie zwei Änderungen an login.php, die zur Sicherheit beitragen, ohne die gewünschte Funktionalität zu beeinflussen. (4 Punkte)

7. Wie beurteilen sie die Wahl der Passwörter der Benutzer in der Tabelle? Begründen Sie kurz. (2 Punkte)

근거: CSS_Altklausur_WiSe_2526.pdfcomputersystemsicherheit_wise25-26_questions_only.md · Abschnitt 3.2

VISUAL MAP

Login 입력의 이동 왼쪽에서 오른쪽으로 읽은 뒤 아래 실제 소문제에서 같은 순서를 반복합니다.
  1. 01 HTML form
  2. 02 HTTP GET
  3. 03 PHP 변수
  4. 04 SQL 문자열
  5. 05 HTML 응답

FIXED SOLVING METHOD

이 묶음의 고정 풀이 순서

  1. 공통 listing에서 공격자가 조작할 수 있는 입력을 표시합니다.
  2. 각 문항이 전송·URL·SQL·HTML·DB 저장 중 어느 경계를 묻는지 찾습니다.
  3. 정확한 code line과 parser를 연결합니다.
  4. 구체 입력을 넣어 생성되는 URL·SQL·HTML을 한 번 써 봅니다.
  5. 영향과 해당 parser에 맞는 수정책을 답합니다.

ZERO-BASE CONCEPT LESSONS

이 묶음을 풀기 전에 필요한 개념

카드를 열고 닫는 방식 대신 한 방향으로 이어지는 글로 구성했습니다. 비유 → 용어의 쉬운 뜻 → 실제 작동 → 시험에서의 경계 순서로 천천히 읽으세요.

기초 개념 01

Browser, server, HTTP, HTML parser

먼저 장면으로 이해해 봅시다. 같은 기호도 일반 편지 본문에서는 글자지만 계산식 칸에서는 연산자로 읽힌다. Browser도 입력이 HTML text, attribute, script 중 어디에 들어갔는지에 따라 다르게 해석한다.

이제 전문 용어를 붙이면 다음과 같습니다. HTTP request은(는) Browser나 client가 server에 method, path, headers, body를 담아 보내는 message입니다. HTTP response은(는) Server가 status, headers, body를 담아 client에 돌려주는 message입니다. Parser / Interpreter은(는) 문자열을 HTML, JavaScript, SQL, shell 같은 문법으로 해석하는 구성요소입니다. Context은(는) 같은 문자가 어느 문법의 어느 위치에 놓였는지를 뜻하며 올바른 encoding 방법을 결정합니다.

실제 시스템에서는 이렇게 작동합니다. Browser는 사용자의 client 프로그램이고 web server는 request를 받아 response를 만드는 프로그램이다. HTTP request에는 method, URL, header, body가 있고 response에는 status, header, body가 있다. Browser는 response body를 단순 글자가 아니라 HTML, JavaScript 같은 문법으로 해석(parse)한다. 외부 입력이 처음 들어오는 곳을 source, 그 입력이 실제 기능에 사용되는 위험한 도착점을 sink라고 부른다. 따라서 입력이 어느 문법 위치와 sink에 들어가는지가 보안에 매우 중요하다.

  1. 사용자 입력이 들어오는 source를 찾는다.
  2. 입력이 출력·DB·명령으로 들어가는 sink를 찾는다.
  3. 그 sink를 어떤 parser가 어떤 context로 읽는지 확인한다.
  4. 공격 영향과 context에 맞는 방어를 연결한다.

여기서 넘지 말아야 할 경계: 입력 문자열 자체만 보고 취약점을 이름 붙이지 말고 source에서 sink까지 실제 흐름을 추적한다.

15. HTTP request·GET·POST·TLS 독립 강의 →

기초 개념 02

GET과 POST, 그리고 TLS는 각각 무엇을 바꾸는가

먼저 장면으로 이해해 봅시다. GET은 엽서 겉면에 비밀번호를 쓰는 것, POST는 봉투 안에 넣는 것에 가깝다. 하지만 봉투 자체가 투명하지 않게 보호되는 역할은 TLS가 한다.

이제 전문 용어를 붙이면 다음과 같습니다. GET은(는) 주로 resource 조회에 쓰며 parameter가 URL query에 들어가기 쉬운 HTTP method입니다. POST은(는) 주로 상태 변경이나 form 제출에 쓰며 data를 request body에 담을 수 있는 HTTP method입니다. URL query은(는) `?name=value` 형태로 URL에 붙는 parameter 부분입니다. TLS은(는) GET이나 POST와 별개로 전송 구간을 암호화하고 server를 인증하는 protocol입니다.

실제 시스템에서는 이렇게 작동합니다. GET request의 parameter는 보통 URL query string에 들어가 browser history, bookmark, 화면, proxy·server access log, Referer에 남을 수 있다. POST는 데이터를 request body에 넣어 URL 노출을 줄이지만 자체적으로 암호화하지는 않는다. 전송 중 내용을 보호하려면 HTTPS/TLS가 함께 필요하다.

  1. Login credential을 URL에 넣지 않는다.
  2. POST body로 전송한다.
  3. 전체 연결에 HTTPS를 사용한다.
  4. Server log와 error message에도 credential을 기록하지 않는다.

여기서 넘지 말아야 할 경계: POST만 쓰면 네트워크에서 비밀번호가 암호화된다고 생각하면 안 된다.

15. HTTP request·GET·POST·TLS 독립 강의 →

기초 개념 03

Password를 저장하지 않고 검증값을 저장하는 법

먼저 장면으로 이해해 봅시다. 비밀번호 원본을 창고에 보관하는 대신, 입력한 열쇠가 맞는지만 검사하는 느린 시험 장치를 보관하는 것이다. Salt는 같은 열쇠라도 사용자마다 다른 시험지를 받게 한다.

이제 전문 용어를 붙이면 다음과 같습니다. Password hash / KDF은(는) Password 검증을 위해 의도적으로 비용을 높여 만든 단방향 계산 결과입니다. Salt은(는) 사용자마다 새로 만드는 공개 random 값으로 같은 password도 서로 다른 저장 결과를 만들게 합니다. Cost parameter은(는) Password 추측 한 번에 필요한 시간·memory 비용을 조절하는 설정입니다. Offline guessing은(는) 공격자가 유출된 database를 자기 장비에서 server 제한 없이 시험하는 공격입니다.

실제 시스템에서는 이렇게 작동합니다. Server는 사용자의 plaintext password를 다시 읽을 필요가 없다. 가입할 때 각 사용자마다 무작위 salt를 만들고 password와 함께 느린 password KDF에 넣어 나온 hash와 salt만 저장한다. 로그인 때 입력 password로 같은 계산을 수행해 비교한다. Argon2id, bcrypt, scrypt, PBKDF2 같은 KDF는 반복 계산과 memory 사용으로 대량 추측을 비싸게 만든다.

  1. 사용자마다 고유한 random salt를 생성한다.
  2. Password와 salt를 느린 KDF에 넣는다.
  3. Salt, KDF parameter, 결과 hash를 저장한다.
  4. 로그인 시 검증 API로 비교하고 role authorization은 별도로 확인한다.

여기서 넘지 말아야 할 경계: 일반적인 빠른 hash 한 번만 사용하거나 모든 사용자에게 같은 salt를 쓰면 대량 추측과 미리 계산한 table 공격에 약하다.

19. Password storage·Salt·Slow KDF 독립 강의 →

기초 개념 04

강한 password를 공격자 관점에서 평가하기

먼저 장면으로 이해해 봅시다. 자물쇠 번호가 길어도 1234567890이면 공격자는 첫 시도에 가깝게 맞힌다. 짧은 장식보다 선택의 예측 불가능성이 중요하다.

이제 전문 용어를 붙이면 다음과 같습니다. Password entropy은(는) 공격자 관점에서 password가 얼마나 예측 불가능한지를 나타내는 정도입니다. Dictionary attack은(는) 흔한 단어와 알려진 변형 규칙을 우선 시험하는 password 추측 공격입니다. Credential stuffing은(는) 다른 site에서 유출된 username/password 조합을 재사용해 login하는 공격입니다. MFA은(는) Password 외에 별도의 factor를 요구해 password 하나의 유출만으로 login하기 어렵게 하는 인증 방식입니다.

실제 시스템에서는 이렇게 작동합니다. Password strength는 사람이 보기에 복잡한지가 아니라 공격자가 몇 번의 추측으로 맞힐 가능성이 높은지로 평가한다. 12345 같은 순서, 사전 단어, 이름과 연도 조합, 여러 사이트에서 재사용한 password는 먼저 시도된다. 길고 예측하기 어려운 고유 passphrase나 password manager가 만든 무작위 password가 유리하다.

  1. Common password list와 사전 단어 여부를 본다.
  2. 이름+연도, 키보드 배열, 숫자 순서 같은 pattern을 찾는다.
  3. 길이와 무작위성, 사이트별 고유성을 확인한다.
  4. 저장 방식의 KDF 강도와 사용자가 고른 password 강도를 별도로 평가한다.

여기서 넘지 말아야 할 경계: 특수문자 하나나 최신 연도를 붙였다는 이유만으로 strong이라고 단정하지 않는다.

20. Password strength·Online/Offline guessing 독립 강의 →

기초 개념 05

XSS와 output encoding을 처음부터 이해하기

먼저 장면으로 이해해 봅시다. 설문 답변 칸에 쓴 문장을 사회자가 그대로 읽어야 하는데, 답변이 무대 지시문으로 해석되어 조명과 문을 조작하는 상황과 같다.

이제 전문 용어를 붙이면 다음과 같습니다. XSS은(는) 공격자 입력이 victim browser에서 data가 아니라 HTML 또는 JavaScript code로 실행되는 취약점입니다. Source은(는) 공격자 입력이 들어오는 URL, form, database record 같은 시작점입니다. Sink은(는) 입력이 HTML이나 script로 해석될 수 있는 위험한 사용 지점입니다. Output encoding은(는) 출력 context에서 특수문자가 code 문법이 아니라 data로 표현되도록 변환하는 방어입니다.

실제 시스템에서는 이렇게 작동합니다. Cross-Site Scripting(XSS)은 공격자 입력이 피해자 browser에서 신뢰된 사이트의 HTML 또는 JavaScript로 해석되어 실행되는 취약점이다. Reflected XSS는 request의 입력이 곧바로 response에 반사되는 형태다. 방어의 핵심은 출력 위치에 맞는 output encoding으로 특별한 문자를 데이터로만 해석하게 만드는 것이다.

  1. $_GET 같은 사용자 입력 source를 찾는다.
  2. echo처럼 HTML response에 쓰는 sink를 찾는다.
  3. HTML body, attribute, URL, JavaScript 중 context를 판별한다.
  4. 해당 context용 encoding과 안전한 template API를 적용한다.

여기서 넘지 말아야 할 경계: SQL injection 방어인 prepared statement를 XSS의 직접 해결책으로 쓰거나 client-side filter만 믿으면 안 된다.

17. XSS·Output encoding 독립 강의 →

기초 개념 06

SQL injection과 prepared statement

먼저 장면으로 이해해 봅시다. 주문서의 이름 칸에 ‘주문 취소하고 금고 열기’라고 썼을 때 직원이 그것을 이름이 아니라 새 지시로 실행하는 문제다. Prepared statement는 이름 칸을 끝까지 데이터 칸으로 고정한다.

이제 전문 용어를 붙이면 다음과 같습니다. SQL query은(는) Database에 조회·삽입·변경 등을 요청하는 SQL 문장입니다. SQL injection은(는) 공격자 입력이 SQL data가 아니라 query 구조와 명령으로 해석되는 취약점입니다. Prepared statement은(는) SQL 구조를 먼저 고정하고 사용자 값을 별도 parameter로 전달하는 방식입니다. Parameter binding은(는) 입력값을 SQL syntax와 분리된 data slot에 연결하는 과정입니다.

실제 시스템에서는 이렇게 작동합니다. SQL은 database에 질문하는 언어다. 프로그램이 SQL 문자열과 사용자 입력을 단순히 이어 붙이면 입력의 따옴표나 연산자가 데이터가 아니라 SQL 문법으로 해석될 수 있다. 이것이 SQL injection이다. Prepared statement는 SQL 구조를 먼저 고정하고 사용자 값은 별도 parameter로 전달해 값이 명령 문법이 되지 못하게 한다.

  1. $_GET, $_POST 같은 입력 source를 찾는다.
  2. SQL 문자열 연결 또는 interpolation 지점을 찾는다.
  3. 입력이 query 구조를 바꿀 수 있는지 확인한다.
  4. Prepared statement와 bound parameter로 구조와 값을 분리한다.
  5. Database account 권한도 최소화한다.

여기서 넘지 말아야 할 경계: 따옴표를 몇 개 치환하는 blacklist나 client-side validation만으로 해결하려 하지 않는다.

18. SQL Injection·Prepared statement 독립 강의 →

QUESTION-BY-QUESTION COMMENTARY

실제 시험 소문제별 해설

시험지의 번호와 순서를 그대로 유지했습니다. 각 항목을 열어 원문 → 쉬운 개념 설명 → 이번 문제의 단계별 풀이 → 답안 → 함정 순서로 읽으세요.

ACTUAL EXAM SUBSECTION 3.2

3.2. Schwachstellenanalyse einer Webanwendung

7개 학습 항목 · 22점

3.2.1 웹서버로 login 정보를 전송할 때 어떤 위험이 있는가? 기존 71문항 학습 번호 45 · 2점 Web 감사

3.2.1 · 실제 시험 원문

1. Welches Risiko besteht bei der Datenübertragung zum Webserver? **(2 Punkte)**

한국어로 요구사항만 풀어 읽기

웹서버로 login 정보를 전송할 때 어떤 위험이 있는가?

TLS certificate가 확인하는 것과 확인하지 않는 것보안이란 무엇을 지키는 것인가

TERMS FOR 3.2.1

이 소문제의 중요한 용어부터 이해하기

전문 용어를 알고 있다고 가정하지 않습니다. 아래 정의의 굵은 용어를 문제 문장 속 같은 단어와 바꾸어 읽은 뒤 풀이로 넘어가세요.

01HTTPS / TLS

Browser와 server 사이 전송 내용을 암호화하고 변조를 탐지하며 보통 server를 인증하는 통신 보호입니다.

작은 예: HTTPS는 네트워크 도청을 줄이지만 URL이 browser history나 server log에 남는 문제까지 없애지는 않습니다.

02Certificate

domain 이름 같은 identity와 public key를 CA의 signature로 연결한 전자 문서입니다.

03CA

Certificate Authority로, 정해진 검증 뒤 certificate에 서명하는 신뢰 기관입니다.

04Certificate chain

server certificate에서 browser가 신뢰하는 root CA까지 이어지는 서명 관계입니다.

05Hostname verification

접속한 domain 이름이 certificate에 허용된 이름과 일치하는지 확인하는 절차입니다.

06Asset

공격자로부터 지키려는 대상입니다. 파일, 비밀번호, 서비스 가용성, 사람의 개인정보가 모두 asset이 될 수 있습니다.

07Confidentiality

허가받지 않은 사람이 내용을 읽지 못하게 하는 기밀성입니다.

08Integrity

데이터나 시스템이 허가 없이 바뀌지 않았음을 보장하려는 무결성입니다.

ZERO-BASE MINI LESSON · 3.2.1

이 소문제만을 위한 0부터 시작하는 미니 강의

아래 설명은 이 과목의 선행 지식을 가정하지 않습니다. 개념 → 비유의 대응 → 눈으로 읽는 구조 → 작은 예제 순서로 읽은 뒤 실제 시험 풀이로 넘어가세요.

1 · 먼저 알아야 할 개념

시험의 form 1행은 <form action="http://api.example.com/login.php" method="GET">입니다. 여기서 가장 먼저 볼 부분은 method보다 URL의 scheme인 http://입니다. HTTP는 application data를 네트워크에 암호화하지 않은 채 보냅니다.

HTTPS는 HTTP를 TLS 안에 넣어 전송합니다. TLS는 정상적으로 검증된 서버와 연결했을 때 전송 내용의 기밀성(confidentiality)과 무결성(integrity)을 제공하고, 인증서로 상대 서버의 이름을 확인합니다. 반대로 평문 HTTP에서는 같은 Wi-Fi의 공격자, 악성 공유기, 중간 network 장비가 credential을 관찰하거나 응답을 바꿀 수 있습니다.

Password 입력칸의 type="password"는 화면에서 글자를 점으로 가릴 뿐 network 암호화가 아닙니다. 또한 GET을 POST로 바꾸는 것도 URL 노출을 줄일 뿐 TLS를 만들지 않습니다. 이 소문항은 1행의 HTTP 전송 위험을, 다음 소문항은 GET의 기록 노출을 각각 묻습니다.

2 · 일상 장면으로 먼저 잡기

로그인 정보를 봉투 없이 엽서에 적어 여러 우편 분류소를 거쳐 보내는 상황입니다.

  • 엽서에 적힌 아이디와 비밀번호 평문 HTTP request의 credentials
  • 우편 경로의 여러 분류소 Wi-Fi AP·router·proxy 등 network 중간 지점
  • 누구나 읽거나 내용을 고쳐 쓸 수 있음 도청과 man-in-the-middle 변조
  • 수신자 주소를 확인한 봉인 운송 인증서 검증을 포함한 HTTPS/TLS

비유의 경계 HTTPS도 endpoint 자체가 악성이거나 서버가 침해된 경우 입력 후의 오용을 막지는 못합니다. 비유의 봉투는 전송 구간 보호만 나타냅니다.

3 · 눈으로 관계 읽기 시험 로그인 정보의 HTTP 전송 경로
  1. 01 Browser input

    alice / wonderland2002 입력

  2. 02 HTTP request

    http://api.example.com/...로 평문 전송

  3. 03 Network observer

    credential 읽기 또는 response 변조 가능

  4. 04 Web server

    변조됐을 수도 있는 request 수신

  5. 05 HTTPS fix

    TLS로 기밀성·무결성·server 인증 제공

type=password가 화면을 가려도 browser와 server 사이의 HTTP packet은 가려지지 않습니다.

4 · TOY EXAMPLE

시험 form의 Alice 로그인 요청을 network에서 추적하기

주어진 것과 목표 Alice가 user=alice, pw=wonderland2002를 입력하고 시험의 HTTP GET form을 제출합니다.

  1. 01
    브라우저가 만드는 목적지 URL을 적습니다.

    왜? 1행의 scheme과 실제 전송되는 credential을 함께 보기 위해서입니다.

    중간 결과 http://api.example.com/login.php?user=alice&pw=wonderland2002 형태가 됩니다.

  2. 02
    요청이 TLS record 안에 있는지 확인합니다.

    왜? http://https://의 보안 차이는 표시 모양이 아니라 TLS 사용 여부이기 때문입니다.

    중간 결과 http://이므로 username, password, path와 response가 TLS로 암호화되지 않습니다.

  3. 03
    같은 공개 Wi-Fi의 공격자가 traffic을 관찰한다고 가정합니다.

    왜? 기밀성 실패가 실제 자산에 어떤 영향을 주는지 연결하기 위해서입니다.

    중간 결과 공격자는 alicewonderland2002를 그대로 읽어 계정 접근에 재사용할 수 있습니다.

  4. 04
    중간자가 server response를 바꾼다고 가정합니다.

    왜? HTTP 문제는 도청뿐 아니라 무결성·서버 인증 부족도 포함하기 때문입니다.

    중간 결과 가짜 login page나 악성 script를 주입해 추가 정보를 훔칠 수 있습니다.

  5. 05
    Action을 https://api.example.com/login.php로 바꾸고 인증서를 검증합니다.

    왜? 전송 경로의 직접적인 수정책을 제시하기 위해서입니다.

    중간 결과 TLS가 request와 response를 암호화·무결성 보호하며 올바른 server 이름을 확인합니다.

예제 결론 이 form의 첫 번째 위험은 credential이 http:// 평문 통로를 지나간다는 것입니다.

실제 시험으로 옮기기 2점 답안에는 1행의 HTTP, 도청·변조 위험, HTTPS/TLS 해결을 짧게 연결하면 됩니다.

개념 근거와 더 깊은 설명

시험 문구·배점은 실제 시험 PDF를 따르고, 위 개념 설명은 연결된 강의 자료의 해당 페이지를 기준으로 구성했습니다.

이번 문제는 이 단계로 풀어야 했습니다

먼저 문제에서 직접 주어진 값과 최종적으로 구할 값을 분리합니다. 그다음 각 값·용어·경로를 왜 선택했는지 확인하며, 앞 단계의 중간 결과를 다음 단계의 입력으로 사용합니다.

START HERE

먼저 문제를 식과 조건으로 정리하기

계산을 시작하기 전에 주어진 것구할 것을 분리합니다. 그다음 아래 관계식을 위에서 아래로 사용하면, 숫자가 어디서 왔는지 놓치지 않을 수 있습니다.

강사가 문제의 요구사항을 쉬운 말로 바꾸면

시험 문장이 요구하는 것: 웹서버로 login 정보를 전송할 때 어떤 위험이 있는가?

이 문제의 풀이 전략: 이 소문제에서는 정확한 code 위치를 지적한다 → 보호되지 않는 자산을 적는다 → 기밀성 위험을 연결한다 → 무결성·인증 위험을 연결한다 → 직접 수정책을 쓴다 순서로 진행합니다. 마지막에는 ‘`type=password`는 화면, POST는 URL 대신 body, HTTPS/TLS는 network 보호라고 세 줄로 나눕니다.’라는 교정 기준으로 답을 다시 확인합니다.

문제에서 주어진 정보
  • 실제 시험이 준 상황·문장

    웹서버로 login 정보를 전송할 때 어떤 위험이 있는가?

  • 이 문항의 첫 출발점

    Form 1행 action의 `http://api.example.com/login.php`가 문제입니다.

    GET만 말하고 `http://`를 놓치지 않았는지 확인합니다.

최종적으로 구해야 하는 것
  • 마지막에 도달할 답안

    Form action과 전체 site에서 HTTPS/TLS를 강제하고 올바른 인증서를 검증합니다.

  • 정답을 지탱하는 이유

    1행의 action이 `http://`이므로 TLS가 없습니다. 따라서 username과 password가 network 중간자에게 평문으로 노출될 수 있고 request·response가 변조될 수도 있습니다. `type=password`는 화면 표시만 숨기고 POST도 암호화를 제공하지 않으므로, `https://`와 올바른 TLS 인증서 검증을 사용해야 합니다.

사용할 공식·판정 관계
  • 이 소문제만의 풀이 사슬

    정확한 code 위치를 지적한다 → 보호되지 않는 자산을 적는다 → 기밀성 위험을 연결한다 → 무결성·인증 위험을 연결한다 → 직접 수정책을 쓴다

    `type=password`가 화면을 가려도 browser와 server 사이의 HTTP packet은 가려지지 않습니다.

  1. 01

    정확한 code 위치를 지적한다

    구체적으로 Form 1행 action의 http://api.example.com/login.php가 문제입니다.

    여기서 검산 GET만 말하고 http://를 놓치지 않았는지 확인합니다.

    다음 단계로 여기서 확인한 내용을 다음 ‘보호되지 않는 자산을 적는다’ 단계의 출발점으로 사용합니다.

  2. 02

    보호되지 않는 자산을 적는다

    구체적으로 Username과 password가 TLS 없이 전송됩니다.

    여기서 검산 password input type이 network 보호가 아님을 확인합니다.

    다음 단계로 여기서 확인한 내용을 다음 ‘기밀성 위험을 연결한다’ 단계의 출발점으로 사용합니다.

  3. 03

    기밀성 위험을 연결한다

    구체적으로 경로상의 공격자가 credential을 도청해 계정을 탈취할 수 있습니다.

    여기서 검산 단순히 ‘위험하다’가 아니라 누가 무엇을 읽는지 씁니다.

    다음 단계로 여기서 확인한 내용을 다음 ‘무결성·인증 위험을 연결한다’ 단계의 출발점으로 사용합니다.

  4. 04

    무결성·인증 위험을 연결한다

    구체적으로 중간자가 request나 response를 변경하거나 가짜 내용을 주입할 수 있습니다.

    여기서 검산 HTTP의 문제가 정보 노출 하나뿐이라고 제한하지 않습니다.

    다음 단계로 여기서 확인한 내용을 다음 ‘직접 수정책을 쓴다’ 단계의 출발점으로 사용합니다.

  5. 05

    직접 수정책을 쓴다

    구체적으로 Form action과 전체 site에서 HTTPS/TLS를 강제하고 올바른 인증서를 검증합니다.

    여기서 검산 POST를 암호화 해결책으로 잘못 제시하지 않습니다.

    다음 단계로 앞 단계의 결과를 모아 채점 가능한 최종 답안으로 정리합니다.

정답과 해설

form action이 `http://`이므로 TLS가 없다. 같은 네트워크의 공격자나 중간자가 username/password를 평문으로 도청·변조할 수 있다. HTTPS를 강제해야 한다.

시험 답안 골격

  1. 1행의 `http://api.example.com/login.php`를 지적한다.
  2. 기밀성·무결성 위험을 설명한다.
  3. HTTPS/TLS를 해결책으로 쓴다.

정답이 이렇게 되는 이유

1행의 action이 http://이므로 TLS가 없습니다. 따라서 username과 password가 network 중간자에게 평문으로 노출될 수 있고 request·response가 변조될 수도 있습니다. type=password는 화면 표시만 숨기고 POST도 암호화를 제공하지 않으므로, https://와 올바른 TLS 인증서 검증을 사용해야 합니다.

초보자가 가장 자주 뒤집는 지점

잘못된 생각 Password 칸이 점으로 보이고 POST로만 바꾸면 network에서도 비밀번호가 암호화된다.

왜 틀렸나 화면 마스킹, HTTP method, 전송 암호화는 서로 다른 기능입니다.

고쳐 말하면 type=password는 화면, POST는 URL 대신 body, HTTPS/TLS는 network 보호라고 세 줄로 나눕니다.

한 문제만 더: 개념이 정말 연결됐는지 확인

질문 같은 form을 POST로 바꾸되 action을 http://로 유지하면 같은 Wi-Fi 공격자가 password body를 읽을 수 있습니까?

정답 예. POST body도 HTTP에서는 평문입니다. HTTPS/TLS가 있어야 전송 내용이 보호됩니다.

이 문제의 오답 함정

  • GET 문제와 HTTP 문제를 하나로 뭉개지 않는다.
  • POST가 암호화라고 쓰지 않는다.
ACTIVE RECALL

이 소문제를 점수로 바꾸는 6개의 작은 훈련

해설을 닫은 상태에서 1번부터 수행하세요. 정답을 읽은 직후보다 직접 문제 지도를 만들고 답을 꺼낸 뒤 채점할 때 기억이 더 정확해집니다. 작성 내용과 복습 판정은 이 브라우저에 자동 저장됩니다.

  1. 01 · 30초 문제 지도

    해설을 보지 말고 주어진 정보 → 구할 것 → 사용할 공식·판정 관계를 한 줄씩 복원하세요.

    막힐 때만 첫 단서 열기

    HTTP는 봉투 없이 엽서를 보내는 것과 같다. POST로 바꾸어도 TLS가 없으면 전송 내용은 보호되지 않는다.

  2. 02 · 90초 닫힌책 답안

    웹서버로 login 정보를 전송할 때 어떤 위험이 있는가?

    정답 문장만 말하지 말고 근거·중간값·메시지 흐름 중 이 문항에 필요한 것을 빈 종이에 남기세요.

  3. 03 · 부분점수 자가채점

    작성한 뒤에만 아래 기준을 열고, 실제로 쓴 항목만 체크하세요.

    답안 작성 후 채점 기준 열기

    답안 슬롯 자가 점검 — 실제로 말하거나 쓴 항목만 체크하세요.

    0/3 slots

  4. 04 · 문항별 후속 질문·조건 전이
    • HTTPS가 제공하는 세 가지 핵심 보호를 말해 보라.
    • 공격자 입력에서 vulnerable sink, 보안 영향, 수정책까지의 인과 사슬을 화살표 네 칸으로 쓰고, 수정책이 적용되는 정확한 경계를 표시하세요.

    조건 변형: 제시한 수정책 하나만 적용했다고 가정하세요. 그 수정이 정확히 막는 입력 경로와 여전히 남는 별도 취약점을 각각 한 문장으로 쓰세요.

  5. 05 · 대표 오답 복구

    고칠 답안: GET 문제와 HTTP 문제를 하나로 뭉개지 않는다.

    복구 힌트: HTTP는 봉투 없이 엽서를 보내는 것과 같다. POST로 바꾸어도 TLS가 없으면 전송 내용은 보호되지 않는다.

    오답의 첫 잘못된 전제를 한 줄로 지우고, 올바른 조건과 결론을 두 줄로 다시 쓰세요.

  6. 06 · 확신도 보정·다음 복습 결정

    채점 전 예상과 실제 채점 결과가 달랐는지 확인한 뒤 상태를 남기세요. ‘숙달’은 근거와 중간 과정까지 무힌트로 재현했을 때만 선택합니다.

    현재 확신도
    아직 복습 판정을 남기지 않았습니다.
모든 훈련을 마친 뒤 핵심 정답 다시 확인

form action이 `http://`이므로 TLS가 없다. 같은 네트워크의 공격자나 중간자가 username/password를 평문으로 도청·변조할 수 있다. HTTPS를 강제해야 한다.

근거: CSS_Altklausur_WiSe_2526.pdf · p14 / Web Sicherheit / 3.2 Schwachstellenanalyse einer Webanwendung · 시험지 표시 3.2.1 이제 이 문제 직접 풀기
3.2.2 login form에서 GET이 나쁜 선택인 이유는? 기존 71문항 학습 번호 46 · 2점 단답형

3.2.2 · 실제 시험 원문

2. Warum ist GET bei einem Login-Formular eine schlechte Wahl? **(2 Punkte)**

한국어로 요구사항만 풀어 읽기

login form에서 GET이 나쁜 선택인 이유는?

Browser, server, HTTP, HTML parserGET과 POST, 그리고 TLS는 각각 무엇을 바꾸는가

TERMS FOR 3.2.2

이 소문제의 중요한 용어부터 이해하기

전문 용어를 알고 있다고 가정하지 않습니다. 아래 정의의 굵은 용어를 문제 문장 속 같은 단어와 바꾸어 읽은 뒤 풀이로 넘어가세요.

01GET

HTTP request method 중 하나로 parameter가 흔히 URL query string에 들어갑니다.

작은 예: Login을 GET으로 보내면 ?user=alice&pw=secret이 history나 log에 남을 수 있습니다.

02HTTPS / TLS

Browser와 server 사이 전송 내용을 암호화하고 변조를 탐지하며 보통 server를 인증하는 통신 보호입니다.

작은 예: HTTPS는 네트워크 도청을 줄이지만 URL이 browser history나 server log에 남는 문제까지 없애지는 않습니다.

03HTTP request

Browser나 client가 server에 method, path, headers, body를 담아 보내는 message입니다.

04HTTP response

Server가 status, headers, body를 담아 client에 돌려주는 message입니다.

05Parser / Interpreter

문자열을 HTML, JavaScript, SQL, shell 같은 문법으로 해석하는 구성요소입니다.

06Context

같은 문자가 어느 문법의 어느 위치에 놓였는지를 뜻하며 올바른 encoding 방법을 결정합니다.

07POST

주로 상태 변경이나 form 제출에 쓰며 data를 request body에 담을 수 있는 HTTP method입니다.

08URL query

`?name=value` 형태로 URL에 붙는 parameter 부분입니다.

ZERO-BASE MINI LESSON · 3.2.2

이 소문제만을 위한 0부터 시작하는 미니 강의

아래 설명은 이 과목의 선행 지식을 가정하지 않습니다. 개념 → 비유의 대응 → 눈으로 읽는 구조 → 작은 예제 순서로 읽은 뒤 실제 시험 풀이로 넘어가세요.

1 · 먼저 알아야 할 개념

HTTP GET은 resource를 조회할 때 쓰며 parameter를 보통 URL의 query string에 둡니다. 시험 form에 method="GET"이므로 입력값은 /login.php?user=...&pw=...처럼 주소 뒤에 붙습니다. 브라우저의 password 입력칸도 이 규칙을 바꾸지 않습니다.

URL은 화면 주소창뿐 아니라 browser history, bookmark, server access log, reverse proxy·monitoring log, 복사한 링크에 남기 쉽습니다. 다른 resource나 navigation에 전달되는 Referer에도 정책과 상황에 따라 URL 정보가 노출될 수 있습니다. 민감한 credential을 URL에 넣지 않는 이유입니다.

POST는 form 값을 request body로 옮겨 이런 URL 기반 노출을 줄입니다. 그러나 POST body도 HTTP 위에서는 암호화되지 않으므로 시험 form에는 POST와 HTTPS가 함께 필요합니다. 또한 login처럼 상태와 secret을 다루는 동작은 GET의 안전하고 반복 가능한 조회 의미와도 맞지 않습니다.

2 · 일상 장면으로 먼저 잡기

택배 상자 안이 아니라 배송 라벨의 주소 칸에 비밀번호를 크게 적는 상황입니다.

  • 배송 라벨 URL query string
  • 물류 기록에 라벨을 복사 Browser history와 server·proxy log
  • 상자 안에 내용을 넣음 POST request body
  • 봉인된 안전 운송 HTTPS/TLS

비유의 경계 POST body도 server log나 application telemetry가 잘못 설정되면 기록될 수 있습니다. POST는 노출 면을 줄일 뿐 secret 저장·logging 정책과 TLS가 별도로 필요합니다.

3 · 눈으로 관계 읽기 GET login과 POST+HTTPS login
  1. 01 GET target

    /login.php?user=bob&pw=king2026

  2. 02 Persistent traces

    History·bookmark·server/proxy log에 URL 복제 가능

  3. 03 POST target

    URL은 /login.php, credential은 body

  4. 04 HTTPS layer

    URL path 이후 request 내용과 body를 TLS로 보호

POST는 민감값을 URL에서 옮기고 HTTPS는 옮긴 body를 포함한 전송 내용을 보호합니다.

4 · TOY EXAMPLE

시험 form이 만드는 URL과 남는 흔적

주어진 것과 목표 Bob이 user=bob, pw=king2026을 입력해 GET form을 제출합니다.

  1. 01
    브라우저가 form field를 query string으로 직렬화합니다.

    왜? GET form에서 name/value가 어디에 놓이는지 확인하기 위해서입니다.

    중간 결과 /login.php?user=bob&pw=king2026이 URL에 들어갑니다.

  2. 02
    전체 요청 target을 적습니다.

    왜? 시험의 실제 host와 scheme을 놓치지 않기 위해서입니다.

    중간 결과 http://api.example.com/login.php?user=bob&pw=king2026처럼 credential이 주소의 일부가 됩니다.

  3. 03
    Browser history와 server access log를 확인합니다.

    왜? URL을 자동 보존하는 두 대표 위치를 찾기 위해서입니다.

    중간 결과 PC를 쓰는 다음 사용자나 log 접근자가 password를 볼 수 있습니다.

  4. 04
    Method를 POST로 바꿉니다.

    왜? URL 기반 노출과 network 전송 보호를 분리해 보기 위해서입니다.

    중간 결과 URL은 /login.php로 남고 field는 body로 이동해 history·bookmark 노출이 줄어듭니다.

  5. 05
    Scheme도 HTTPS로 바꿉니다.

    왜? POST body를 network 중간자에게서 보호하려면 TLS가 필요하기 때문입니다.

    중간 결과 올바른 조합은 method="POST"https://.../login.php입니다.

예제 결론 GET의 문제는 credential을 장기간 복제되기 쉬운 URL metadata로 만든다는 점입니다.

실제 시험으로 옮기기 답안에는 URL query 노출, history·log·Referer 같은 구체 경로 둘, 그리고 POST+HTTPS의 역할 구분을 씁니다.

개념 근거와 더 깊은 설명

시험 문구·배점은 실제 시험 PDF를 따르고, 위 개념 설명은 연결된 강의 자료의 해당 페이지를 기준으로 구성했습니다.

이번 문제는 이 단계로 풀어야 했습니다

먼저 문제에서 직접 주어진 값과 최종적으로 구할 값을 분리합니다. 그다음 각 값·용어·경로를 왜 선택했는지 확인하며, 앞 단계의 중간 결과를 다음 단계의 입력으로 사용합니다.

START HERE

먼저 문제를 식과 조건으로 정리하기

계산을 시작하기 전에 주어진 것구할 것을 분리합니다. 그다음 아래 관계식을 위에서 아래로 사용하면, 숫자가 어디서 왔는지 놓치지 않을 수 있습니다.

강사가 문제의 요구사항을 쉬운 말로 바꾸면

시험 문장이 요구하는 것: login form에서 GET이 나쁜 선택인 이유는?

이 문제의 풀이 전략: 이 소문제에서는 Form method를 code에서 찾는다 → 실제 URL을 구성한다 → 노출 위치 두 곳 이상을 쓴다 → POST의 정확한 효과를 적는다 → HTTPS를 함께 요구한다 순서로 진행합니다. 마지막에는 ‘URL을 하나의 데이터 저장·전파 채널로 보고 민감값을 넣지 않습니다.’라는 교정 기준으로 답을 다시 확인합니다.

문제에서 주어진 정보
  • 실제 시험이 준 상황·문장

    login form에서 GET이 나쁜 선택인 이유는?

  • 이 문항의 첫 출발점

    1행의 `method="GET"` 때문에 field가 query string으로 들어갑니다.

    앞 문항의 `http://` 위험과 이번 GET 위험을 구분합니다.

최종적으로 구해야 하는 것
  • 마지막에 도달할 답안

    Network 도청을 막으려면 POST와 별개로 HTTPS/TLS가 필요합니다.

  • 정답을 지탱하는 이유

    GET form은 `user`와 `pw`를 URL query string에 넣습니다. 그러면 password가 browser history, bookmark, server·proxy log, 복사된 URL과 조건에 따른 Referer에 남기 쉽습니다. Login은 POST로 보내 URL 노출을 줄이고, 동시에 HTTPS/TLS를 사용해 body를 포함한 전송 자체를 보호해야 합니다.

사용할 공식·판정 관계
  • 이 소문제만의 풀이 사슬

    Form method를 code에서 찾는다 → 실제 URL을 구성한다 → 노출 위치 두 곳 이상을 쓴다 → POST의 정확한 효과를 적는다 → HTTPS를 함께 요구한다

    POST는 민감값을 URL에서 옮기고 HTTPS는 옮긴 body를 포함한 전송 내용을 보호합니다.

  1. 01

    Form method를 code에서 찾는다

    구체적으로 1행의 method="GET" 때문에 field가 query string으로 들어갑니다.

    여기서 검산 앞 문항의 http:// 위험과 이번 GET 위험을 구분합니다.

    다음 단계로 여기서 확인한 내용을 다음 ‘실제 URL을 구성한다’ 단계의 출발점으로 사용합니다.

  2. 02

    실제 URL을 구성한다

    구체적으로 ?user=alice&pw=wonderland2002처럼 password가 주소에 나타납니다.

    여기서 검산 Password input type이 URL 직렬화를 막지 않음을 확인합니다.

    다음 단계로 여기서 확인한 내용을 다음 ‘노출 위치 두 곳 이상을 쓴다’ 단계의 출발점으로 사용합니다.

  3. 03

    노출 위치 두 곳 이상을 쓴다

    구체적으로 Browser history, server/proxy log, bookmark, 복사된 URL, 조건부 Referer 등이 있습니다.

    여기서 검산 추상적인 ‘유출될 수 있다’에서 끝내지 않습니다.

    다음 단계로 여기서 확인한 내용을 다음 ‘POST의 정확한 효과를 적는다’ 단계의 출발점으로 사용합니다.

  4. 04

    POST의 정확한 효과를 적는다

    구체적으로 POST는 값을 request body로 옮겨 URL 기록 노출을 줄입니다.

    여기서 검산 POST가 값을 hash하거나 encrypt한다고 쓰지 않습니다.

    다음 단계로 여기서 확인한 내용을 다음 ‘HTTPS를 함께 요구한다’ 단계의 출발점으로 사용합니다.

  5. 05

    HTTPS를 함께 요구한다

    구체적으로 Network 도청을 막으려면 POST와 별개로 HTTPS/TLS가 필요합니다.

    여기서 검산 최종 권장안이 POST만으로 끝나지 않는지 확인합니다.

    다음 단계로 앞 단계의 결과를 모아 채점 가능한 최종 답안으로 정리합니다.

정답과 해설

GET은 credentials를 URL query string에 넣어 browser history, server/proxy log, bookmark, Referer 등에 남기기 쉽다. POST와 HTTPS를 함께 사용한다.

시험 답안 골격

  1. URL query string 노출을 쓴다.
  2. history/log/Referer 중 두 경로를 든다.
  3. POST+HTTPS를 구분한다.

정답이 이렇게 되는 이유

GET form은 userpw를 URL query string에 넣습니다. 그러면 password가 browser history, bookmark, server·proxy log, 복사된 URL과 조건에 따른 Referer에 남기 쉽습니다. Login은 POST로 보내 URL 노출을 줄이고, 동시에 HTTPS/TLS를 사용해 body를 포함한 전송 자체를 보호해야 합니다.

초보자가 가장 자주 뒤집는 지점

잘못된 생각 GET의 유일한 문제는 주소창에 보인다는 것이며 주소창을 숨기면 해결된다.

왜 틀렸나 URL은 UI 바깥의 history, log, monitoring, copy/paste 등 여러 시스템에서 자동 저장됩니다.

고쳐 말하면 URL을 하나의 데이터 저장·전파 채널로 보고 민감값을 넣지 않습니다.

한 문제만 더: 개념이 정말 연결됐는지 확인

질문 POST+HTTPS를 쓰면 server가 request body에 password를 통째로 logging해도 안전합니까?

정답 아닙니다. 전송과 URL 노출은 줄지만 server-side log 정책은 별도입니다. Password와 token은 log에서 제거하거나 마스킹해야 합니다.

이 문제의 오답 함정

  • POST만 쓰면 안전하다고 단정하지 않는다.
ACTIVE RECALL

이 소문제를 점수로 바꾸는 6개의 작은 훈련

해설을 닫은 상태에서 1번부터 수행하세요. 정답을 읽은 직후보다 직접 문제 지도를 만들고 답을 꺼낸 뒤 채점할 때 기억이 더 정확해집니다. 작성 내용과 복습 판정은 이 브라우저에 자동 저장됩니다.

  1. 01 · 30초 문제 지도

    해설을 보지 말고 주어진 정보 → 구할 것 → 사용할 공식·판정 관계를 한 줄씩 복원하세요.

    막힐 때만 첫 단서 열기

    GET은 비밀번호를 주소표에 적는 것과 같다. 본문에 넣는 POST가 기록 노출을 줄이지만 암호화는 HTTPS가 담당한다.

  2. 02 · 90초 닫힌책 답안

    login form에서 GET이 나쁜 선택인 이유는?

    정답 문장만 말하지 말고 근거·중간값·메시지 흐름 중 이 문항에 필요한 것을 빈 종이에 남기세요.

  3. 03 · 부분점수 자가채점

    작성한 뒤에만 아래 기준을 열고, 실제로 쓴 항목만 체크하세요.

    답안 작성 후 채점 기준 열기

    답안 슬롯 자가 점검 — 실제로 말하거나 쓴 항목만 체크하세요.

    0/3 slots

  4. 04 · 문항별 후속 질문·조건 전이
    • GET URL이 제3자 요청의 Referer로 새는 예를 설명하라.
    • 정답의 핵심 조건 하나를 일부러 빼고 생기는 잘못된 결론을 쓴 뒤, 그 조건을 다시 넣어 시험 답안 한 문장으로 복구하세요.

    조건 변형: 원문의 핵심 조건 하나를 반대로 바꾸고, 기존 정답에서 어느 문장과 근거를 수정해야 하는지 두 문장으로 설명하세요.

  5. 05 · 대표 오답 복구

    고칠 답안: POST만 쓰면 안전하다고 단정하지 않는다.

    복구 힌트: GET은 비밀번호를 주소표에 적는 것과 같다. 본문에 넣는 POST가 기록 노출을 줄이지만 암호화는 HTTPS가 담당한다.

    오답의 첫 잘못된 전제를 한 줄로 지우고, 올바른 조건과 결론을 두 줄로 다시 쓰세요.

  6. 06 · 확신도 보정·다음 복습 결정

    채점 전 예상과 실제 채점 결과가 달랐는지 확인한 뒤 상태를 남기세요. ‘숙달’은 근거와 중간 과정까지 무힌트로 재현했을 때만 선택합니다.

    현재 확신도
    아직 복습 판정을 남기지 않았습니다.
모든 훈련을 마친 뒤 핵심 정답 다시 확인

GET은 credentials를 URL query string에 넣어 browser history, server/proxy log, bookmark, Referer 등에 남기기 쉽다. POST와 HTTPS를 함께 사용한다.

근거: CSS_Altklausur_WiSe_2526.pdf · p14 / Web Sicherheit / 3.2 Schwachstellenanalyse einer Webanwendung · 시험지 표시 3.2.2 이제 이 문제 직접 풀기
3.2.3 password 없이 admin으로 login하려면 user field에 어떤 값을 넣는가? 기존 71문항 학습 번호 47 · 4점 계산

3.2.3 · 실제 시험 원문

3. Welchen Wert muss ein Angreifer in das Feld `user` eingeben, um sich ohne Passwort als `admin` anzumelden? **(4 Punkte)**

한국어로 요구사항만 풀어 읽기

password 없이 admin으로 login하려면 user field에 어떤 값을 넣는가?

SQL injection과 prepared statementBrowser, server, HTTP, HTML parser

TERMS FOR 3.2.3

이 소문제의 중요한 용어부터 이해하기

전문 용어를 알고 있다고 가정하지 않습니다. 아래 정의의 굵은 용어를 문제 문장 속 같은 단어와 바꾸어 읽은 뒤 풀이로 넘어가세요.

01Plaintext Password

암호화나 password hashing 없이 원래 password를 그대로 저장한 상태입니다.

작은 예: DB가 유출되면 공격자가 추가 계산 없이 모든 password를 바로 읽을 수 있습니다.

02SQL query

Database에 조회·삽입·변경 등을 요청하는 SQL 문장입니다.

03SQL injection

공격자 입력이 SQL data가 아니라 query 구조와 명령으로 해석되는 취약점입니다.

04Prepared statement

SQL 구조를 먼저 고정하고 사용자 값을 별도 parameter로 전달하는 방식입니다.

05Parameter binding

입력값을 SQL syntax와 분리된 data slot에 연결하는 과정입니다.

06HTTP request

Browser나 client가 server에 method, path, headers, body를 담아 보내는 message입니다.

07HTTP response

Server가 status, headers, body를 담아 client에 돌려주는 message입니다.

08Parser / Interpreter

문자열을 HTML, JavaScript, SQL, shell 같은 문법으로 해석하는 구성요소입니다.

ZERO-BASE MINI LESSON · 3.2.3

이 소문제만을 위한 0부터 시작하는 미니 강의

아래 설명은 이 과목의 선행 지식을 가정하지 않습니다. 개념 → 비유의 대응 → 눈으로 읽는 구조 → 작은 예제 순서로 읽은 뒤 실제 시험 풀이로 넘어가세요.

1 · 먼저 알아야 할 개념

PHP 2·3행은 $_GET['user']$_GET['pw']를 각각 $user, $pass에 넣습니다. 4행은 이 값을 SQL 문자열 안의 작은따옴표 사이에 직접 삽입합니다: SELECT * FROM users WHERE login = '$user' AND password = '$pass'. 사용자 입력이 SQL code와 한 문자열에 섞이는 순간이 취약점입니다.

SQL에서 작은따옴표는 문자열 literal의 경계이고 -- 는 여러 DBMS에서 그 줄의 나머지를 comment로 만듭니다. 공격자는 사용자 이름 데이터 구역을 작은따옴표로 닫은 뒤 comment를 시작해 뒤의 password 조건을 DB parser가 무시하게 할 수 있습니다.

표에서 목표 row의 login은 정확히 admin입니다. 단순한 ' OR 1=1 -- 는 조건을 모든 row에 참으로 만들어 첫 번째 row가 admin일 가능성은 있어도 의미상 특정 admin을 확실히 지정하는 답보다 약합니다. admin' -- 는 먼저 admin 조건을 만든 뒤 password 부분만 제거합니다.

5행의 DB 결과 뒤 6행은 $result->num_rows > 0만 검사하므로 admin row가 하나라도 반환되면 성공 분기로 갑니다. 제시된 code에는 session 생성 과정이 생략되어 있지만, 시험이 보여 준 login 검증 논리에서는 admin row 선택이 password 없는 성공을 뜻합니다.

2 · 일상 장면으로 먼저 잡기

신청서의 이름 칸에 이름뿐 아니라 ‘이제부터 나머지 칸은 읽지 마시오’라는 심사 지시까지 써 넣을 수 있는 상황입니다.

  • 이름 칸을 닫는 표시 Payload의 작은따옴표 '
  • 나머지 신청서를 무시하라는 표시 SQL line comment --
  • 비밀번호 확인 칸이 심사에서 사라짐 AND password = ...가 comment 처리
  • 인쇄 양식과 손글씨를 별도 층에 보관 Prepared statement와 bound parameter

비유의 경계 SQL comment 문법과 whitespace 요구는 DBMS마다 다를 수 있습니다. 이 시험 payload의 -- 뒤 공백은 흔한 MySQL 계열 규칙까지 고려한 것이며, 실제 공격 성공은 사용 DB와 설정에 따라 달라집니다.

3 · 눈으로 관계 읽기 입력에서 인증 우회까지의 parser 사슬
  1. 01 User field

    admin' --

  2. 02 PHP interpolation

    login = 'admin' -- ' AND password = ''

  3. 03 SQL parser

    login='admin'만 실행하고 뒤는 comment

  4. 04 Database

    users 표의 admin row 반환

  5. 05 PHP branch

    num_rows > 0가 참이 되어 성공

취약점은 입력이 PHP 문자열 결합을 거쳐 SQL parser의 code로 다시 해석되는 순간 발생합니다.

4 · TOY EXAMPLE

admin' -- 가 PHP와 SQL parser를 통과하는 전 과정

주어진 것과 목표 공격자는 user field에 정확히 admin' -- 를 넣고 password field는 비워 제출합니다.

  1. 01
    Browser가 form 값을 URL encoding해 전송합니다.

    왜? 화면 입력과 PHP가 받는 문자열 사이의 변환을 이해하기 위해서입니다.

    중간 결과 URL에는 예를 들어 user=admin%27+--+&pw=처럼 보일 수 있지만 server는 이를 다시 admin' -- 로 decode합니다.

  2. 02
    PHP 2행에서 $user 값을 확정합니다.

    왜? SQL에 삽입될 실제 byte·문자를 알아야 따옴표를 맞출 수 있기 때문입니다.

    중간 결과 $useradmin' -- 이고 $pass는 빈 문자열입니다.

  3. 03
    4행의 $user, $pass 자리에 값을 문자 그대로 치환합니다.

    왜? Payload만 외우지 않고 완성된 query로 검산하기 위해서입니다.

    중간 결과 SELECT * FROM users WHERE login = 'admin' -- ' AND password = ''가 됩니다.

  4. 04
    SQL parser 관점에서 작은따옴표를 표시합니다.

    왜? 첫 번째 공격 문자가 어떤 경계를 닫는지 확인하기 위해서입니다.

    중간 결과 Payload의 'login = 'admin' 문자열을 정상적으로 닫아 admin 비교를 완성합니다.

  5. 05
    -- 이후를 comment로 지웁니다.

    왜? 원래 code가 붙인 닫는 따옴표와 password 조건을 문법 오류 없이 무력화하기 위해서입니다.

    중간 결과 DB가 실행하는 실질 조건은 WHERE login = 'admin'만 남습니다.

  6. 06
    반환 row와 PHP 분기를 확인합니다.

    왜? SQL 변형이 application의 인증 결과로 어떻게 이어지는지 보기 위해서입니다.

    중간 결과 표의 admin row가 반환되어 num_rows > 0가 참이고 성공 message가 출력됩니다.

예제 결론 공격 문자열은 admin이라는 데이터 뒤에서 SQL 문자열을 닫고 password 검사를 comment로 바꿉니다.

실제 시험으로 옮기기 4점 답안은 payload, 완성 SQL, 따옴표 탈출, comment로 사라진 password 조건을 모두 보여 주는 것이 가장 안전합니다.

개념 근거와 더 깊은 설명

시험 문구·배점은 실제 시험 PDF를 따르고, 위 개념 설명은 연결된 강의 자료의 해당 페이지를 기준으로 구성했습니다.

  • Vorlesung/10 Web Application Security.pdf p.10, p.12, p.16 · SQL injection 정의·login query 예시·parameterized 방어 연결 개념 강의 열기
  • Vorlesung/10 Web Application Security.pdf p.11, p.12, p.15 · POST login form과 URL/parameter 처리 연결 개념 강의 열기

이번 문제는 이 단계로 풀어야 했습니다

먼저 문제에서 직접 주어진 값과 최종적으로 구할 값을 분리합니다. 그다음 각 값·용어·경로를 왜 선택했는지 확인하며, 앞 단계의 중간 결과를 다음 단계의 입력으로 사용합니다.

START HERE

먼저 문제를 식과 조건으로 정리하기

계산을 시작하기 전에 주어진 것구할 것을 분리합니다. 그다음 아래 관계식을 위에서 아래로 사용하면, 숫자가 어디서 왔는지 놓치지 않을 수 있습니다.

강사가 문제의 요구사항을 쉬운 말로 바꾸면

시험 문장이 요구하는 것: password 없이 admin으로 login하려면 user field에 어떤 값을 넣는가?

이 문제의 풀이 전략: 이 소문제에서는 목표 row 값을 고정한다 → SQL template의 입력 경계를 표시한다 → 문자열을 닫는다 → Password 조건을 comment 처리한다 → 완성 query를 적는다 → 방어까지 연결한다 순서로 진행합니다. 마지막에는 ‘시험 표의 목표 login을 payload 앞에 명시한 `admin' -- `를 사용하고 완성 SQL로 확인합니다.’라는 교정 기준으로 답을 다시 확인합니다.

문제에서 주어진 정보
  • SQL template

    SELECT * FROM users WHERE login = '$user' AND password = '$pass'

  • 목표 account

    admin

  • 조작 가능한 입력

    user field

최종적으로 구해야 하는 것
  • 최종 출력

    Password 조건을 제거하고 admin row를 선택하게 만드는 user payload

  • 예시 결과

    admin' --

사용할 공식·판정 관계
  • 문자열 종료

    작은따옴표 ' 로 login 문자열을 닫는다.

  • 나머지 조건 제거

    -- 뒤를 SQL comment로 만든다.

  • 완성된 핵심 조건

    login='admin' -- ' AND password='...'

  1. 01

    목표 row 값을 고정한다

    구체적으로 Users 표에서 관리자 account의 login 값은 admin입니다.

    여기서 검산 임의 row가 아니라 특정 admin row를 선택하도록 시작합니다.

    다음 단계로 여기서 확인한 내용을 다음 ‘SQL template의 입력 경계를 표시한다’ 단계의 출발점으로 사용합니다.

  2. 02

    SQL template의 입력 경계를 표시한다

    구체적으로 사용자 값은 login = '' AND password 사이에 들어갑니다.

    여기서 검산 Application이 이미 앞에 작은따옴표를 하나 열어 둔 것을 확인합니다.

    다음 단계로 여기서 확인한 내용을 다음 ‘문자열을 닫는다’ 단계의 출발점으로 사용합니다.

  3. 03

    문자열을 닫는다

    구체적으로 admin'의 마지막 작은따옴표로 SQL login literal을 닫습니다.

    여기서 검산 따옴표 수를 완성 SQL에서 직접 맞춥니다.

    다음 단계로 여기서 확인한 내용을 다음 ‘Password 조건을 comment 처리한다’ 단계의 출발점으로 사용합니다.

  4. 04

    Password 조건을 comment 처리한다

    구체적으로 -- 를 붙여 원래 template의 나머지 ' AND password = ...를 무시하게 합니다.

    여기서 검산 DBMS 호환을 위해 -- 뒤 공백이 들어갔는지 확인합니다.

    다음 단계로 여기서 확인한 내용을 다음 ‘완성 query를 적는다’ 단계의 출발점으로 사용합니다.

  5. 05

    완성 query를 적는다

    구체적으로 SELECT * FROM users WHERE login = 'admin' -- ' AND password = ''가 되고 실질 조건은 admin뿐입니다.

    여기서 검산 Payload만 던지지 않고 parser가 보는 결과를 보여 줍니다.

    다음 단계로 여기서 확인한 내용을 다음 ‘방어까지 연결한다’ 단계의 출발점으로 사용합니다.

  6. 06

    방어까지 연결한다

    구체적으로 4행의 문자열 결합을 prepared statement와 bound parameters로 바꾸면 payload 전체가 login 데이터로 남습니다.

    여기서 검산 수정책으로 client-side 검사나 단순 blacklist만 쓰지 않습니다.

    다음 단계로 앞 단계의 결과를 모아 채점 가능한 최종 답안으로 정리합니다.

정답과 해설

예: `admin' -- `를 user에 넣는다. SQL은 `login='admin' -- ' AND password='...'`가 되어 뒤 조건이 주석 처리된다. DBMS에 따라 `-- ` 뒤 공백이 필요하다.

시험 답안 골격

  1. payload `admin' -- `를 제시한다.
  2. 완성된 SQL 문장을 써서 따옴표와 주석을 설명한다.
  3. prepared statement를 방어로 연결한다.

정답이 이렇게 되는 이유

User field에 admin' -- 를 입력합니다. PHP의 4행에 치환하면 SELECT * FROM users WHERE login = 'admin' -- ' AND password = '...'가 됩니다. Payload의 작은따옴표가 admin 문자열을 닫고 -- 가 뒤의 password 조건을 comment로 만들어 DB는 admin row만 찾습니다. DBMS에 따라 -- 뒤 공백이 필요하므로 payload에도 공백을 포함합니다.

초보자가 가장 자주 뒤집는 지점

잘못된 생각 ' OR 1=1 -- 를 넣으면 언제나 확실히 admin으로 로그인한다.

왜 틀렸나 그 조건은 여러 row를 반환할 수 있고 application이 어느 row를 identity로 쓰는지에 따라 admin이 보장되지 않을 수 있습니다.

고쳐 말하면 시험 표의 목표 login을 payload 앞에 명시한 admin' -- 를 사용하고 완성 SQL로 확인합니다.

한 문제만 더: 개념이 정말 연결됐는지 확인

질문 Prepared statement에서 같은 admin' -- 를 bind하면 DB는 무엇을 찾습니까?

정답 문자 그대로 이름이 admin' -- 인 login 값을 찾습니다. 따옴표와 comment 기호는 SQL 구조가 되지 않으므로 admin password 조건을 우회하지 못합니다.

이 문제의 오답 함정

  • `' OR 1=1 -- `만 쓰면 첫 번째 임의 계정이 선택될 수 있어 admin 보장이 약하다.
  • `--` 뒤 공백을 빠뜨리지 않는다.
ACTIVE RECALL

이 소문제를 점수로 바꾸는 6개의 작은 훈련

해설을 닫은 상태에서 1번부터 수행하세요. 정답을 읽은 직후보다 직접 문제 지도를 만들고 답을 꺼낸 뒤 채점할 때 기억이 더 정확해집니다. 작성 내용과 복습 판정은 이 브라우저에 자동 저장됩니다.

  1. 01 · 30초 문제 지도

    해설을 보지 말고 주어진 정보 → 구할 것 → 사용할 공식·판정 관계를 한 줄씩 복원하세요.

    막힐 때만 첫 단서 열기

    프로그램은 사용자의 글자를 '데이터' 상자에 넣지 않고 SQL 문장에 붙인다. 공격자는 따옴표로 데이터 구역을 탈출해 문장의 나머지를 주석으로 만든다.

  2. 02 · 90초 닫힌책 답안

    password 없이 admin으로 login하려면 user field에 어떤 값을 넣는가?

    정답 문장만 말하지 말고 근거·중간값·메시지 흐름 중 이 문항에 필요한 것을 빈 종이에 남기세요.

  3. 03 · 부분점수 자가채점

    작성한 뒤에만 아래 기준을 열고, 실제로 쓴 항목만 체크하세요.

    답안 작성 후 채점 기준 열기

    답안 슬롯 자가 점검 — 실제로 말하거나 쓴 항목만 체크하세요.

    0/3 slots

  4. 04 · 문항별 후속 질문·조건 전이
    • parameter binding이면 이 입력이 왜 명령이 아니라 문자열이 되는가?
    • 최종값에서 출발해 각 중간값을 역순으로 검산하고, public/private key, modulus, exponent 중 하나라도 뒤바뀌면 어디서 처음 오류가 나는지 지적하세요.

    조건 변형: 문제의 숫자 하나가 달라졌다고 가정하세요. 어느 중간값부터 다시 계산해야 하는지 표시하고, 마지막 검산식까지 순서만 빈 종이에 재구성하세요.

  5. 05 · 대표 오답 복구

    고칠 답안: `' OR 1=1 -- `만 쓰면 첫 번째 임의 계정이 선택될 수 있어 admin 보장이 약하다.

    복구 힌트: 프로그램은 사용자의 글자를 '데이터' 상자에 넣지 않고 SQL 문장에 붙인다. 공격자는 따옴표로 데이터 구역을 탈출해 문장의 나머지를 주석으로 만든다.

    오답의 첫 잘못된 전제를 한 줄로 지우고, 올바른 조건과 결론을 두 줄로 다시 쓰세요.

  6. 06 · 확신도 보정·다음 복습 결정

    채점 전 예상과 실제 채점 결과가 달랐는지 확인한 뒤 상태를 남기세요. ‘숙달’은 근거와 중간 과정까지 무힌트로 재현했을 때만 선택합니다.

    현재 확신도
    아직 복습 판정을 남기지 않았습니다.
모든 훈련을 마친 뒤 핵심 정답 다시 확인

예: `admin' -- `를 user에 넣는다. SQL은 `login='admin' -- ' AND password='...'`가 되어 뒤 조건이 주석 처리된다. DBMS에 따라 `-- ` 뒤 공백이 필요하다.

근거: CSS_Altklausur_WiSe_2526.pdf · p14 / Web Sicherheit / 3.2 Schwachstellenanalyse einer Webanwendung · 시험지 표시 3.2.3 이제 이 문제 직접 풀기
3.2.4 data output 취약점의 줄 번호와 위험을 설명하시오. 기존 71문항 학습 번호 48 · 4점 Web 감사

3.2.4 · 실제 시험 원문

4. Die Datei `login.php` enthält eine Schwachstelle in der Datenausgabe. Identifizieren Sie die betroffene Codezeile der Schwachstelle und warum diese gefährlich ist. **(4 Punkte)**

한국어로 요구사항만 풀어 읽기

data output 취약점의 줄 번호와 위험을 설명하시오.

XSS와 output encoding을 처음부터 이해하기Browser, server, HTTP, HTML parser

TERMS FOR 3.2.4

이 소문제의 중요한 용어부터 이해하기

전문 용어를 알고 있다고 가정하지 않습니다. 아래 정의의 굵은 용어를 문제 문장 속 같은 단어와 바꾸어 읽은 뒤 풀이로 넘어가세요.

01XSS

공격자 입력이 victim browser에서 data가 아니라 HTML 또는 JavaScript code로 실행되는 취약점입니다.

02Source

공격자 입력이 들어오는 URL, form, database record 같은 시작점입니다.

03Sink

입력이 HTML이나 script로 해석될 수 있는 위험한 사용 지점입니다.

04Output encoding

출력 context에서 특수문자가 code 문법이 아니라 data로 표현되도록 변환하는 방어입니다.

05HTTP request

Browser나 client가 server에 method, path, headers, body를 담아 보내는 message입니다.

06HTTP response

Server가 status, headers, body를 담아 client에 돌려주는 message입니다.

07Parser / Interpreter

문자열을 HTML, JavaScript, SQL, shell 같은 문법으로 해석하는 구성요소입니다.

08Context

같은 문자가 어느 문법의 어느 위치에 놓였는지를 뜻하며 올바른 encoding 방법을 결정합니다.

ZERO-BASE MINI LESSON · 3.2.4

이 소문제만을 위한 0부터 시작하는 미니 강의

아래 설명은 이 과목의 선행 지식을 가정하지 않습니다. 개념 → 비유의 대응 → 눈으로 읽는 구조 → 작은 예제 순서로 읽은 뒤 실제 시험 풀이로 넘어가세요.

1 · 먼저 알아야 할 개념

XSS(Cross-Site Scripting)는 공격자가 제공한 데이터가 피해자 browser에서 HTML 또는 JavaScript code로 해석되는 취약점입니다. Server가 PHP를 실행하는 것과 browser가 response의 HTML을 해석하는 것은 서로 다른 단계입니다.

시험 code에서 공격자 입력의 source는 2행 $_GET['user']이고 $user에 저장됩니다. 실패 분기의 9행 echo "<div>Fehlgeschlagener Login für Nutzer: " . $user . "</div>";는 그 값을 response HTML 안에 그대로 붙이는 sink입니다. Browser는 $user 부분도 단순 글자라고 자동 가정하지 않습니다.

이 경우 payload가 DB에 저장되지 않고 같은 request의 query parameter가 바로 실패 response에 되돌아오므로 reflected XSS입니다. HTML text context에서는 <, >, &, 따옴표 등을 문자 그대로 보이게 context-aware output encoding해야 합니다. PHP에서는 htmlspecialchars를 올바른 flag와 UTF-8로 사용할 수 있습니다.

SQL injection과 XSS는 같은 $user에서 시작해도 다른 parser를 공격합니다. 4행은 SQL parser가 읽는 query의 취약점이고, 이 문항이 묻는 data output 취약점은 9행을 browser의 HTML parser가 읽을 때 발생합니다.

2 · 일상 장면으로 먼저 잡기

안내판에 방문자의 이름을 인쇄해야 하는데, 인쇄기가 이름 칸의 <새 안내판 시작> 같은 문구를 실제 편집 명령으로 실행하는 상황입니다.

  • 방문자가 적은 이름 $_GET['user']의 공격자 입력
  • 안내판에 그대로 이어 붙임 9행의 string concatenation과 echo sink
  • 글자를 편집 명령으로 실행하는 인쇄기 Browser의 HTML parser와 JavaScript engine
  • 명령 기호를 인쇄 가능한 문자로 바꿈 HTML context output encoding

비유의 경계 브라우저에는 HTML text, attribute, URL, JavaScript string 등 여러 출력 context가 있습니다. htmlspecialchars는 이 시험의 HTML text 위치에는 적합하지만 모든 context에 같은 함수 하나를 쓰면 안전한 것은 아닙니다.

3 · 눈으로 관계 읽기 Line 9 reflected XSS의 source-to-sink 사슬
  1. 01 Input source

    $_GET['user'] = <img ... onerror=...>

  2. 02 PHP variable

    2행에서 $user로 복사

  3. 03 Output sink

    9행 echo가 encoding 없이 HTML에 결합

  4. 04 Browser parser

    입력을 <img>와 event handler로 해석

  5. 05 Impact

    취약 site origin에서 공격 JavaScript 실행

같은 문자열이 PHP에서는 데이터였지만 HTML parser에 도착한 뒤 element와 JavaScript가 됩니다.

4 · TOY EXAMPLE

실패한 login 이름이 reflected XSS로 실행되는 과정

주어진 것과 목표 공격자는 user에 <img src=x onerror=alert(1)>, password에 아무 값이나 넣습니다. 이 username은 표에 없고 작은따옴표가 없어 SQL 문법 오류도 만들지 않는다고 가정합니다.

  1. 01
    Browser가 payload를 URL encode해 GET 요청을 보냅니다.

    왜? 특수문자가 전송 중 보이지 않게 바뀌어도 server에서 원래 문자로 복원된다는 점을 보기 위해서입니다.

    중간 결과 PHP의 $_GET['user']에는 다시 <img src=x onerror=alert(1)> 문자열이 들어갑니다.

  2. 02
    4·5행의 DB query 결과를 확인합니다.

    왜? 9행의 취약한 실패 분기에 도달해야 하기 때문입니다.

    중간 결과 그 login row가 없으므로 num_rows는 0이고 else 분기로 갑니다.

  3. 03
    9행에서 완성되는 response 조각을 적습니다.

    왜? Browser가 실제로 받는 byte를 확인하기 위해서입니다.

    중간 결과 <div>Fehlgeschlagener Login für Nutzer: <img src=x onerror=alert(1)></div>가 됩니다.

  4. 04
    Browser HTML parser가 response를 해석합니다.

    왜? Server가 문자열로 취급한 값이 다음 interpreter에서는 code가 될 수 있기 때문입니다.

    중간 결과 <img> element가 생성되고 존재하지 않는 x 로드가 실패해 onerror JavaScript가 실행됩니다.

  5. 05
    9행의 $userhtmlspecialchars($user, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8')를 적용합니다.

    왜? HTML 문법 문자를 text data로 고정하기 위해서입니다.

    중간 결과 <&lt;처럼 encoding되어 화면에는 payload 글자가 보이지만 element와 event handler는 만들어지지 않습니다.

예제 결론 취약점은 9행의 공격자 입력이 response를 거쳐 피해자 browser의 HTML/JavaScript code로 승격되는 데 있습니다.

실제 시험으로 옮기기 4점 답안에는 line 9, source-to-sink, reflected XSS, browser 실행 영향, HTML context encoding을 연결합니다.

개념 근거와 더 깊은 설명

시험 문구·배점은 실제 시험 PDF를 따르고, 위 개념 설명은 연결된 강의 자료의 해당 페이지를 기준으로 구성했습니다.

이번 문제는 이 단계로 풀어야 했습니다

먼저 문제에서 직접 주어진 값과 최종적으로 구할 값을 분리합니다. 그다음 각 값·용어·경로를 왜 선택했는지 확인하며, 앞 단계의 중간 결과를 다음 단계의 입력으로 사용합니다.

START HERE

먼저 문제를 식과 조건으로 정리하기

계산을 시작하기 전에 주어진 것구할 것을 분리합니다. 그다음 아래 관계식을 위에서 아래로 사용하면, 숫자가 어디서 왔는지 놓치지 않을 수 있습니다.

강사가 문제의 요구사항을 쉬운 말로 바꾸면

시험 문장이 요구하는 것: data output 취약점의 줄 번호와 위험을 설명하시오.

이 문제의 풀이 전략: 이 소문제에서는 공격자 입력 source를 찾는다 → 출력 sink와 line을 찾는다 → 최종 parser를 지정한다 → XSS 유형과 영향을 쓴다 → Context에 맞게 수정한다 순서로 진행합니다. 마지막에는 ‘각 line 옆에 최종 interpreter를 적습니다: line 4 → SQL, line 9 → HTML/JavaScript.’라는 교정 기준으로 답을 다시 확인합니다.

문제에서 주어진 정보
  • 실제 시험이 준 상황·문장

    data output 취약점의 줄 번호와 위험을 설명하시오.

  • 이 문항의 첫 출발점

    2행의 `$_GET['user']`는 URL에서 공격자가 조종하고 `$user`에 저장됩니다.

    신뢰할 수 없는 값이 어디서 시작하는지 line과 함께 적습니다.

최종적으로 구해야 하는 것
  • 마지막에 도달할 답안

    HTML text 위치에서 `htmlspecialchars($user, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8')`처럼 output encode합니다.

  • 정답을 지탱하는 이유

    취약한 곳은 9행입니다. 2행의 공격자 제어 `$user`가 encoding 없이 `echo`되어 response의 HTML text 위치에 들어갑니다. `<img src=x onerror=...>` 같은 입력은 실패 response에서 browser markup과 event handler로 해석되어 reflected XSS를 일으킬 수 있습니다. HTML context에 맞게 `htmlspecialchars(..., ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8')`로 encode해야 합니다.

사용할 공식·판정 관계
  • 이 소문제만의 풀이 사슬

    공격자 입력 source를 찾는다 → 출력 sink와 line을 찾는다 → 최종 parser를 지정한다 → XSS 유형과 영향을 쓴다 → Context에 맞게 수정한다

    같은 문자열이 PHP에서는 데이터였지만 HTML parser에 도착한 뒤 element와 JavaScript가 됩니다.

  1. 01

    공격자 입력 source를 찾는다

    구체적으로 2행의 $_GET['user']는 URL에서 공격자가 조종하고 $user에 저장됩니다.

    여기서 검산 신뢰할 수 없는 값이 어디서 시작하는지 line과 함께 적습니다.

    다음 단계로 여기서 확인한 내용을 다음 ‘출력 sink와 line을 찾는다’ 단계의 출발점으로 사용합니다.

  2. 02

    출력 sink와 line을 찾는다

    구체적으로 9행이 $user를 encoding 없이 HTML response에 echo합니다.

    여기서 검산 SQL injection이 있는 4행을 data output 답으로 고르지 않습니다.

    다음 단계로 여기서 확인한 내용을 다음 ‘최종 parser를 지정한다’ 단계의 출발점으로 사용합니다.

  3. 03

    최종 parser를 지정한다

    구체적으로 피해자 browser의 HTML parser가 <...>를 text가 아니라 markup으로 읽고 event handler를 JavaScript engine에 넘깁니다.

    여기서 검산 Script가 PHP server에서 실행된다고 잘못 쓰지 않습니다.

    다음 단계로 여기서 확인한 내용을 다음 ‘XSS 유형과 영향을 쓴다’ 단계의 출발점으로 사용합니다.

  4. 04

    XSS 유형과 영향을 쓴다

    구체적으로 한 request 입력이 같은 response에 반사되므로 reflected XSS이며 DOM 변경, credential 입력 탈취, 사용자 권한 요청 등이 가능합니다.

    여기서 검산 DB 저장이 없으므로 persistent XSS라고 부르지 않습니다.

    다음 단계로 여기서 확인한 내용을 다음 ‘Context에 맞게 수정한다’ 단계의 출발점으로 사용합니다.

  5. 05

    Context에 맞게 수정한다

    구체적으로 HTML text 위치에서 htmlspecialchars($user, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8')처럼 output encode합니다.

    여기서 검산 막연한 ‘sanitize’가 아니라 sink와 context에 맞는 처리를 씁니다.

    다음 단계로 앞 단계의 결과를 모아 채점 가능한 최종 답안으로 정리합니다.

정답과 해설

9행이 취약하다. 공격자가 조종하는 `$user`를 HTML body에 encoding 없이 echo하므로 reflected XSS가 가능하다. `htmlspecialchars(..., ENT_QUOTES|ENT_SUBSTITUTE, 'UTF-8')`로 출력 문맥에 맞게 encode한다.

시험 답안 골격

  1. line 9를 쓴다.
  2. source인 `$_GET['user']`와 sink인 echo를 연결한다.
  3. reflected XSS 영향을 설명한다.
  4. HTML context output encoding을 제시한다.

정답이 이렇게 되는 이유

취약한 곳은 9행입니다. 2행의 공격자 제어 $user가 encoding 없이 echo되어 response의 HTML text 위치에 들어갑니다. <img src=x onerror=...> 같은 입력은 실패 response에서 browser markup과 event handler로 해석되어 reflected XSS를 일으킬 수 있습니다. HTML context에 맞게 htmlspecialchars(..., ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8')로 encode해야 합니다.

초보자가 가장 자주 뒤집는 지점

잘못된 생각 4행이 위험하므로 data output XSS의 정답 line도 4행이다.

왜 틀렸나 4행은 DB의 SQL parser를 공격하는 injection sink이고, 9행은 browser의 HTML parser를 공격하는 output sink입니다.

고쳐 말하면 각 line 옆에 최종 interpreter를 적습니다: line 4 → SQL, line 9 → HTML/JavaScript.

한 문제만 더: 개념이 정말 연결됐는지 확인

질문 같은 $user를 HTML attribute의 따옴표 안이나 JavaScript string 안에 출력해도 언제나 같은 encoding만 쓰면 됩니까?

정답 아닙니다. 출력 context마다 parser 규칙이 달라 context-specific encoding 또는 안전한 API가 필요합니다.

이 문제의 오답 함정

  • SQL injection 줄인 4행과 XSS 줄인 9행을 혼동하지 않는다.
  • 입력 삭제만이 아니라 출력 문맥 encoding을 쓴다.
ACTIVE RECALL

이 소문제를 점수로 바꾸는 6개의 작은 훈련

해설을 닫은 상태에서 1번부터 수행하세요. 정답을 읽은 직후보다 직접 문제 지도를 만들고 답을 꺼낸 뒤 채점할 때 기억이 더 정확해집니다. 작성 내용과 복습 판정은 이 브라우저에 자동 저장됩니다.

  1. 01 · 30초 문제 지도

    해설을 보지 말고 주어진 정보 → 구할 것 → 사용할 공식·판정 관계를 한 줄씩 복원하세요.

    막힐 때만 첫 단서 열기

    브라우저는 출력 문자열을 단순 글자가 아니라 HTML 문법으로 읽는다. 그래서 사용자 입력의 `<...>`가 페이지 구조나 script가 될 수 있다.

  2. 02 · 90초 닫힌책 답안

    data output 취약점의 줄 번호와 위험을 설명하시오.

    정답 문장만 말하지 말고 근거·중간값·메시지 흐름 중 이 문항에 필요한 것을 빈 종이에 남기세요.

  3. 03 · 부분점수 자가채점

    작성한 뒤에만 아래 기준을 열고, 실제로 쓴 항목만 체크하세요.

    답안 작성 후 채점 기준 열기

    답안 슬롯 자가 점검 — 실제로 말하거나 쓴 항목만 체크하세요.

    0/4 slots

  4. 04 · 문항별 후속 질문·조건 전이
    • HTML attribute context라면 encoding 요구가 어떻게 달라지는가?
    • 공격자 입력에서 vulnerable sink, 보안 영향, 수정책까지의 인과 사슬을 화살표 네 칸으로 쓰고, 수정책이 적용되는 정확한 경계를 표시하세요.

    조건 변형: 제시한 수정책 하나만 적용했다고 가정하세요. 그 수정이 정확히 막는 입력 경로와 여전히 남는 별도 취약점을 각각 한 문장으로 쓰세요.

  5. 05 · 대표 오답 복구

    고칠 답안: SQL injection 줄인 4행과 XSS 줄인 9행을 혼동하지 않는다.

    복구 힌트: 브라우저는 출력 문자열을 단순 글자가 아니라 HTML 문법으로 읽는다. 그래서 사용자 입력의 `<...>`가 페이지 구조나 script가 될 수 있다.

    오답의 첫 잘못된 전제를 한 줄로 지우고, 올바른 조건과 결론을 두 줄로 다시 쓰세요.

  6. 06 · 확신도 보정·다음 복습 결정

    채점 전 예상과 실제 채점 결과가 달랐는지 확인한 뒤 상태를 남기세요. ‘숙달’은 근거와 중간 과정까지 무힌트로 재현했을 때만 선택합니다.

    현재 확신도
    아직 복습 판정을 남기지 않았습니다.
모든 훈련을 마친 뒤 핵심 정답 다시 확인

9행이 취약하다. 공격자가 조종하는 `$user`를 HTML body에 encoding 없이 echo하므로 reflected XSS가 가능하다. `htmlspecialchars(..., ENT_QUOTES|ENT_SUBSTITUTE, 'UTF-8')`로 출력 문맥에 맞게 encode한다.

근거: CSS_Altklausur_WiSe_2526.pdf · p14 / Web Sicherheit / 3.2 Schwachstellenanalyse einer Webanwendung · 시험지 표시 3.2.4 이제 이 문제 직접 풀기
3.2.5 표의 password 저장 방식이 만드는 결과 두 가지와 개선책은? 기존 71문항 학습 번호 49 · 4점 Password 감사

3.2.5 · 실제 시험 원문

5. Nennen Sie zwei Folgen, die die Art der Speicherung von Passwörtern in der Tabelle `users` ermöglichen und wie man die Datenspeicherrung verbessern kann. **(4 Punkte)**

한국어로 요구사항만 풀어 읽기

표의 password 저장 방식이 만드는 결과 두 가지와 개선책은?

Password를 저장하지 않고 검증값을 저장하는 법

TERMS FOR 3.2.5

이 소문제의 중요한 용어부터 이해하기

전문 용어를 알고 있다고 가정하지 않습니다. 아래 정의의 굵은 용어를 문제 문장 속 같은 단어와 바꾸어 읽은 뒤 풀이로 넘어가세요.

01Plaintext Password

암호화나 password hashing 없이 원래 password를 그대로 저장한 상태입니다.

작은 예: DB가 유출되면 공격자가 추가 계산 없이 모든 password를 바로 읽을 수 있습니다.

02Password hash / KDF

Password 검증을 위해 의도적으로 비용을 높여 만든 단방향 계산 결과입니다.

03Salt

사용자마다 새로 만드는 공개 random 값으로 같은 password도 서로 다른 저장 결과를 만들게 합니다.

04Cost parameter

Password 추측 한 번에 필요한 시간·memory 비용을 조절하는 설정입니다.

05Offline guessing

공격자가 유출된 database를 자기 장비에서 server 제한 없이 시험하는 공격입니다.

ZERO-BASE MINI LESSON · 3.2.5

이 소문제만을 위한 0부터 시작하는 미니 강의

아래 설명은 이 과목의 선행 지식을 가정하지 않습니다. 개념 → 비유의 대응 → 눈으로 읽는 구조 → 작은 예제 순서로 읽은 뒤 실제 시험 풀이로 넘어가세요.

1 · 먼저 알아야 할 개념

시험의 users 표에는 king2026, wonderland2002, 123456 같은 사람이 입력한 password가 그대로 보입니다. 이는 server가 login 검증용 verifier가 아니라 원문 plaintext를 DB에 저장했다는 뜻입니다. DB를 읽은 사람은 별도의 복호화나 cracking 없이 즉시 모든 password를 알 수 있습니다.

Password는 일반적으로 복호화 가능한 encryption보다 단방향 password hashing/KDF로 저장합니다. Login 때 입력 password와 저장된 salt를 같은 함수에 넣어 결과가 일치하는지만 확인합니다. Server는 원래 password를 되찾을 필요가 없습니다.

Argon2id, scrypt, bcrypt 같은 password 전용 함수는 의도적으로 느리고 비용을 조절할 수 있어 유출된 DB에 대한 offline guessing을 비싸게 만듭니다. PHP에서는 보통 password_hashPASSWORD_ARGON2ID 또는 PASSWORD_BCRYPT를 사용하고 그 결과를 password_verify로 검사합니다. scrypt를 택한다면 PHP의 이 API 조합이 아니라 검증된 별도 library/API와 그에 맞는 verify 절차가 필요합니다. 각 사용자마다 unique random salt를 쓰면 같은 password도 서로 다른 저장값이 됩니다.

Password reuse는 피해를 다른 service로 확장합니다. 이 표 안에서도 admin과 bob이 king2026을 공유합니다. 사용자가 Gmail·회사 VPN 등에서도 같은 값을 썼다면 공격자는 유출된 credential 조합을 자동 대입하는 credential stuffing을 시도할 수 있습니다.

2 · 일상 장면으로 먼저 잡기

호텔 금고의 열쇠를 확인하려고 열쇠 원본을 이름표 옆에 걸어 두는 대신, 일방향으로만 맞춤 여부를 검사하는 자물쇠 모형을 보관하는 상황입니다.

  • 이름표 옆의 실제 열쇠 DB의 plaintext password
  • 열쇠가 맞는지만 확인하는 복제 불가능한 자물쇠 모형 Password hash/KDF verifier
  • 객실마다 다른 자물쇠 부품 사용자별 unique salt
  • 맞춰 보는 데 시간이 오래 걸리는 장치 Argon2id 등 느리고 memory-hard한 KDF

비유의 경계 Hash도 약한 password 자체를 완전히 구해 주지는 못합니다. DB가 유출되면 공격자는 offline guess를 계속할 수 있으므로 강한 고유 password, MFA, 적절한 KDF 비용이 함께 필요합니다.

3 · 눈으로 관계 읽기 Plaintext 저장과 salted password KDF
  1. 01 Current admin row

    password = king2026

  2. 02 DB breach

    추가 계산 없이 즉시 login·credential stuffing

  3. 03 Unique salt

    사용자마다 다른 random 값

  4. 04 Argon2id

    Password와 salt로 느린 verifier 계산

  5. 05 Stored verifier

    Login 때 비교하며 plaintext 복원은 하지 않음

Salt는 같은 password의 저장값을 다르게 만들고 느린 KDF는 후보 하나를 검사하는 비용을 높입니다.

4 · TOY EXAMPLE

king2026 평문 row 두 개를 안전한 verifier로 바꾸기

주어진 것과 목표 현재 admin과 bob row의 password 열에는 둘 다 king2026이 그대로 저장되어 있습니다.

  1. 01
    현재 DB dump를 공격자가 얻었다고 가정합니다.

    왜? 평문 저장의 첫 번째 결과를 확인하기 위해서입니다.

    중간 결과 공격자는 계산 없이 admin과 bob의 password가 king2026임을 즉시 읽고 login할 수 있습니다.

  2. 02
    공격자가 다른 서비스에 admin/king2026 또는 관련 email과 king2026을 대입합니다.

    왜? Password reuse가 피해 범위를 어떻게 넓히는지 보기 위해서입니다.

    중간 결과 같은 값을 재사용한 외부 account까지 credential stuffing으로 탈취될 수 있습니다.

  3. 03
    PHP의 password_hash(..., PASSWORD_ARGON2ID)로 Admin과 Bob의 verifier를 각각 만듭니다.

    왜? 원문 대신 login 검증용 verifier만 보관하기 위해서입니다.

    중간 결과 입력 password가 같아도 salt가 달라 DB의 encoded hash 문자열은 서로 달라집니다.

  4. 04
    Login 때 PHP password_verify에 사용자가 입력한 값과 password_hash가 만든 저장 verifier를 전달합니다.

    왜? Server가 원래 password를 복호화하지 않고도 일치 여부를 확인하기 위해서입니다.

    중간 결과 일치 여부만 얻고 plaintext를 DB에 저장할 필요가 없어집니다.

  5. 05
    새 DB dump를 얻은 공격자의 작업을 비교합니다.

    왜? 개선이 침해를 불가능하게 하는지, 비용만 높이는지 정확히 말하기 위해서입니다.

    중간 결과 공격자는 각 row마다 느린 offline guess를 해야 하므로 즉시 노출보다는 훨씬 어렵지만 약한 king2026은 여전히 추측될 수 있습니다.

예제 결론 개선 목표는 password를 되찾을 수 있게 숨기는 것이 아니라 느리게 검증 가능한 salted verifier만 저장하는 것입니다.

실제 시험으로 옮기기 4점 답안은 평문 유출의 즉시 account 탈취와 reuse에 따른 외부 확산을 두 결과로 쓰고, unique salt가 포함된 느린 password KDF를 개선으로 연결합니다. PHP 예시는 password_hash의 Argon2id/bcrypt와 password_verify가 정확합니다.

개념 근거와 더 깊은 설명

시험 문구·배점은 실제 시험 PDF를 따르고, 위 개념 설명은 연결된 강의 자료의 해당 페이지를 기준으로 구성했습니다.

이번 문제는 이 단계로 풀어야 했습니다

먼저 문제에서 직접 주어진 값과 최종적으로 구할 값을 분리합니다. 그다음 각 값·용어·경로를 왜 선택했는지 확인하며, 앞 단계의 중간 결과를 다음 단계의 입력으로 사용합니다.

START HERE

먼저 문제를 식과 조건으로 정리하기

계산을 시작하기 전에 주어진 것구할 것을 분리합니다. 그다음 아래 관계식을 위에서 아래로 사용하면, 숫자가 어디서 왔는지 놓치지 않을 수 있습니다.

강사가 문제의 요구사항을 쉬운 말로 바꾸면

시험 문장이 요구하는 것: 표의 password 저장 방식이 만드는 결과 두 가지와 개선책은?

이 문제의 풀이 전략: 이 소문제에서는 저장 형태를 관찰한다 → 첫 번째 결과를 쓴다 → 두 번째 결과를 쓴다 → 저장 함수를 선택한다 → 검증 방식을 설명한다 순서로 진행합니다. 마지막에는 ‘Salt는 row별 공개 random 값, KDF는 느린 검증 함수, 저장값은 복호화하지 않는 verifier로 구분합니다.’라는 교정 기준으로 답을 다시 확인합니다.

문제에서 주어진 정보
  • 실제 시험이 준 상황·문장

    표의 password 저장 방식이 만드는 결과 두 가지와 개선책은?

  • 이 문항의 첫 출발점

    표에 사람이 읽을 수 있는 실제 password가 그대로 있으므로 plaintext 저장입니다.

    단순히 password가 약하다는 다음 소문항과 저장 방식 문제를 분리합니다.

최종적으로 구해야 하는 것
  • 마지막에 도달할 답안

    PHP `password_hash` 결과는 `password_verify`로 검사합니다. 다른 KDF는 해당 library의 verify API를 사용하며 원문 password는 복호화하지 않습니다.

  • 정답을 지탱하는 이유

    표는 password를 plaintext로 저장합니다. 첫째, DB가 유출되면 공격자는 cracking 없이 모든 계정에 즉시 로그인할 수 있습니다. 둘째, 같은 password를 다른 곳에서 재사용한 사용자는 credential stuffing으로 다른 service까지 피해를 입습니다. 사용자마다 unique random salt를 포함하는 느린 password KDF의 verifier만 저장해야 합니다. PHP에서는 `password_hash`로 만든 Argon2id/bcrypt verifier를 `password_verify`로 검사하고, scrypt를 선택하면 그 별도 library/API의 verify 절차를 사용합니다.

사용할 공식·판정 관계
  • 이 소문제만의 풀이 사슬

    저장 형태를 관찰한다 → 첫 번째 결과를 쓴다 → 두 번째 결과를 쓴다 → 저장 함수를 선택한다 → 검증 방식을 설명한다

    Salt는 같은 password의 저장값을 다르게 만들고 느린 KDF는 후보 하나를 검사하는 비용을 높입니다.

  1. 01

    저장 형태를 관찰한다

    구체적으로 표에 사람이 읽을 수 있는 실제 password가 그대로 있으므로 plaintext 저장입니다.

    여기서 검산 단순히 password가 약하다는 다음 소문항과 저장 방식 문제를 분리합니다.

    다음 단계로 여기서 확인한 내용을 다음 ‘첫 번째 결과를 쓴다’ 단계의 출발점으로 사용합니다.

  2. 02

    첫 번째 결과를 쓴다

    구체적으로 DB 유출이나 과도한 DB 권한이 생기면 모든 password가 즉시 노출되어 해당 계정을 바로 탈취할 수 있습니다.

    여기서 검산 평문인데도 공격자가 먼저 hash cracking해야 한다고 쓰지 않습니다.

    다음 단계로 여기서 확인한 내용을 다음 ‘두 번째 결과를 쓴다’ 단계의 출발점으로 사용합니다.

  3. 03

    두 번째 결과를 쓴다

    구체적으로 재사용된 password는 credential stuffing을 통해 다른 service account 피해로 확산됩니다.

    여기서 검산 표의 admin·bob king2026 중복을 실제 근거로 연결합니다.

    다음 단계로 여기서 확인한 내용을 다음 ‘저장 함수를 선택한다’ 단계의 출발점으로 사용합니다.

  4. 04

    저장 함수를 선택한다

    구체적으로 각 사용자별 random salt와 느린 password KDF를 사용합니다. PHP에서는 password_hash의 Argon2id/bcrypt를 쓰고, scrypt는 검증된 별도 library/API를 사용합니다.

    여기서 검산 빠른 SHA-256 한 번이나 unsalted hash만 제시하지 않습니다.

    다음 단계로 여기서 확인한 내용을 다음 ‘검증 방식을 설명한다’ 단계의 출발점으로 사용합니다.

  5. 05

    검증 방식을 설명한다

    구체적으로 PHP password_hash 결과는 password_verify로 검사합니다. 다른 KDF는 해당 library의 verify API를 사용하며 원문 password는 복호화하지 않습니다.

    여기서 검산 Encryption key로 password를 다시 읽는 방식을 최선으로 쓰지 않습니다.

    다음 단계로 앞 단계의 결과를 모아 채점 가능한 최종 답안으로 정리합니다.

정답과 해설

평문 저장이라 DB 유출 즉시 모든 비밀번호가 노출되고, 재사용한 다른 서비스까지 credential stuffing 피해가 번진다. 사용자별 salt가 포함된 느린 password KDF를 사용한다. PHP에서는 `password_hash`의 Argon2id/bcrypt 결과를 `password_verify`로 검사하며, scrypt는 검증된 별도 library/API가 필요하다.

시험 답안 골격

  1. 즉시 계정 탈취를 쓴다.
  2. password reuse/credential stuffing 확산을 쓴다.
  3. unique salt+slow password hash/KDF를 쓴다.

정답이 이렇게 되는 이유

표는 password를 plaintext로 저장합니다. 첫째, DB가 유출되면 공격자는 cracking 없이 모든 계정에 즉시 로그인할 수 있습니다. 둘째, 같은 password를 다른 곳에서 재사용한 사용자는 credential stuffing으로 다른 service까지 피해를 입습니다. 사용자마다 unique random salt를 포함하는 느린 password KDF의 verifier만 저장해야 합니다. PHP에서는 password_hash로 만든 Argon2id/bcrypt verifier를 password_verify로 검사하고, scrypt를 선택하면 그 별도 library/API의 verify 절차를 사용합니다.

초보자가 가장 자주 뒤집는 지점

잘못된 생각 Password를 SHA-256으로 한 번 hash하면 충분하고 salt는 값을 복호화하기 위한 key다.

왜 틀렸나 SHA-256은 대량 추측에 너무 빠르고 salt는 비밀 key나 복호화 재료가 아닙니다.

고쳐 말하면 Salt는 row별 공개 random 값, KDF는 느린 검증 함수, 저장값은 복호화하지 않는 verifier로 구분합니다.

한 문제만 더: 개념이 정말 연결됐는지 확인

질문 Admin과 Bob이 같은 king2026을 사용해도 unique salt를 쓰면 저장 hash가 달라지는 이유는 무엇입니까?

정답 KDF 입력에 password뿐 아니라 서로 다른 salt가 포함되므로 결과가 달라집니다. 다만 실제 password reuse 위험 자체가 사라지는 것은 아닙니다.

이 문제의 오답 함정

  • 빠른 SHA-256 한 번만으로 충분하다고 쓰지 않는다.
  • 비밀번호를 encryption해서 복호화 가능하게 저장하는 것을 최선이라 하지 않는다.
ACTIVE RECALL

이 소문제를 점수로 바꾸는 6개의 작은 훈련

해설을 닫은 상태에서 1번부터 수행하세요. 정답을 읽은 직후보다 직접 문제 지도를 만들고 답을 꺼낸 뒤 채점할 때 기억이 더 정확해집니다. 작성 내용과 복습 판정은 이 브라우저에 자동 저장됩니다.

  1. 01 · 30초 문제 지도

    해설을 보지 말고 주어진 정보 → 구할 것 → 사용할 공식·판정 관계를 한 줄씩 복원하세요.

    막힐 때만 첫 단서 열기

    비밀번호를 금고에 넣는 대신 명단 옆에 그대로 적어 둔 상태다. 필요한 것은 복호화 가능한 암호문이 아니라 login 때 다시 계산해 비교할 verifier다.

  2. 02 · 90초 닫힌책 답안

    표의 password 저장 방식이 만드는 결과 두 가지와 개선책은?

    정답 문장만 말하지 말고 근거·중간값·메시지 흐름 중 이 문항에 필요한 것을 빈 종이에 남기세요.

  3. 03 · 부분점수 자가채점

    작성한 뒤에만 아래 기준을 열고, 실제로 쓴 항목만 체크하세요.

    답안 작성 후 채점 기준 열기

    답안 슬롯 자가 점검 — 실제로 말하거나 쓴 항목만 체크하세요.

    0/3 slots

  4. 04 · 문항별 후속 질문·조건 전이
    • salt와 pepper의 역할 차이는?
    • 공격자 입력에서 vulnerable sink, 보안 영향, 수정책까지의 인과 사슬을 화살표 네 칸으로 쓰고, 수정책이 적용되는 정확한 경계를 표시하세요.

    조건 변형: 제시한 수정책 하나만 적용했다고 가정하세요. 그 수정이 정확히 막는 입력 경로와 여전히 남는 별도 취약점을 각각 한 문장으로 쓰세요.

  5. 05 · 대표 오답 복구

    고칠 답안: 빠른 SHA-256 한 번만으로 충분하다고 쓰지 않는다.

    복구 힌트: 비밀번호를 금고에 넣는 대신 명단 옆에 그대로 적어 둔 상태다. 필요한 것은 복호화 가능한 암호문이 아니라 login 때 다시 계산해 비교할 verifier다.

    오답의 첫 잘못된 전제를 한 줄로 지우고, 올바른 조건과 결론을 두 줄로 다시 쓰세요.

  6. 06 · 확신도 보정·다음 복습 결정

    채점 전 예상과 실제 채점 결과가 달랐는지 확인한 뒤 상태를 남기세요. ‘숙달’은 근거와 중간 과정까지 무힌트로 재현했을 때만 선택합니다.

    현재 확신도
    아직 복습 판정을 남기지 않았습니다.
모든 훈련을 마친 뒤 핵심 정답 다시 확인

평문 저장이라 DB 유출 즉시 모든 비밀번호가 노출되고, 재사용한 다른 서비스까지 credential stuffing 피해가 번진다. 사용자별 salt가 포함된 느린 password KDF를 사용한다. PHP에서는 `password_hash`의 Argon2id/bcrypt 결과를 `password_verify`로 검사하며, scrypt는 검증된 별도 library/API가 필요하다.

근거: CSS_Altklausur_WiSe_2526.pdf · p14 / Web Sicherheit / 3.2 Schwachstellenanalyse einer Webanwendung · 시험지 표시 3.2.5 이제 이 문제 직접 풀기
3.2.6 기능을 유지하면서 login.php를 안전하게 하는 변경 두 가지는? 기존 71문항 학습 번호 50 · 4점 Web 감사

3.2.6 · 실제 시험 원문

6. Nennen Sie zwei Änderungen an `login.php`, die zur Sicherheit beitragen, ohne die gewünschte Funktionalität zu beeinflussen. **(4 Punkte)**

한국어로 요구사항만 풀어 읽기

기능을 유지하면서 login.php를 안전하게 하는 변경 두 가지는?

SQL injection과 prepared statementXSS와 output encoding을 처음부터 이해하기

TERMS FOR 3.2.6

이 소문제의 중요한 용어부터 이해하기

전문 용어를 알고 있다고 가정하지 않습니다. 아래 정의의 굵은 용어를 문제 문장 속 같은 단어와 바꾸어 읽은 뒤 풀이로 넘어가세요.

01SQL query

Database에 조회·삽입·변경 등을 요청하는 SQL 문장입니다.

02SQL injection

공격자 입력이 SQL data가 아니라 query 구조와 명령으로 해석되는 취약점입니다.

03Prepared statement

SQL 구조를 먼저 고정하고 사용자 값을 별도 parameter로 전달하는 방식입니다.

04Parameter binding

입력값을 SQL syntax와 분리된 data slot에 연결하는 과정입니다.

05XSS

공격자 입력이 victim browser에서 data가 아니라 HTML 또는 JavaScript code로 실행되는 취약점입니다.

06Source

공격자 입력이 들어오는 URL, form, database record 같은 시작점입니다.

07Sink

입력이 HTML이나 script로 해석될 수 있는 위험한 사용 지점입니다.

08Output encoding

출력 context에서 특수문자가 code 문법이 아니라 data로 표현되도록 변환하는 방어입니다.

ZERO-BASE MINI LESSON · 3.2.6

이 소문제만을 위한 0부터 시작하는 미니 강의

아래 설명은 이 과목의 선행 지식을 가정하지 않습니다. 개념 → 비유의 대응 → 눈으로 읽는 구조 → 작은 예제 순서로 읽은 뒤 실제 시험 풀이로 넘어가세요.

1 · 먼저 알아야 할 개념

시험 login.php에는 독립된 두 code/data 경계가 있습니다. 4행의 문자열은 DB의 SQL parser가 읽고, 9행의 response 문자열은 피해자 browser의 HTML parser가 읽습니다. 두 취약점은 같은 $user에서 시작하지만 서로 다른 언어와 sink를 가집니다.

SQL injection 수정은 4행에서 query 문자열 결합을 없애고 prepared statement의 placeholder와 bound parameter를 사용하는 것입니다. 앞 문항처럼 password를 verifier로 저장한다면 username만 parameterized query로 조회한 뒤 PHP password_verify($pass, $storedHash)로 검증해야 합니다. 그러면 작은따옴표와 --는 SQL 문법이 아니라 username 값에 머물고 plaintext password 비교도 사라집니다.

Reflected XSS 수정은 9행에서 $user를 최종 HTML text context에 맞게 encode하는 것입니다. htmlspecialchars($user, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8')< 등을 entity로 바꿔 browser가 tag로 만들지 않게 합니다. 가능하면 실패 message에 사용자가 입력한 이름을 다시 표시하지 않는 generic message도 노출을 줄입니다.

‘입력을 sanitize한다’는 한 문장으로는 충분하지 않습니다. SQL과 HTML은 특수문자와 문맥이 다르므로 parameterization과 output encoding을 각각 적용해야 합니다. Client-side validation은 공격자가 request를 직접 만들 수 있어 server-side 방어를 대신하지 못합니다.

2 · 일상 장면으로 먼저 잡기

한 화물이 세관의 SQL 검사대와 공연장의 HTML 대본 검사대를 차례로 통과하며, 각 검사대가 서로 다른 금지 문법을 읽는 상황입니다.

  • 세관 신고서 양식과 화물을 분리 Prepared SQL template와 bound values
  • 공연 대본 속 지시문 기호를 일반 문자로 인쇄 HTML context output encoding
  • 세관 규칙만 적용하고 무대에 그대로 올림 SQLi는 막았지만 XSS sink는 남은 상태
  • 한 범용 스티커로 두 검사대를 통과하려 함 막연한 generic sanitization

비유의 경계 실제 application에는 URL, JavaScript, CSS, shell 등 더 많은 interpreter가 있을 수 있습니다. 모든 경계에서 구조와 데이터를 분리하거나 해당 output context의 안전한 API를 써야 합니다.

3 · 눈으로 관계 읽기 같은 입력이 만나는 두 interpreter와 두 수정
  1. 01 Untrusted $user

    GET parameter에서 시작

  2. 02 SQL boundary

    Prepared statement로 structure/value 분리

  3. 03 Database result

    SQLi 문자가 literal value로 비교됨

  4. 04 HTML boundary

    htmlspecialchars로 text context encoding

  5. 05 Browser result

    XSS 문자가 markup 아닌 visible text로 표시

하나의 입력을 한 번 씻는 것이 아니라 각 interpreter 경계에서 맞는 표현으로 바꿉니다.

4 · TOY EXAMPLE

Line 4와 line 9를 기능 유지하며 각각 수정하기

주어진 것과 목표 기존 기능은 올바른 user/password row가 있으면 성공하고, 없으면 실패 message를 보여 주는 것입니다.

  1. 01
    4행의 SQL을 SELECT password_hash FROM users WHERE login = ?라는 고정 template으로 준비합니다.

    왜? SQL 구조를 입력보다 먼저 확정하고 password verifier는 application에서 확인하기 위해서입니다.

    중간 결과 Username만을 위한 placeholder 하나가 생기고 plaintext password는 query에 들어가지 않습니다.

  2. 02
    $user를 parameter로 bind해 row를 가져온 뒤 password_verify($pass, $storedHash)를 실행합니다.

    왜? 입력 안의 quote·comment를 DB에는 값으로 전달하고 password는 저장 verifier와 안전하게 비교하기 위해서입니다.

    중간 결과 admin' -- 는 literal username일 뿐 SQL 구조를 바꾸지 못하고, 올바른 password만 verifier 검사를 통과합니다.

  3. 03
    9행에서 표시할 값을 htmlspecialchars($user, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8')로 변환합니다.

    왜? 실패 message라는 원하는 기능은 유지하면서 HTML parser가 입력을 markup으로 보지 않게 하기 위해서입니다.

    중간 결과 <img ...>가 화면에 글자로 표시되고 element나 event handler는 생성되지 않습니다.

  4. 04
    두 payload를 각각 새 code에 재대입합니다.

    왜? 수정이 서로 다른 취약점을 실제로 막는지 검산하기 위해서입니다.

    중간 결과 SQLi payload는 DB에서 데이터로, XSS payload는 browser에서 text로 남습니다.

  5. 05
    정상 user와 공격 payload로 username 조회와 password_verify를 다시 시험합니다.

    왜? SQL injection 방어와 password verifier 검증이 함께 기능을 유지하는지 확인하기 위해서입니다.

    중간 결과 정상 credential만 성공하고 payload는 query 구조도 password 판정도 우회하지 못합니다.

예제 결론 SQL parser 앞에서는 username parameter binding 후 password_verify, HTML parser 앞에서는 context-aware encoding이라는 별도 수정을 적용해야 합니다.

실제 시험으로 옮기기 4점 답안은 username-only prepared query와 verifier 검사, 그리고 output encoding을 쓰고 각각 SQL injection·평문 password 비교·reflected XSS와 연결합니다.

개념 근거와 더 깊은 설명

시험 문구·배점은 실제 시험 PDF를 따르고, 위 개념 설명은 연결된 강의 자료의 해당 페이지를 기준으로 구성했습니다.

  • Vorlesung/10 Web Application Security.pdf p.10, p.12, p.16 · SQL injection 정의·login query 예시·parameterized 방어 연결 개념 강의 열기
  • Vorlesung/10 Web Application Security.pdf p.21, p.18, p.23 · XSS 실행 위치·영향·reflected 흐름 연결 개념 강의 열기

이번 문제는 이 단계로 풀어야 했습니다

먼저 문제에서 직접 주어진 값과 최종적으로 구할 값을 분리합니다. 그다음 각 값·용어·경로를 왜 선택했는지 확인하며, 앞 단계의 중간 결과를 다음 단계의 입력으로 사용합니다.

START HERE

먼저 문제를 식과 조건으로 정리하기

계산을 시작하기 전에 주어진 것구할 것을 분리합니다. 그다음 아래 관계식을 위에서 아래로 사용하면, 숫자가 어디서 왔는지 놓치지 않을 수 있습니다.

강사가 문제의 요구사항을 쉬운 말로 바꾸면

시험 문장이 요구하는 것: 기능을 유지하면서 login.php를 안전하게 하는 변경 두 가지는?

이 문제의 풀이 전략: 이 소문제에서는 취약한 interpreter 두 개를 표시한다 → Line 4 문자열 결합을 없앤다 → 첫 수정의 효과를 설명한다 → Line 9 출력을 encode한다 → 둘째 수정의 효과를 설명한다 → 원래 기능 유지 여부를 확인한다 순서로 진행합니다. 마지막에는 ‘DB에는 parameter binding, browser output에는 context-specific encoding을 적용합니다.’라는 교정 기준으로 답을 다시 확인합니다.

문제에서 주어진 정보
  • 실제 시험이 준 상황·문장

    기능을 유지하면서 login.php를 안전하게 하는 변경 두 가지는?

  • 이 문항의 첫 출발점

    4행은 SQL parser, 9행은 browser HTML parser가 최종적으로 읽습니다.

    수정 둘을 같은 injection 이름으로 뭉치지 않습니다.

최종적으로 구해야 하는 것
  • 마지막에 도달할 답안

    정상 credential 비교와 성공·실패 표시라는 기능은 남고 공격 입력의 code 해석만 제거됩니다.

  • 정답을 지탱하는 이유

    두 핵심 변경은 서로 다릅니다. 첫째, 4행의 문자열 결합을 없애고 username만 prepared statement의 bound parameter로 조회한 뒤 저장된 PHP password verifier를 `password_verify($pass, $storedHash)`로 검사해 SQL injection과 plaintext password 비교를 제거합니다. 둘째, 9행의 `$user`를 HTML text context에 맞게 `htmlspecialchars(..., ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8')`로 encode하거나 generic error를 사용해 reflected XSS를 막습니다. 각 수정은 정상 login과 실패 표시 기능을 유지합니다.

사용할 공식·판정 관계
  • 이 소문제만의 풀이 사슬

    취약한 interpreter 두 개를 표시한다 → Line 4 문자열 결합을 없앤다 → 첫 수정의 효과를 설명한다 → Line 9 출력을 encode한다 → 둘째 수정의 효과를 설명한다 → 원래 기능 유지 여부를 확인한다

    하나의 입력을 한 번 씻는 것이 아니라 각 interpreter 경계에서 맞는 표현으로 바꿉니다.

  1. 01

    취약한 interpreter 두 개를 표시한다

    구체적으로 4행은 SQL parser, 9행은 browser HTML parser가 최종적으로 읽습니다.

    여기서 검산 수정 둘을 같은 injection 이름으로 뭉치지 않습니다.

    다음 단계로 여기서 확인한 내용을 다음 ‘Line 4 문자열 결합을 없앤다’ 단계의 출발점으로 사용합니다.

  2. 02

    Line 4 문자열 결합을 없앤다

    구체적으로 Username만 조회하는 prepared statement의 placeholder에 $user를 bind하고, 가져온 verifier를 PHP password_verify($pass, $storedHash)로 검사합니다.

    여기서 검산 Password hash를 SQL 문자열에서 직접 비교하거나 문자열 escape 후 이어 붙이지 않습니다.

    다음 단계로 여기서 확인한 내용을 다음 ‘첫 수정의 효과를 설명한다’ 단계의 출발점으로 사용합니다.

  3. 03

    첫 수정의 효과를 설명한다

    구체적으로 Quote와 comment가 값 안에 남아 SQL query structure를 바꾸지 못합니다.

    여기서 검산 Prepared statement가 SQL injection을 막는 이유를 적습니다.

    다음 단계로 여기서 확인한 내용을 다음 ‘Line 9 출력을 encode한다’ 단계의 출발점으로 사용합니다.

  4. 04

    Line 9 출력을 encode한다

    구체적으로 HTML text 위치의 $userhtmlspecialchars(..., ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8')를 적용하거나 generic message로 바꿉니다.

    여기서 검산 입력 시점이 아니라 출력 context에서 처리함을 확인합니다.

    다음 단계로 여기서 확인한 내용을 다음 ‘둘째 수정의 효과를 설명한다’ 단계의 출발점으로 사용합니다.

  5. 05

    둘째 수정의 효과를 설명한다

    구체적으로 Browser가 <, > 등을 tag 문법이 아니라 text로 읽어 reflected XSS가 차단됩니다.

    여기서 검산 SQL parameterization만으로 browser 출력도 안전해진다고 생각하지 않습니다.

    다음 단계로 여기서 확인한 내용을 다음 ‘원래 기능 유지 여부를 확인한다’ 단계의 출발점으로 사용합니다.

  6. 06

    원래 기능 유지 여부를 확인한다

    구체적으로 정상 credential 비교와 성공·실패 표시라는 기능은 남고 공격 입력의 code 해석만 제거됩니다.

    여기서 검산 모든 사용자 입력을 금지해 기능을 없애는 답을 제시하지 않습니다.

    다음 단계로 앞 단계의 결과를 모아 채점 가능한 최종 답안으로 정리합니다.

정답과 해설

첫째, username만 prepared statement로 조회한 뒤 저장된 verifier를 PHP `password_verify($pass, $storedHash)`로 검사한다. 둘째, 9행의 `$user`를 HTML context에 맞게 encode하거나 generic error를 사용한다.

시험 답안 골격

  1. username-only prepared statement와 `password_verify`를 쓴다.
  2. context-aware output encoding을 쓴다.
  3. 각 수정이 SQLi와 XSS 중 무엇을 막는지 연결한다.

정답이 이렇게 되는 이유

두 핵심 변경은 서로 다릅니다. 첫째, 4행의 문자열 결합을 없애고 username만 prepared statement의 bound parameter로 조회한 뒤 저장된 PHP password verifier를 password_verify($pass, $storedHash)로 검사해 SQL injection과 plaintext password 비교를 제거합니다. 둘째, 9행의 $user를 HTML text context에 맞게 htmlspecialchars(..., ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8')로 encode하거나 generic error를 사용해 reflected XSS를 막습니다. 각 수정은 정상 login과 실패 표시 기능을 유지합니다.

초보자가 가장 자주 뒤집는 지점

잘못된 생각 특수문자 ', <, >를 input에서 모두 삭제하면 SQLi와 XSS가 동시에 완전히 해결된다.

왜 틀렸나 문맥마다 문법이 다르고 encoding·우회 방식도 많으며 정상적인 이름 데이터까지 손상시킬 수 있습니다.

고쳐 말하면 DB에는 parameter binding, browser output에는 context-specific encoding을 적용합니다.

한 문제만 더: 개념이 정말 연결됐는지 확인

질문 User 값을 JSON response 안에 넣는 endpoint라면 HTML용 htmlspecialchars만 쓰는 것이 맞습니까?

정답 아닙니다. JSON serializer처럼 그 output format을 올바르게 생성하는 API를 사용해야 합니다. 방어는 최종 parser와 context에 맞춰야 합니다.

이 문제의 오답 함정

  • 'sanitize input' 한 문장으로 두 취약점을 퉁치지 않는다.
  • client-side validation만 제시하지 않는다.
ACTIVE RECALL

이 소문제를 점수로 바꾸는 6개의 작은 훈련

해설을 닫은 상태에서 1번부터 수행하세요. 정답을 읽은 직후보다 직접 문제 지도를 만들고 답을 꺼낸 뒤 채점할 때 기억이 더 정확해집니다. 작성 내용과 복습 판정은 이 브라우저에 자동 저장됩니다.

  1. 01 · 30초 문제 지도

    해설을 보지 말고 주어진 정보 → 구할 것 → 사용할 공식·판정 관계를 한 줄씩 복원하세요.

    막힐 때만 첫 단서 열기

    이 문제는 서로 다른 두 해석기를 막는 문제다. DB에는 SQL 구조와 데이터를 분리하고, browser에는 HTML 문법 문자로 해석되지 않게 출력 encoding한다.

  2. 02 · 90초 닫힌책 답안

    기능을 유지하면서 login.php를 안전하게 하는 변경 두 가지는?

    정답 문장만 말하지 말고 근거·중간값·메시지 흐름 중 이 문항에 필요한 것을 빈 종이에 남기세요.

  3. 03 · 부분점수 자가채점

    작성한 뒤에만 아래 기준을 열고, 실제로 쓴 항목만 체크하세요.

    답안 작성 후 채점 기준 열기

    답안 슬롯 자가 점검 — 실제로 말하거나 쓴 항목만 체크하세요.

    0/3 slots

  4. 04 · 문항별 후속 질문·조건 전이
    • SQL context와 HTML context가 서로 다른 이유는?
    • 공격자 입력에서 vulnerable sink, 보안 영향, 수정책까지의 인과 사슬을 화살표 네 칸으로 쓰고, 수정책이 적용되는 정확한 경계를 표시하세요.

    조건 변형: 제시한 수정책 하나만 적용했다고 가정하세요. 그 수정이 정확히 막는 입력 경로와 여전히 남는 별도 취약점을 각각 한 문장으로 쓰세요.

  5. 05 · 대표 오답 복구

    고칠 답안: 'sanitize input' 한 문장으로 두 취약점을 퉁치지 않는다.

    복구 힌트: 이 문제는 서로 다른 두 해석기를 막는 문제다. DB에는 SQL 구조와 데이터를 분리하고, browser에는 HTML 문법 문자로 해석되지 않게 출력 encoding한다.

    오답의 첫 잘못된 전제를 한 줄로 지우고, 올바른 조건과 결론을 두 줄로 다시 쓰세요.

  6. 06 · 확신도 보정·다음 복습 결정

    채점 전 예상과 실제 채점 결과가 달랐는지 확인한 뒤 상태를 남기세요. ‘숙달’은 근거와 중간 과정까지 무힌트로 재현했을 때만 선택합니다.

    현재 확신도
    아직 복습 판정을 남기지 않았습니다.
모든 훈련을 마친 뒤 핵심 정답 다시 확인

첫째, username만 prepared statement로 조회한 뒤 저장된 verifier를 PHP `password_verify($pass, $storedHash)`로 검사한다. 둘째, 9행의 `$user`를 HTML context에 맞게 encode하거나 generic error를 사용한다.

근거: CSS_Altklausur_WiSe_2526.pdf · p14 / Web Sicherheit / 3.2 Schwachstellenanalyse einer Webanwendung · 시험지 표시 3.2.6 이제 이 문제 직접 풀기
3.2.7 표에 있는 사용자 password 선택을 평가하고 근거를 쓰시오. 기존 71문항 학습 번호 51 · 2점 Password 감사

3.2.7 · 실제 시험 원문

7. Wie beurteilen sie die Wahl der Passwörter der Benutzer in der Tabelle? Begründen Sie kurz. **(2 Punkte)**

한국어로 요구사항만 풀어 읽기

표에 있는 사용자 password 선택을 평가하고 근거를 쓰시오.

강한 password를 공격자 관점에서 평가하기Password를 저장하지 않고 검증값을 저장하는 법

TERMS FOR 3.2.7

이 소문제의 중요한 용어부터 이해하기

전문 용어를 알고 있다고 가정하지 않습니다. 아래 정의의 굵은 용어를 문제 문장 속 같은 단어와 바꾸어 읽은 뒤 풀이로 넘어가세요.

01Plaintext Password

암호화나 password hashing 없이 원래 password를 그대로 저장한 상태입니다.

작은 예: DB가 유출되면 공격자가 추가 계산 없이 모든 password를 바로 읽을 수 있습니다.

02Password entropy

공격자 관점에서 password가 얼마나 예측 불가능한지를 나타내는 정도입니다.

03Dictionary attack

흔한 단어와 알려진 변형 규칙을 우선 시험하는 password 추측 공격입니다.

04Credential stuffing

다른 site에서 유출된 username/password 조합을 재사용해 login하는 공격입니다.

05MFA

Password 외에 별도의 factor를 요구해 password 하나의 유출만으로 login하기 어렵게 하는 인증 방식입니다.

06Password hash / KDF

Password 검증을 위해 의도적으로 비용을 높여 만든 단방향 계산 결과입니다.

07Salt

사용자마다 새로 만드는 공개 random 값으로 같은 password도 서로 다른 저장 결과를 만들게 합니다.

08Cost parameter

Password 추측 한 번에 필요한 시간·memory 비용을 조절하는 설정입니다.

ZERO-BASE MINI LESSON · 3.2.7

이 소문제만을 위한 0부터 시작하는 미니 강의

아래 설명은 이 과목의 선행 지식을 가정하지 않습니다. 개념 → 비유의 대응 → 눈으로 읽는 구조 → 작은 예제 순서로 읽은 뒤 실제 시험 풀이로 넘어가세요.

1 · 먼저 알아야 할 개념

Password 강도는 눈에 보이는 특수문자 개수 하나로 정하지 않습니다. 공격자가 먼저 시도할 common password인지, 사전 단어·이름·연도 같은 규칙으로 생성됐는지, 충분히 긴지, 다른 account와 재사용됐는지를 함께 봅니다.

시험 표에는 admin king2026, alice wonderland2002, bob king2026, charlie 123456, eve 34@s5wa-rPg5.5가 있습니다. 123456은 매우 흔하고, king2026wonderland2002는 단어+숫자 패턴으로 추측하기 쉽습니다. 더구나 admin과 bob은 같은 king2026을 공유합니다.

Eve의 14자 값은 대소문자·숫자·기호가 섞여 있어 표의 다른 값보다 상대적으로 예측하기 어려워 보입니다. 그러나 생성 방식과 다른 site에서의 reuse를 모르므로 절대적으로 안전하다고 증명할 수는 없습니다.

권장 방식은 password manager가 계정마다 생성한 길고 random한 고유 password 또는 충분히 긴 고유 passphrase입니다. Server 쪽에서는 breached-password 차단, rate limiting, salted slow hash, MFA를 함께 사용하지만 이런 조치는 사용자가 같은 password를 재사용하는 문제를 완전히 대신하지 않습니다.

2 · 일상 장면으로 먼저 잡기

여러 문의 열쇠를 고를 때 반짝이는 장식 수보다 열쇠 모양이 흔한지, 길이가 충분한지, 같은 열쇠를 여러 문에 쓰는지를 평가하는 상황입니다.

  • 누구나 가진 단순 열쇠 123456 같은 common password
  • 이름과 연도를 새긴 예측 가능한 열쇠 king2026, wonderland2002
  • 같은 열쇠로 관리자실과 일반실을 엶 Admin과 Bob의 king2026 재사용
  • 문마다 기계가 만든 서로 다른 긴 열쇠 Password manager의 unique random password

비유의 경계 Password 추측 난이도는 실제 공격자의 사전, 유출 정보, server rate limit과 hash 비용에 따라 달라집니다. 문자열 모양만 보고 정확한 entropy를 계산할 수는 없습니다.

3 · 눈으로 관계 읽기 표의 password를 세 기준으로 읽기
  1. 01 charlie / 123456

    Common list 최상위권·짧은 순차 숫자

  2. 02 admin+bob / king2026

    사전 단어+연도이며 두 account가 재사용

  3. 03 alice / wonderland2002

    긴 편이지만 알려진 단어+연도 패턴

  4. 04 eve / 34@s5wa-rPg5.5

    14자, 표에서는 상대적으로 덜 예측 가능

  5. 05 권장안

    계정별 unique random password 또는 긴 passphrase

문자 종류만 세지 말고 commonness, pattern, length, reuse를 함께 비교합니다.

4 · TOY EXAMPLE

공격자의 추측 순서로 표의 다섯 password 평가하기

주어진 것과 목표 공격자는 이 회사의 password hash를 얻었거나 online login을 시도하며 common list와 규칙 기반 후보를 순서대로 검사합니다.

  1. 01
    가장 흔한 숫자열 목록을 먼저 대입합니다.

    왜? 공격 도구는 random brute force보다 성공률 높은 common password를 먼저 시도하기 때문입니다.

    중간 결과 Charlie의 123456은 매우 이른 단계에 맞아 가장 약한 선택입니다.

  2. 02
    사전 단어 뒤에 연도를 붙이는 규칙을 대입합니다.

    왜? 사람이 만든 password의 전형적인 변형을 자동 생성할 수 있기 때문입니다.

    중간 결과 king2026wonderland2002도 무작위 공간 전체를 탐색하기 전에 후보로 나옵니다.

  3. 03
    동일한 값이 있는 row를 비교합니다.

    왜? 재사용은 한 번 알아낸 secret의 피해를 여러 identity로 넓히기 때문입니다.

    중간 결과 Admin과 Bob이 같은 king2026을 써서 Bob 쪽 노출도 관리자 account에 직접 위험합니다.

  4. 04
    Eve의 34@s5wa-rPg5.5를 상대 평가합니다.

    왜? 길이와 겉보기 무작위성을 다른 값과 비교하기 위해서입니다.

    중간 결과 14자에 여러 문자 종류가 있고 명백한 단어 패턴이 적어 표 안에서는 상대적으로 강합니다.

  5. 05
    개선 정책을 실제 사용자 행동으로 바꿉니다.

    왜? 기호 추가 같은 작은 규칙보다 재사용과 예측 가능성을 직접 줄이기 위해서입니다.

    중간 결과 각 account마다 password manager가 만든 긴 고유 값과 MFA를 사용하도록 합니다.

예제 결론 이 표의 핵심 문제는 매우 흔한 값, 규칙적인 단어+연도, 그리고 관리자까지 포함한 password 재사용입니다.

실제 시험으로 옮기기 2점 답안에서는 최소한 123456의 취약성, king2026 재사용·예측 가능성, Eve 값의 상대적 우수성을 근거와 함께 압축합니다.

개념 근거와 더 깊은 설명

시험 문구·배점은 실제 시험 PDF를 따르고, 위 개념 설명은 연결된 강의 자료의 해당 페이지를 기준으로 구성했습니다.

이번 문제는 이 단계로 풀어야 했습니다

먼저 문제에서 직접 주어진 값과 최종적으로 구할 값을 분리합니다. 그다음 각 값·용어·경로를 왜 선택했는지 확인하며, 앞 단계의 중간 결과를 다음 단계의 입력으로 사용합니다.

START HERE

먼저 문제를 식과 조건으로 정리하기

계산을 시작하기 전에 주어진 것구할 것을 분리합니다. 그다음 아래 관계식을 위에서 아래로 사용하면, 숫자가 어디서 왔는지 놓치지 않을 수 있습니다.

강사가 문제의 요구사항을 쉬운 말로 바꾸면

시험 문장이 요구하는 것: 표에 있는 사용자 password 선택을 평가하고 근거를 쓰시오.

이 문제의 풀이 전략: 이 소문제에서는 평가 기준을 먼저 세운다 → 가장 명백한 약한 값을 지적한다 → 규칙 기반 값을 지적한다 → 재사용을 별도로 지적한다 → 상대적으로 나은 값을 조심스럽게 평가한다 → 실행 가능한 권장안을 쓴다 순서로 진행합니다. 마지막에는 ‘길이와 고유성, 예측 불가능성을 우선하고 문자 종류는 그 결과로 봅니다.’라는 교정 기준으로 답을 다시 확인합니다.

문제에서 주어진 정보
  • 실제 시험이 준 상황·문장

    표에 있는 사용자 password 선택을 평가하고 근거를 쓰시오.

  • 이 문항의 첫 출발점

    길이, 예측 가능성, common list 포함 여부, account 간 reuse를 봅니다.

    특수문자 유무 하나만으로 강도를 결정하지 않습니다.

최종적으로 구해야 하는 것
  • 마지막에 도달할 답안

    Password manager로 계정별 긴 random password를 만들거나 긴 고유 passphrase를 쓰고 MFA를 추가합니다.

  • 정답을 지탱하는 이유

    전반적으로 좋지 않습니다. Charlie의 `123456`은 매우 흔하고, `king2026`과 `wonderland2002`는 사전 단어+연도 패턴이라 예측하기 쉽습니다. 특히 admin과 bob이 `king2026`을 재사용해 한 계정의 노출이 관리자 계정으로 번집니다. Eve의 `34@s5wa-rPg5.5`가 표에서는 상대적으로 강하지만 절대 안전을 보장할 수 없습니다. 계정별로 긴 고유 password를 password manager로 생성하는 편이 좋습니다.

사용할 공식·판정 관계
  • 이 소문제만의 풀이 사슬

    평가 기준을 먼저 세운다 → 가장 명백한 약한 값을 지적한다 → 규칙 기반 값을 지적한다 → 재사용을 별도로 지적한다 → 상대적으로 나은 값을 조심스럽게 평가한다 → 실행 가능한 권장안을 쓴다

    문자 종류만 세지 말고 commonness, pattern, length, reuse를 함께 비교합니다.

  1. 01

    평가 기준을 먼저 세운다

    구체적으로 길이, 예측 가능성, common list 포함 여부, account 간 reuse를 봅니다.

    여기서 검산 특수문자 유무 하나만으로 강도를 결정하지 않습니다.

    다음 단계로 여기서 확인한 내용을 다음 ‘가장 명백한 약한 값을 지적한다’ 단계의 출발점으로 사용합니다.

  2. 02

    가장 명백한 약한 값을 지적한다

    구체적으로 Charlie의 123456은 매우 흔한 순차 숫자라 즉시 추측될 수 있습니다.

    여기서 검산 표의 실제 username과 값을 근거로 씁니다.

    다음 단계로 여기서 확인한 내용을 다음 ‘규칙 기반 값을 지적한다’ 단계의 출발점으로 사용합니다.

  3. 03

    규칙 기반 값을 지적한다

    구체적으로 king2026, wonderland2002는 사전 단어와 연도 조합이라 자동 guessing 규칙에 취약합니다.

    여기서 검산 길기만 하면 무조건 강하다고 쓰지 않습니다.

    다음 단계로 여기서 확인한 내용을 다음 ‘재사용을 별도로 지적한다’ 단계의 출발점으로 사용합니다.

  4. 04

    재사용을 별도로 지적한다

    구체적으로 Admin과 Bob이 king2026을 공유해 한 account의 노출이 다른 account, 특히 관리자에게 번집니다.

    여기서 검산 같은 표 안의 중복을 놓치지 않습니다.

    다음 단계로 여기서 확인한 내용을 다음 ‘상대적으로 나은 값을 조심스럽게 평가한다’ 단계의 출발점으로 사용합니다.

  5. 05

    상대적으로 나은 값을 조심스럽게 평가한다

    구체적으로 Eve의 34@s5wa-rPg5.5가 표에서는 상대적으로 강하지만 생성·reuse 정보를 몰라 절대 안전하다고 할 수 없습니다.

    여기서 검산 상대적 평가와 보안 보장을 구분합니다.

    다음 단계로 여기서 확인한 내용을 다음 ‘실행 가능한 권장안을 쓴다’ 단계의 출발점으로 사용합니다.

  6. 06

    실행 가능한 권장안을 쓴다

    구체적으로 Password manager로 계정별 긴 random password를 만들거나 긴 고유 passphrase를 쓰고 MFA를 추가합니다.

    여기서 검산 단순히 끝에 ! 하나를 붙이라는 규칙으로 끝내지 않습니다.

    다음 단계로 앞 단계의 결과를 모아 채점 가능한 최종 답안으로 정리합니다.

정답과 해설

`123456`은 매우 약하고, `king2026`은 예측 가능하며 admin과 bob이 재사용한다. `wonderland2002`도 사전 단어+연도 패턴이다. Eve의 `34@s5wa-rPg5.5`가 상대적으로 강하다. 긴 고유 passphrase와 password manager가 바람직하다.

시험 답안 골격

  1. charlie의 약한 password를 지적한다.
  2. admin/bob의 재사용을 지적한다.
  3. alice의 예측 가능한 패턴을 지적한다.
  4. Eve가 상대적으로 강함을 말한다.

정답이 이렇게 되는 이유

전반적으로 좋지 않습니다. Charlie의 123456은 매우 흔하고, king2026wonderland2002는 사전 단어+연도 패턴이라 예측하기 쉽습니다. 특히 admin과 bob이 king2026을 재사용해 한 계정의 노출이 관리자 계정으로 번집니다. Eve의 34@s5wa-rPg5.5가 표에서는 상대적으로 강하지만 절대 안전을 보장할 수 없습니다. 계정별로 긴 고유 password를 password manager로 생성하는 편이 좋습니다.

초보자가 가장 자주 뒤집는 지점

잘못된 생각 대문자·숫자·기호가 하나씩 있으면 길이와 재사용 여부와 관계없이 강한 password다.

왜 틀렸나 공격자는 사람이 자주 쓰는 치환·연도·기호 추가 규칙을 이미 사전에 포함하며, 재사용은 한 번의 성공을 여러 계정으로 확장합니다.

고쳐 말하면 길이와 고유성, 예측 불가능성을 우선하고 문자 종류는 그 결과로 봅니다.

한 문제만 더: 개념이 정말 연결됐는지 확인

질문 Admin과 Bob의 king2026 중 Bob account만 먼저 유출돼도 admin이 위험한 이유는 무엇입니까?

정답 같은 password를 재사용했으므로 공격자가 알아낸 king2026을 admin login에도 그대로 대입할 수 있기 때문입니다.

이 문제의 오답 함정

  • 문자 종류만 세고 reuse를 놓치지 않는다.
ACTIVE RECALL

이 소문제를 점수로 바꾸는 6개의 작은 훈련

해설을 닫은 상태에서 1번부터 수행하세요. 정답을 읽은 직후보다 직접 문제 지도를 만들고 답을 꺼낸 뒤 채점할 때 기억이 더 정확해집니다. 작성 내용과 복습 판정은 이 브라우저에 자동 저장됩니다.

  1. 01 · 30초 문제 지도

    해설을 보지 말고 주어진 정보 → 구할 것 → 사용할 공식·판정 관계를 한 줄씩 복원하세요.

    막힐 때만 첫 단서 열기

    복잡한 기호 하나보다 길이와 고유성이 중요하다. 같은 열쇠를 여러 문에 쓰면 한 곳의 유출이 모든 문을 연다.

  2. 02 · 90초 닫힌책 답안

    표에 있는 사용자 password 선택을 평가하고 근거를 쓰시오.

    정답 문장만 말하지 말고 근거·중간값·메시지 흐름 중 이 문항에 필요한 것을 빈 종이에 남기세요.

  3. 03 · 부분점수 자가채점

    작성한 뒤에만 아래 기준을 열고, 실제로 쓴 항목만 체크하세요.

    답안 작성 후 채점 기준 열기

    답안 슬롯 자가 점검 — 실제로 말하거나 쓴 항목만 체크하세요.

    0/4 slots

  4. 04 · 문항별 후속 질문·조건 전이
    • 길고 고유한 passphrase가 짧고 복잡해 보이는 문자열보다 나을 수 있는 이유는?
    • 공격자 입력에서 vulnerable sink, 보안 영향, 수정책까지의 인과 사슬을 화살표 네 칸으로 쓰고, 수정책이 적용되는 정확한 경계를 표시하세요.

    조건 변형: 제시한 수정책 하나만 적용했다고 가정하세요. 그 수정이 정확히 막는 입력 경로와 여전히 남는 별도 취약점을 각각 한 문장으로 쓰세요.

  5. 05 · 대표 오답 복구

    고칠 답안: 문자 종류만 세고 reuse를 놓치지 않는다.

    복구 힌트: 복잡한 기호 하나보다 길이와 고유성이 중요하다. 같은 열쇠를 여러 문에 쓰면 한 곳의 유출이 모든 문을 연다.

    오답의 첫 잘못된 전제를 한 줄로 지우고, 올바른 조건과 결론을 두 줄로 다시 쓰세요.

  6. 06 · 확신도 보정·다음 복습 결정

    채점 전 예상과 실제 채점 결과가 달랐는지 확인한 뒤 상태를 남기세요. ‘숙달’은 근거와 중간 과정까지 무힌트로 재현했을 때만 선택합니다.

    현재 확신도
    아직 복습 판정을 남기지 않았습니다.
모든 훈련을 마친 뒤 핵심 정답 다시 확인

`123456`은 매우 약하고, `king2026`은 예측 가능하며 admin과 bob이 재사용한다. `wonderland2002`도 사전 단어+연도 패턴이다. Eve의 `34@s5wa-rPg5.5`가 상대적으로 강하다. 긴 고유 passphrase와 password manager가 바람직하다.

근거: CSS_Altklausur_WiSe_2526.pdf · p14 / Web Sicherheit / 3.2 Schwachstellenanalyse einer Webanwendung · 시험지 표시 3.2.7 이제 이 문제 직접 풀기

ACTIVE RECALL

이 페이지를 닫기 전 확인

  1. Line 4의 입력은 어느 parser가 명령으로 읽나요?
  2. Line 9의 입력은 어느 parser가 읽나요?
  3. Password 저장에 salt와 slow KDF가 필요한 이유는?