Study/Web Security
[웹 보안] 취약한 웹 페이지 작성
얀 짱
2026. 5. 26. 02:22
🐢 안녕하세요, 카메입니다.
오늘은 저번에 만들었던 공격의 대상이 될 데이터베이스가 쓰일 취약한 웹 페이지를 간단하게, 아주 간단하게! 만들어보려고 합니다.
Step 1: 로그인 페이지 (Basic SQL Injection용)
sudo nano /var/www/html/login.php<?php
$conn = mysqli_connect("localhost", "webuser", "webpass123", "web_security");
if (isset($_POST['login'])) {
$user = $_POST['username'];
$pass = $_POST['password'];
$query = "SELECT * FROM users WHERE username='$user' AND password='$pass'";
$result = mysqli_query($conn, $query);
echo "<h3>실행된 쿼리:</h3>";
echo "<p style='color:gray;'>$query</p>";
if (mysqli_num_rows($result) > 0) {
$row = mysqli_fetch_assoc($result);
echo "<h2 style='color:green;'>로그인 성공! 환영합니다, " . $row['username'] . "님</h2>";
} else {
echo "<h2 style='color:red;'>로그인 실패! 아이디 또는 비밀번호가 틀렸습니다.</h2>";
}
}
?>
<html>
<head><title>로그인</title></head>
<body>
<h1>로그인 페이지</h1>
<form method="POST">
아이디: <input type="text" name="username"><br><br>
비밀번호: <input type="text" name="password"><br><br>
<button type="submit" name="login">로그인</button>
</form>
</body>
</html>
Step 2: 게시판 검색 페이지 (Union-based SQL Injection용)
sudo nano /var/www/html/search.php<?php
$conn = mysqli_connect("localhost", "webuser", "webpass123", "web_security");
if (isset($_GET['keyword'])) {
$keyword = $_GET['keyword'];
$query = "SELECT * FROM board WHERE title LIKE '%$keyword%'";
$result = mysqli_query($conn, $query);
echo "<h3>실행된 쿼리:</h3>";
echo "<p style='color:gray;'>$query</p>";
if ($result && mysqli_num_rows($result) > 0) {
echo "<table border='1' cellpadding='8'>";
echo "<tr><th>ID</th><th>제목</th><th>내용</th><th>작성자</th></tr>";
while ($row = mysqli_fetch_assoc($result)) {
echo "<tr>";
echo "<td>" . $row['id'] . "</td>";
echo "<td>" . $row['title'] . "</td>";
echo "<td>" . $row['content'] . "</td>";
echo "<td>" . $row['author'] . "</td>";
echo "</tr>";
}
echo "</table>";
} else {
echo "<p>검색 결과가 없습니다.</p>";
}
}
?>
<html>
<head><title>게시판 검색</title></head>
<body>
<h1>게시판 검색</h1>
<form method="GET">
검색어: <input type="text" name="keyword">
<button type="submit">검색</button>
</form>
</body>
</html>
Step 3: Blind SQL Injection용 페이지
sudo nano /var/www/html/blind.php<?php
$conn = mysqli_connect("localhost", "webuser", "webpass123", "web_security");
mysqli_report(MYSQLI_REPORT_OFF);
if (isset($_GET['id'])) {
$id = $_GET['id'];
$query = "SELECT * FROM board WHERE id=$id";
$result = @mysqli_query($conn, $query);
echo "<h3>입력한 ID: $id</h3>";
if ($result && mysqli_num_rows($result) > 0) {
echo "<h2 style='color:green;'>게시글이 존재합니다.</h2>";
} else {
echo "<h2 style='color:red;'>게시글이 존재하지 않습니다.</h2>";
}
}
?>
<html>
<head><title>게시글 조회</title></head>
<body>
<h1>게시글 조회</h1>
<form method="GET">
게시글 ID: <input type="text" name="id">
<button type="submit">조회</button>
</form>
</body>
</html>
Step 4: 동작 확인
브라우저에서 아래 주소들에 접속해서 각 페이지가 뜨는지 확인해 보도록 하겠습니다.
- http://localhost/login.php → 로그인 폼이 보이면 OK
- http://localhost/search.php → 검색 폼이 보이면 OK
- http://localhost/blind.php → 게시글 ID 입력 폼이 보이면 OK


