1. 식별, 인증 동시

- 식별 인증 동시란 SQL문에서 식별과 인증을 동시에 하는것을 말한다

- select * from login where id=$user_id and pw=$user_pw;

- 위 문구처럼 id와 pw를 동시에 처리하여 로그인 하는 방식이다

 

1) 공격 방법

- ID: john' or '1'='1#      pw: 아무거나

- 위 문구를 입력하게 되면 SQL문에서 다음과같이 처리된다

- select * from login where id=john' or '1'='1# and pw~~~

-  #뒤부터는 주석처리가 되어 문구가 실행되지 않는다

- 따라서 #앞에 'john' or '1'='1' 부분만 참이되면 되는데 1=1 부분이 참이므로 or연산에 따라 로그인 우회가 가능해진다

실제 화면

 

2. 식별, 인증 분리

- 식별 인증 분리란 SQL문에서 식별과 인증을 따로 처리하는 방식을 말한다

- 식별,인증 분리에서는 sql구문이 아닌 if($res[‘pw’]== $user_pw)문이 참이 되어야 로그인이 가능하다.

- select pw from login where id=$user_id;

if($res['pw']==$user_pw){

- 위 문구처럼 id를 입력받아 pw를 DB에서 가져오고 입력한pw와 DB의 pw가 일치하면 로그인이 되는 방식이다

 

1) 공격 방법

- ID: x' union select '1234    pw: 1234

- SELECT * FROM login WHERE id=’x’ union select ‘1234’

- 위 문구를 입력하면 SQL문에서 (~~WHERE id=‘x’)로 실제문구가 닫히게 된다.

- 그 뒤에 union select문이 실행되면서 DB에서 가져온 pw값과 password로 입력한 1234가 일치하는 계정이 있으면 if문이 참이 되어 그 계정으로 로그인을 우회 할 수 있게 된다.

실제화면

 

3. 식별, 인증 동시(해시)

- 식별 인증 동시(해시)란 위에서 봤던 식별 인증 동시와 다를게 없다

- 하지만 비밀번호가 해시 처리되어 비밀번호 유출시에도 그대로 유출 되지 않고 해시값이 유출된다는 점이 다르다

- select * from login where id=$user_id and pw=md5($user_pw);

 

1) 공격 방법

- 공격방법은 식별 인증 동시와 동일하게 하면 로그인 우회가 가능하다

실제 화면

 

4. 식별, 인증 분리(해시)

- 식별 인증 분리(해시)란 역시 식별 인증 분리 방식과 같은 구조이다

- 비밀번호만 해시처리 되어있다는 점이 다르다

 

1) 공격 방법

- 공격방법도 유사하지만 비밀번호가 해시처리되어있기 때문에 다음과 같이 입력해야 한다

- ID: x' union select md5('1234')'      pw:1234

- 위와 같이 입력해야 해시 처리된 비밀번호가 서로 대조가 가능해져 로그인 우회 할 수가 있다

실제 화면

 

5. 식별, 인증 개행

- select * from login where id=$user_id and

  pw=$user_pw

- 식별, 인증 개행이란 말 그대로 Enter를 눌러 개행하는 방식이다

- 이런 경우 주석처리가 통하지 않기 때문에 을 이용하여 구문을 맞춰줘야 한다

 

1) 공격 방법

- ID: john' or '1'='1     pw: 아무거나

- 공격 시 위와 같은 구문이 성공하는 이유는 and연산보다 or연산이 더 먼저 실행되기 때문에 and전에 or ‘1’=’1’부분이 참이 되므로 로그인 우회가 가능해진다

 

실제 화면

'Web Hacking' 카테고리의 다른 글

CSRF  (0) 2022.12.27
XSS  (0) 2022.12.16
Blind SQLi  (0) 2022.12.05
Error Based SQLi  (0) 2022.12.05
UNION Based SQLi  (0) 2022.11.21

1. 식별, 인증 동시

<?php
    $user_id = $_POST['id'];
    $user_pw = $_POST['pw'];
    $conn = mysqli_connect('localhost', 'admin', 'kisec123', 'MEMBER');
    $sql = "SELECT * FROM login where id='$user_id' and pw='$user_pw'"; //id와pw를 동시에 가져와 구문을 실행한다
    $res = mysqli_fetch_array(mysqli_query($conn,$sql));
    if($res){
        session_start();
        $_SESSION['user_id'] = $res['id'];
        $_SESSION['user_name'] = $res['name'];
        echo "<script>alert('Login Success!!');";
        echo "window.location.replace('home.php');</script>";
        exit;
    }
    else{
       echo "<script>alert('retry!!');";
       echo "window.location.replace('login2.php');</script>";
    }
?>

 

2. 식별, 인증 분리

<?php
    $user_id = $_POST['user_id'];
    $user_pw = $_POST['user_pw'];
    $conn= mysqli_connect('localhost', 'admin', 'kisec123', 'MEMBER');
    $sql = "SELECT pw FROM login where id='$user_id'";
    $res = mysqli_fetch_array(mysqli_query($conn,$sql));
    if($res['pw'] == $user_pw){
        session_start();
        $_SESSION['user_id'] = $res['id'];
        $_SESSION['user_name'] = $res['name'];
        echo "<script>alert('로그인에 성공했습니다!');";
        echo "window.location.replace('home.php');</script>";
        exit;
    }
    else{
       echo "<script>alert('아이디 혹은 비밀번호가 잘못되었습니다.');";
       echo "window.location.replace('login.php');</script>";
    }
?>

 

3. 식별, 인증 동시(해시)

<?php
    $user_id = $_POST['user_id'];
    $user_pw = $_POST['user_pw'];
    $conn = mysqli_connect('localhost', 'admin', 'kisec123', 'MEMBER');
    $sql = "SELECT * FROM login where id='$user_id' and pw=md5('$user_pw')"; // 비밀번호만 md5처리 해주면 된다(DB에 pw값도 md5로 받을 수 있게 해줘야 한다)
    $res = mysqli_fetch_array(mysqli_query($conn,$sql));
    if($res){
        session_start();
        $_SESSION['user_id'] = $res['id'];
        $_SESSION['user_name'] = $res['name'];
        echo "<script>alert('Welcome!!');";
        echo "window.location.replace('home.php');</script>";
        exit;
    }
    else{
       echo "<script>alert('invalid account!!');";
       echo "window.location.replace('login3.php');</script>";
    }
?>

 

4. 식별, 인증 분리(해시)

<?php
    $user_id = $_POST['user_id'];
    $user_pw = $_POST['user_pw'];
    $conn= mysqli_connect('localhost', 'admin', 'kisec123', 'MEMBER');
    $sql = "SELECT * FROM login where id='$user_id'";
    $res = mysqli_fetch_array(mysqli_query($conn,$sql));
    if($res['pw'] == md5($user_pw)){
        session_start();
        $_SESSION['user_id'] = $res['id'];
        $_SESSION['user_name'] = $res['name'];
        echo "<script>alert('Welcome!!');";
        echo "window.location.replace('home.php');</script>";
        exit;
    }
    else{
       echo "<script>alert('invalid account!!');";
       echo "window.location.replace('login4.php');</script>";
    }
?>

 

5. 식별, 인증 개행

<?php
    $user_id = $_POST['user_id'];
    $user_pw = $_POST['user_pw'];
    $conn = mysqli_connect('localhost', 'admin', 'kisec123', 'MEMBER');
    $sql = "SELECT * FROM login where id='$user_id' and
            pw='$user_pw'";
    $res = mysqli_fetch_array(mysqli_query($conn,$sql));
    if($res){
        session_start();
        $_SESSION['user_id'] = $res['id'];
        $_SESSION['user_name'] = $res['name'];
        echo "<script>alert('Welcome!!');";
        echo "window.location.replace('home.php');</script>";
        exit;
    }
    else{
       echo "<script>alert('incorrect id or password');";
       echo "window.location.replace('login5.php');</script>";
    }
?>

 

'Web Development' 카테고리의 다른 글

회원가입 / ID 중복확인  (0) 2022.11.04
로그인/로그아웃  (0) 2022.10.20

1. login.php

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@400;500;700&display=swap" rel="stylesheet">
    <script src="https://kit.fontawesome.com/53a8c415f1.js" crossorigin="anonymous"></script>
    <link rel="stylesheet" href="./css/login.css">
</head>
<body>
        <form method="post" action="/login_check.php">
    <div class="wrap">
        <div class="login">
            <h2>Log-in</h2>
            <div class="login_sns">
            <li><a href=""><i class="fab fa-instagram"></i></a></li>
            <li><a href=""><i class="fab fa-facebook-f"></i></a></li>
            <li><a href=""><i class="fab fa-twitter"></i></a></li>
            </div>
            <div class="id">
                <h4>ID</h4>
                <input type="text" name="id" id="" placeholder="id">
            </div>
            <div class="pw">
                <h4>Password</h4>
                <input type="password" name="pw" id="" placeholder="Password">
            </div>
            <div class="login_etc">
                <div class="checkbox">
                <input type="checkbox" name="" id=""> Remember Me?
                </div>
                <div class="Signup">
                <a href="">Signup</a>
            </div>
            </div>
            <div class="button">
                    <button type="submit" value="submit">login</button>
            </div>
            </form>
        </div>
    </div>
</body>
</html>


2. login.css

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
  font-family: "Noto Sans KR", sans-serif;
}
a {
  text-decoration: none;
  color: black;
}

li {
  list-style: none;
}

.wrap {
  width: 100%;
  height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgba(0, 0, 0, 0.1);
}

.login {
  width: 30%;
  height: 600px;
  background: white;
  border-radius: 20px;
  display: flex;
  justify-content: center;
  align-items: center;
  flex-direction: column;
}

h2 {
  color: tomato;
  font-size: 2em;
}
.login_sns {
  padding: 20px;
  display: flex;
}

.login_sns li {
  padding: 0px 15px;
}

.login_sns a {
  width: 50px;
  height: 50px;
  display: flex;
  align-items: center;

justify-content: center;
  padding: 10px;
  border-radius: 50px;
  background: white;
  font-size: 20px;
  box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.4), -3px -3px 5px rgba(0, 0, 0, 0.1);
}

.id {
  margin-top: 20px;
  width: 80%;
}

.id input {
  width: 100%;
  height: 50px;
  border-radius: 30px;
  margin-top: 10px;
  padding: 0px 20px;
  border: 1px solid lightgray;
  outline: none;
}

.pw {
  margin-top: 20px;
  width: 80%;
}

.pw input {
  width: 100%;
  height: 50px;
  border-radius: 30px;
  margin-top: 10px;
  padding: 0px 20px;
  border: 1px solid lightgray;
  outline: none;
}

.login_etc {
  padding: 10px;
  width: 80%;
  font-size: 14px;
  display: flex;
  justify-content: space-between;
  align-items: center;
  font-weight: bold;
}

.button {
  margin-top: 50px;
  width: 80%;
}
.button button {
  width: 100%;
  height: 50px;
  border: 0;
  outline: none;
  border-radius: 40px;
  background: linear-gradient(to left, rgb(255, 77, 46), rgb(255, 155, 47));
  color: white;
  font-size: 1.2em;
  letter-spacing: 2px;
}


3. home.php(메인페이지)

<html>
<head>
<title>Home Page</title>
<link rel="stylesheet" href="/css/home.css">
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
  <div class="container-fluid">
    <a class="navbar-brand" href="#">Home</a>
    <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarColor01" aria-controls="navbarColor01" aria-expanded="false" aria-label="Toggle navigation">
      <span class="navbar-toggler-icon"></span>
    </button>
    <div class="collapse navbar-collapse" id="navbarColor01">
      <ul class="navbar-nav me-auto">
        <li class="nav-item">
          <a class="nav-link active" href="#">My Page
            <span class="visually-hidden">(current)</span>
          </a>
        </li>
        <li class="nav-item">
          <a class="nav-link" href="#">Board</a>
        </li>
        <li class="nav-item">
          <a class="nav-link" href="#">FAQ</a>
        </li>
        <li class="nav-item">
          <a class="nav-link" href="#">About</a>
        </li>
        <button type="button" class="btn btn-primary btn-sm" onClick="location.href='logout.php'">Log Out</button>
      </ul>
      <form class="d-flex">
        <input class="form-control me-sm-2" type="text" placeholder="Search">
        <button class="btn btn-secondary my-2 my-sm-0" type="submit">Search</button>
      </form>
    </div>
  </div>
</nav>
<h1 align="center">Welcome !!</h1>
</body>
</html>


4.home.css

css는 https://bootswatch.com/ 사이트에서 원하는 템플릿을 다운받아 사용하면 쉽게 디자인 할 수 있다


5. logout.php

<?php
session_start();
session_destroy();
?>
<script>
alert("Log Out!!");
location.replace('index.php');
</script>


6. login_check.php

login.php에서 데이터를 받아 DB를 대조해 로그인이 이루어질수 있도록 해주는 코드이다

 

<?php
session_start();
$id=$_POST['id'];
$pw=$_POST['pw'];
$mysqli=mysqli_connect("localhost", "계정명", "비밀번호", "DB명");

$check="SELECT * FROM login WHERE id='$id'";
$result=$mysqli->query($check);
if($result->num_rows==1){
        $row=$result->fetch_array(MYSQLI_ASSOC);
        if($row['pw']==$pw){
                $_SESSION['id']=$id;
                if(isset($_SESSION['id']))
                {
                        echo "<script>alert('Login Success!!');</script>";
                        echo "<script>location.href='home.php';</script>";
                }
                else{
                        echo "Session Save Failed";
                }
        }
        else{
                echo "<script> alert ('Wrong id or Password'); history.back(); </script>";
        }
}
else{
        echo "Wrong id or pw";
}
?>


7. DB 생성

localhost/phpmyadmin으로 접속해 DB를 생성한다

CREATE DATABASE MEMBER;//DB 생성

 

CREATE TABLE login (

id varchar(20), primary key,

pw varchar(20));// 테이블 생성

 

INSERT INTO login VALUES('john', '1234');//데이터 생성


8. 실제 화면

1) login.php

본인은 로그인 페이지를 인덱스(index.php)로 바꿔서 저장했다

 

로그인 성공 시 성공했다는 알림이 나타난 뒤 다음 메인 페이지로 넘어간다

 

메인페이지 모습

 

id 또는 비밀번호가 틀릴경우 위와같은 알림이뜨면서 다시 로그인 페이지로 돌아간다

 

네비게이션바에 로그아웃 버튼을 클릭하면 로그아웃이라는 알림과함께 로그인페이지로 돌아간다

 

 

'Web Development' 카테고리의 다른 글

회원가입 / ID 중복확인  (0) 2022.11.04
로그인 case  (0) 2022.10.24

1. LAN Attack

LAN 범위 내에서 수행될 수 있는 공격에 한정하여 OSI 7 Layer 중 2 계층에서 이루어지는 공격

 

1) 주요 공격

 

- ARP를 이용한 MITM(Man In The Middle) 공격

: 통신하는 두 단말 사이에 중간자가 침입하여 양단의 통신을 도청하거나 조작

 

- STP(Spanning Tree Protocol) 공격

: STP를 이용하여 스위치의 연결 흐름을 제어하여 악의적인 목적의 스위치로의 연결을 전환 가능

 

- MAC Spoofing 공격

: 연결되어 있는 MAC주소를 변조하는 공격

 

- CAM(Control Addressable Memory) 테이블 오버플로우

: 저장된 테이블 수가 다량이면 정상적인 연결이 새로 들어올 경우 이미 잡혀있는 메모리의 한계가 존재하기 때문에 정상 연결이 불가하도록 하는 DOS유형의 공격

 

-DHCP Starvation 공격

: DHCP 서버에 DOS 공격을 수행하여 새로운 클라이언트가 IP를 자동으로 할당받지 않도록 하는 공격

 

2. ARP Spoofing 공격

1) ARP Spoofing

- LAN 환경에서 중간자 공격에 사용 되는 기술

 

2)  ARP Spoofing 실습

1. 환경구성 

공격자: kali linux(10.200.57.15), 피해 서버:centOS7(10.200.57.18), 피해 클라이언트: centOS6(10.200.57.17)

 

공격자가 위 명령어로 피해서버와 클라이언트에 ARP Spoofing 공격으로 MAC 주소를 변경한다

네트워크 연결을 위한 포워딩을 해준다

 

피해 클라이언트PC에선 ARP Spoofing 공격으로 인해 피해 서버와 공격자의 MAC 주소가 동일하게 보인다 

피해 서버에서도 ARP Spoofing 공격으로 인해 피해 클라이언트와 공격자의 MAC주소가 동일하게 보인다 

 

피해 클라이언트가 피해서버로 4000 포트를 통해 netcat 통신을 한다

피해서버에서도 4000 포트를 열고 netcat통신을 받아들인 후 test라는 문구를 입력하여 피해 클라이언트로 보낸다

 

공격자가 wireshark를 열어 4000포트로 통신한 패킷을 검색하여 아무거나 선택 후 마우스 오른쪽 버튼-> Follow->tcp stream을 클릭하면 오른쪽과 같이 피해 클라이언트와 피해 서버가 통신한 내용을 훔쳐볼 수 있다

'Network Security' 카테고리의 다른 글

Network Scanning Attack  (0) 2022.10.18

1. 네트워크 스캐닝 절차

활동범위 결정 - 네트워크 목록 수집 - DNS 질의 - 네트워크 정찰

1) 활동범위 결정

어느 범위까지 스캔을 수행할지 결정한다

 

2) 네트워크 목록 수집

kali linux의 nmap으로 네트워크 목록을 스캔한다

 

3) DNS 질의

1. nslookup 명령으로 네임서버를 통해 해당 도메인의 IP를 찾아준다

ex) nslookup 도메인명

 

2. dig: nslookup에 대비 유연성 및 편의성, 출력의 명료성을 가진 DNS 쿼리 도구

ex) dig 도메인명

 

3. dnshistory.org 사이트에서 도메인 레코드 정보가 조회 가능하다

 

4) 네트워크 정찰

tracert 명령어로 해당IP주소 경로 추적

tracert(Window)

traceroute(Linux)

 

2. 네트워크 스캐닝 종류

- Ping & ICMP 스캔

 

- 오픈 스캔(Open Scan)

: TCP 3-Way-Handshake를 이용해 정상적인 연결을 바탕으로 Open 된 포트 정보를 추출

 

- 하프-오픈 스캔(Half-Open Scan)

: TCP 3-Way-Handshake 방식의 연결을 비정상적으로 종료 하는 방식

 

- 스텔스 스캔(Stealth Scan)

: 세션을 완전히 성립하지 않고 공격대상 시스템의 포트 활성화 여부를 알아내는 스캔

  1) X-MAS 스캔

  2) ACK or FIn 스캔

  3) NULL 스캔

 

- UDP스캔

 

3. 네트워크 스캐닝 실습

1) 활성화된 host 검색

스캔한 네트워크 대역중 2, 17, 18이 열려있다

 

2) TOP5 포트 스캐닝

일반적으로 제일 많이 사용하는 포트 5개를 ClientPC에다 스캔하니 위와 같은 결과가 나왔다

 

3) Ping & ICMP 스캔

- 리눅스와 윈도우의 ttl값이 다르므로 아래와 같이 ping을 보내 OS를 추측할 수 있다 하지만 ttl값을 변경했을 수도 있기 때문에 100% 확신할수는 없다

리눅스로 ping을 보낼 시 ttl=64

윈도우로 ping을 보낼 시 ttl=128

 

4. 네트워크 스캐닝 대응 방안

 

- 네트워크 장비에 의한 필터링

 

- 서버에서 실행중인 불필요한 서비스 중지

 

- IDS 및 IPS 연동

'Network Security' 카테고리의 다른 글

LAN Attack  (0) 2022.10.18

+ Recent posts