교육

Java 기반의 시큐어 코딩 교육 (SQL Injection / 암호화 알고리즘 / 크로스 사이트 스크립팅(Cross Site Scripting) XSS)

ByeongJun 2023. 4. 25. 15:34
반응형

해당 게시물은 [자바 기반의 시큐어 코딩] 교육 내용을 기반으로 학습 및 기록 목적으로 제작되었습니다. 

 

 

 

[목차를 클릭하면 해당 위치로 바로 이동]          소프트웨어 개발 보안 방법론          시큐어 코딩기법(SQL Injection)          XSS


정보보안 

신원증명과 인증 / 암호화 / 권한 부여 / 무결성 / 부인 방지

 

웹 애플리케이션

Web 기반 시스템을 CS와 다르게 인터넷 상으로 접근 가능한 위치에 존재하게 되어 항상 위험에 노출

(Web 기반 시스템의 보안 필요성 강조)

 

OWASP (Open Web Application Security Project)

오픈소스 웹 애플리케이션 보안 프로젝트

 

OWASP - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. OWASP(The Open Web Application Security Project)는 오픈소스 웹 애플리케이션 보안 프로젝트이다. 주로 웹에 관한 정보노출, 악성 파일 및 스크립트, 보안 취약점 등을 연

ko.wikipedia.org

 

CWE (Common Weakness Enumeration)

하드웨어 및 소프트웨어 약점과 취약점에 대한 범주 시스템

 

장점

  • 소프트웨어 아키텍처, 디자인, 코드에 내재 된 결함에 대해 일반적인 검토를 할 수 있게 된다.
  • 결함 검사 도구 등 소프트웨어의 보안을 향상시키기 위한 도구의 표준 척도로 사용할 수 있다.
  • 결함의 원인을 인식하고 결함을 감소시키며, 재발의 방지를 위한 공통의 기준으로서 활용할 수  있다.

 

 

CWE - Common Weakness Enumeration

CWE™ is a community-developed list of software and hardware weakness types. It serves as a common language, a measuring stick for security tools, and as a baseline for weakness identification, mitigation, and prevention efforts. Viewing Customized CWE in

cwe.mitre.org


소프트웨어 개발 보안 방법론

보안을 고려한 개발 방법론

잠재적인 보안 취약점을 제거하고 정보보호를 설계/구현 할 수 있는 소프트웨어 개발 과정을 얻고자 하는 방법론

 

CLASP

소프트웨어 개발 생명주기 (SDLC) 초기 단계에서 보안강화를 목적으로 하는 정형화된 방법론 

 

HTTP

일반적인 웹 애플리케이션은 정적/동적 컨텐츠를 요청하고 제공하는 메커니즘 적용

 

Tiers

자바 웹 애플리케이션은 개발 생산성과 유지 보수성 등의 소프트웨어 품질을 높이기 위해

Tier(Layer)로 구분하여 개발하는 경향이 강한 편

 

쿠키 동작 방식 

  • 쿠키는 이름/값 (name/value) 쌍으로 브라우저에 저장된다.
  • 서버 측에서는 웹 애플리케이션이 쿠키를 생성하고 브라우저로 전달하며 3년까지 유지될 수 있다.
  • 클라이언트 측에서는 브라우저가 쿠키를 저장하고 웹 페이지에 접근할 때마다 쿠키를 서버로 전달한다. 
  • 브라우저에서 쿠키 사용을 금지 시킬 수 있기 때문에 모든 사용자의 쿠키가 사용 가능하다곤 전제할 수 없다.
  • 쿠키는 하나 이상의 서브도메인명과 연관 된다. 
// 쿠키를 생성하고 값을 지정하는 코드
Cookie userIdCookie = new Cookie("userIdCookie", userId);
userIdCookie.setMaxAge(60*60*24*365*2);
userIdCookie.setPath("/");
response.addCookie(userIdCookie);

// 쿠키로부터 값을 얻는 코드
Cookie[] cookies = request.getCookies();
String cookieName = "userIdCookie";
String cookieValue = "";
for (Int i=0; i<cookies.length; i++) {
	Cookie cookie = cookies[i];
    if (cookieName.equals(cookie.getName()))
    	cookieValue = cookie.getValue();
}

 

 

 

행정 안전부 한국인터넷진흥원(KISA)에서 발표한 소프트웨어 개발 보안 가이드에 따르면 

구현 단계의 시큐어 코딩을 7개의 유형으로 분류할 수 있다고 한다.

  유형 설명
1 입력데이터 검증 및 표현 프로그램 입력값에 대한 검증 누락 혹은 부적절한 검증, 데이터의 잘못된 형식 지정으로 발생할 수 있는 보안 약점
2 보안 기능 보안기능(인증,접근제어,기밀성,암호화,권한 관리 등) 부적절히 구현할 경우 발생할 수 있는 보안 약점
3 시간 및 상태 동시 또는 거의 동시 수행을 지원하는 병렬 시스템, 하나 이상의 프로세스가 동작하는 환경에서 시간 및 상태를 부적절하게 관리하여 발생할 수 있는 보안 약점
4 에러 처리 에러 처리하지 않거나, 불충분하게 처리하여 에러 정보에 중요 정보가 포함될 때 발생할 수 있는 보안 약점
5 코드 오류 타입 변환 오류, 자원(메모리 등) 부적절한 반환 등과 같이 개발자가 범할 수 있는 코딩 오류로 인해 유발되는 보안 약점
6 캡슐화 중요한 데이터 또는 기능성을 불충분하게 캡슐화 했을 때 인가되지 않는 사용자에게 데이터 누출이 가능해지는 보안 약점
7 API 오용 의도된 사용에 반하는 방법으로 API를 사용하거나 보안에 취약한 API를 사용하여 발생할 수 있는 보안 약점

시큐어 코딩 기법

SQL Injection

사용자가 입력한 데이터를 검증하지 않은 채로 쿼리문의 일부로 활용할 때 발생할 수 있는 취약점

  • 데이터가 무단으로 조회되거나 인증 과정이 부적절하게 수행되는 등의 문제점이 발생할 수 있다. 
  • 비인증 로그인 / 운영체제 명령어 수정 / 데이터베이스 정보 불법 열람·추가·삭제·수정 문제 발생 우려
  • 애플리케이션 실행 관련된 사용자에게 최소한의 권한만 부여
  • SQL문이 외부 입력 값과 관련될 때 동적으로 생성되는 메커니즘에 문제가 없는지를 점검
  • 외부 입력값으로 쿼리문이 생성될 때 입력 값을 검증한 후 생성되도록 한다. 

 

SQL Injection에 대한 자바 코드 내부 대책

  • Filter로 검증한다.
  • Interceptor로 필터링 한다.
  • 라이브러리나 Validator로 검증한다.

 


Mybatis 쿼리문에서 ${ }을 사용할 경우

매개변수 값을 문자열 연결 방식으로 치환하므로 
쿼리문의 구조가 변경될 가능성이 있다.


Mybatis 쿼리문에서 #{ }을 사용할 경우 

JDBC Statement를 사용하게 되므로
쿼리문의 구조가 변경되지 않는다.


쿼리문 자체가 sql injection을 당하지 않을 수 있기 때문에 $ 보다는 # 사용 권장

 

공격 방법

  • HTML Form SQL 삽입 공격
  • Error Message 분석
  • Union All SQL 구문 삽입 공격
  • Stored Procedure로 삽입 공격
  • Blind SQL 삽입 공격 

 

보안 기능

클라이언트에서 중요 기능이나 리소스를 요청하는 경우  

인증이 되어 있는지를 먼저 확인하지 않고 요청을 처리하면 중요 정보나 리소스가 노출될 수 있다. 

 

웹 애플리케이션에서 사용되는 데이터들은 데이터베이스에 저장되어 관리되며,
웹 브라우저를 통해 사용자에게 출력된다. 

 

중요 정보 (주민번호,패스워드, 카드번호 등)가 적절히 관리되지 못하면 
개인정보 유출과 같은 침해 사고가 발생한다. 

 

중요한 개인정보는 암호화 알고리즘을 통해 암호화된 데이터로 관리되어야 하며, 

데이터 전송시에도 SSL*과 같은 안전한 통신 채널을 사용해야 한다. 

 

*SSL 보안 소켓 계층(Secure Sockets Layer)

웹사이트와 브라우저 사이(또는 두 서버 사이)에 전송되는 데이터를 암호화하여 인터넷 연결을 보호하기 위한 표준 기술

 

예상 공격으로는 키 유출, 복호화된 저장 정보 가로채기, 전송 정보 가로채기, 중간자 공격 등이 있다. 

 

 

 

파일 업로드/다운로드 기능이 적절히 제어되지 않을 경우

악성 코드나 쉘 프로그램이 서버에 업로드 되어 실행될 수 있다. 

 

대책

  • 업로드 되어 저장되는 파일의 타입, 크기, 개수, 실행 권한을 제한해야 한다.
  • 업로드 되어 저장되는 파일은 외부에서 식별되지 않아야 한다.
  • 파일 다운로드 요청 시, 요청파일명에 대한 검증 작업을 수행해야 한다.
  • 다운로드 받은 소스코드나 실행 파일은 무결성 검사를 실행해야 한다. 

 

 

 

암호화 알고리즘

정보통신망법과 개인정보 보호법에 따르면 중요 정보는 암호화하여 저장해야 한다. 

암호화 정책
암호화해야 하는 개인정보 정보통신방법 개인정보보호법 적용 암호기술
비밀번호 O O 해시 함수
바이오 정보 O O 블록 암호
주민등록번호 O O
신용카드번호 O -
계좌번호 O -
여권번호 - O
운전면허번호 - O
외국인등록번호 - O

 

대칭키 암호화 

  • 암호화/복호화*에 동일한 키를 사용하는 방식이다. 
     복호화 : 암호화(encryption, 인크립션)의 반대말
                   암호화된 데이터를 암호화되기 전의 형태로 바꾸는 처리를 말한다.
  • 처리속도가 빠르고 일반적인 기밀성을 보장하는 용도로 사용된다. 
  • 정보 교환 당사자 간의 키를 공유해야 하므로 키 유지 관리에 어려움이 있다.
  • SEED, ARIA, AES 등의 알고리즘이 있다. 

 

 


크로스 사이트 스크립팅 

외부 입력 값을 충분히 검증하지 않고 응답의 일부로 사용할 때 발생할 수 있는  취약점 

공격자는 미리 작성해둔 요청을 CSRF에 취약한 사이트의 게시물로 등록해두거나 링크로 서버에 전송

 

크로스 사이트 요청 위조에 대한 대책 

  • CSRF 토큰 사용
    해당 요청이 사용자의 정상적인 요청인지를 구분하기 위해 세션별로 CSRF 토큰을 생성해 세션에 저장
  • 사용자와 상호 처리 기능 작용
  • 재인증 요구
  • 스크립트 문자를 반환하여 저장

 

 

 

 

 

더보기

 

 

MD5 Hash Generator

A tool for creating an MD5 hash from a string. Use this fast, free tool to create an MD5 hash from a string.

www.md5hashgenerator.com

 

CrackStation - Online Password Hash Cracking - MD5, SHA1, Linux, Rainbow Tables, etc.

Free Password Hash Cracker Enter up to 20 non-salted hashes, one per line: Supports: LM, NTLM, md2, md4, md5, md5(md5_hex), md5-half, sha1, sha224, sha256, sha384, sha512, ripeMD160, whirlpool, MySQL 4.1+ (sha1(sha1_bin)), QubesV3.1BackupDefaults How Crack

crackstation.net

 

Get MD5 String from Message Digest

I understand how it works but if I want to print out the MD5 as String how would I do that? public static void getMD5(String fileName) throws Exception{ InputStream input = new FileInputStream(

stackoverflow.com

public static void getMD5(String fileName) throws Exception{
    InputStream input =  new FileInputStream(fileName);
    byte[] buffer = new byte[1024];

    MessageDigest hash = MessageDigest.getInstance("MD5");
    int read;
    do {
        read = input.read(buffer);
        if (read > 0) {
            hash.update(buffer, 0, read);
        }
    } while (read != -1);
    input.close();
}

https://www.baeldung.com/java-deep-copy

 

 

 

 

Find Security Bugs

Sonar Qube with FindBugs plugin (version 3.2+).

find-sec-bugs.github.io

 

What to do about Eclipse's "No repository found containing: ..." error messages?

I'm running Eclipse's Helios EE bundle on Linux to which I added the subversive plugins, the m2e Maven integration and the Mylin connector for Trac. For the last couple of weeks I've been trying to

stackoverflow.com

 

 

반응형