개발 블로그

[웹 보안] 취약한 웹 페이지 작성 본문

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
http://localhost/login.php → 로그인 폼이 보이면 OK
http://localhost/search.php → 검색 폼이 보이면 OK
http://localhost/blind.php → 게시글 ID 입력 폼이 보이면 OK