Hacking_study/해킹과제

워게임 만들기! (Lv1. 브루트포스)

jin_li 2023. 4. 16. 23:05
코드 소스

 

1. index.php

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>브루트포스</title>
    <style>
        button {
            display: inline-block;
            padding: 5px 10px;
            background-color: gray;
            color: white;
            font-size: 18px;
            text-decoration: none;
            border-radius: 5px;
        }
    </style>
</head>
<body>
    <h3>010-1234-5678에 전송된 PIN코드를 입력하세요</h3>
    <p>
        <form action="login.php" method="post">
        <input type="password" id="password" name="pin" placeholder="PIN 네 자리 숫자 입력">
    </p>
    <p>
        <button type="submit">Enter</button>
        </form>
    </p>
</body>
</html>
cs

 

 

2. login.php

<?php
session_start();
 
 
if ($_SERVER['REQUEST_METHOD'=== 'POST') {
    $inputPin = $_POST['pin'];
    if ($inputPin === '1004') {
        $_SESSION['loggedin'= true;
        header('Location: good.php'); 
    } else {
        echo "<script>window.alert('로그인 실패')
            history.go(-1)</script>";
    }
}
?>
 
cs

 

 

3. good.php

<?php
session_start();
 
if (!isset($_SESSION['loggedin']) || $_SESSION['loggedin'!== true) {
    header('Location: login.php');
    exit;
}
?>
 
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>브루트포스</title>
</head>
<body>
    <h1>로그인 성공</h1>
</body>
</html>
 
cs

 

세션 파기하는 기능은 뺐다ㅎ...

 

 

 

풀이

 

index.php 화면

 

 

잘못된 pin을 입력하면 아래 사진처럼 로그인 실패 알림창이 뜬다.

위의 요청을 intruder 탭으로 보낸다.

 

 

 

변수 clear하고 pin에만 설정한다.

 

 

payloads로 가서, payload type을 숫자(bruteforcer 로 하는 것보다 이게 더 빠름)로 하고

1000부터(pin이 1004인걸 아니까...ㅎ) 9999까지 1씩 증가하는 수를 입력하도록 설정했다.

 

 

1004를 보냈을 때 응답코드와 길이가 혼자 다르다. 맞는 pin이라는 뜻.

 

페이지로 돌아가서 1004를 입력하면 로그인 성공.

 

 

틀린 패스워드를 일정 횟수 이상 입력했을 때 10분동안 로그인 시도 못 하게 한다던지 로그인을 아예 차단하는 락킹을 해버리면 브루트 포스 공격은 거의 완벽하게 대응할 수 있다. 캡챠를 이용해서 대응해도 좋다.