| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 데이터분포
- 루키즈
- sqld
- SK쉴더스
- List
- 레이블인코딩
- Linked List
- 꽉뚝짝 시장
- gdgm
- echo 명령어
- 지도학습
- OT후기
- Package
- 생성형AI
- 함수
- pandas
- 보안공부
- 방콕
- node.js
- tunder client
- 수업복습
- 태국
- 성능평가지표
- 패키지
- git push -u
- dropna
- 루키즈33기
- 클래스
- 블록(Block)
- 예외처리
Archives
- Today
- Total
개발 블로그
[웹 보안] 취약한 웹 페이지 작성 본문
🐢 안녕하세요, 카메입니다.
오늘은 저번에 만들었던 공격의 대상이 될 데이터베이스가 쓰일 취약한 웹 페이지를 간단하게, 아주 간단하게! 만들어보려고 합니다.
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



'Study > Web Security' 카테고리의 다른 글
| [웹 보안] 방어 기법 적용 (0) | 2026.05.26 |
|---|---|
| [웹 보안] 공격 실험 (0) | 2026.05.26 |
| [웹 보안] 데이터베이스 준비 (0) | 2026.05.26 |
| [웹 보안] 환경 구축 (VMware + Ubuntu + LAMP) (0) | 2026.05.26 |
| [웹 보안] 초기 도입부 (0) | 2026.05.24 |