[모의해킹 실습] 불충분한 인증 페이지 구현 및 공격 실습

불충분한 인증

불충분한 인가 취약점은 중요 정보를 다루는 페이지에 대한 인증 절차가 미흡할 경우 발생하는 취약점입니다. 인증 기능(로그인, 중요 페이지에 대한 추가 인증) 구형하였으나 추측 가능한 패스워드, 취약한 인증 프로세스로 구현되어 우회하거나 무력화하여 접근할 있습니다.

1. 공격 실습

No.

실습 위치

비고

1

http://localhost/profile_update

회원정보 수정 기능

 2. php 코드

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>HOME</title>
        <link rel="stylesheet" href="/css/loginstyle.css">
        <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.1/css/all.css">
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous">
        <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js" integrity="sha384-B4gt1jrGC7Jh4AgTPSdUtOBvfO8shuf57BaghqFfPlYxofvL8/KUEfYiJOMMV+rV" crossorigin="anonymous"></script>
        <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
        <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js" integrity="sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN" crossorigin="anonymous"></script>
        <link rel="stylesheet" href="/css/gallery.css">
    </head>
    <body class="loggedin">
    <!-- Nav Bar -->
        <nav class="navtop">
            <div>
                <h1>My Website</h1>
                <a href="/home"><i class="fas fa-home"></i>Home</a>
                <a href="profile.php"><i class="fas fa-user-circle"></i>Profile</a>
                <a href="/member/logout"><i class="fas fa-sign-out-alt"></i>Logout</a>
            </div>
        </nav>
        <div class="container mt-3">
            <div class="row">
                <div class="col-sm-12 col-md-3 col-lg-2 p-2">
                <!-- Sidebar  -->
          <nav id="sidebar" class="border-top border-secondary">
            <div class="list-group">
              <a class="rounded-0 list-group-item list-group-item-action list-group-item-light " href="/freeboard/index">자유게시판</a>
              <a class="rounded-0 list-group-item list-group-item-action list-group-item-light " href="/login/report">버그및건의</a>
            </div>
                    </nav>
                </div>
                <div class="col-sm-12 col-md-9 col-lg-10 p-2">
                    <div class="content">

<h2>내 정보</h2>
<div class="col-11">
    <div class="card">
        <div class="card-body">

    <div class="find">
        <form method="post" action="profile_update_ok.php">
            <?php
                $sql1 = mq("select * from member where id ='{$_SESSION['username']}'");
    while($member = $sql1->fetch_array()){
            ?>
        <fieldset>
            <legend>Profile</legend>
                <table>
                    <tr>
                        <td>아이디</td>
                        <td><input type="text" size="35" name="username" value="<?php echo $_SESSION['username']; ?> (아이디는 변경불가)" disabled></td>
                    </tr>
                    <tr>
                        <td>패스워드</td>
                        <td><input type="password" size="35" name="password"?></td>
                    </tr>

                    <tr>
                        <td>이름</td>
                        <td><input type="text" size="35" name="name" placeholder="이름" value="<?php echo $member['name']; ?>"></td>  
                    </tr>
                    <tr>
                        <td>주소</td>
                        <td><input type="text" size="35" name="address" placeholder="주소" value="<?php echo $member['address']; ?>"> </td>" 
                    </tr>
                    <tr>
                        <td>성별</td>
                        <td>남<input type="radio" name="sex" value="남"> 여<input type="radio" name="sex" value="여"></td>
                    </tr>
                    <tr>
                        <td>이메일</td>
                        <td><input type="text" size="35" name="email" placeholder="이메일" value=<?php $str= explode("@", $member['email']); $str = $str[0]; echo $str; ?>>@<select name="emaddress"><option value="naver.com">naver.com</option><option value="nate.com">nate.com</option><option value="hanmail.com">hanmail.com</option><option value="daum.net">daum.net</option><option value="gmail.com">gmail.com</option></select></td>  
                    </tr>
                </table>
                <button type="button" class="btn btn-primary" onclick="location.href='profile'">뒤로가기</buton>
                <button type="submit" class="btn btn-success" onclick="location.href='profile_update'">수정하기</buton>



            </fieldset>
        <?php } ?>
        </form>
    </div>  

 

Step1: 로그인 Profile 클릭해 회원 정보 수정 페이지에 접속합니다.

회원 정보 수정 페이지

Step2:회원 정보 수정 페이지에 2 인증이 구현되어 있지 않습니다.

기존 패스워드 입력 및 2 차 비밀번호 미구현

 

페이지는 사용자의 정보를 세션으로 관리하기 때문에 파라미터 변조를 통해 정보 수정 페이지에 접근할 수는 없으나 XSS공격을 통해 세션이 탈취되었을 사용자의 정보 수정이 가능함을 2.2.2에서 검증하였습니다. 그리고 CSRF 공격을 통해 사용자의 정보가 가능함을 이전 포스트에서 검증하였습니다. 따라서 사용자 수정과 같은 민감 정보를 다루는 페이지에 접근 2 인증을 구현하고 안전한 패스워드를 사용하도록 해야 합니다.

반응형