해당 게시물은 [자바 기반의 시큐어 코딩] 교육 내용을 기반으로 학습 및 기록 목적으로 제작되었습니다.
[목차를 클릭하면 해당 위치로 바로 이동] 소프트웨어 개발 보안 방법론 시큐어 코딩기법(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)
웹사이트와 브라우저 사이(또는 두 서버 사이)에 전송되는 데이터를 암호화하여 인터넷 연결을 보호하기 위한 표준 기술
예상 공격으로는 키 유출, 복호화된 저장 정보 가로채기, 전송 정보 가로채기, 중간자 공격 등이 있다.
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/022.gif)
파일 업로드/다운로드 기능이 적절히 제어되지 않을 경우
악성 코드나 쉘 프로그램이 서버에 업로드 되어 실행될 수 있다.
대책
- 업로드 되어 저장되는 파일의 타입, 크기, 개수, 실행 권한을 제한해야 한다.
- 업로드 되어 저장되는 파일은 외부에서 식별되지 않아야 한다.
- 파일 다운로드 요청 시, 요청파일명에 대한 검증 작업을 수행해야 한다.
- 다운로드 받은 소스코드나 실행 파일은 무결성 검사를 실행해야 한다.
암호화 알고리즘
정보통신망법과 개인정보 보호법에 따르면 중요 정보는 암호화하여 저장해야 한다.
암호화 정책 | |||
암호화해야 하는 개인정보 | 정보통신방법 | 개인정보보호법 | 적용 암호기술 |
비밀번호 | 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
'교육' 카테고리의 다른 글
VMWare에 오라클을 설치해보자 (Oracle 환경설정) (0) | 2023.04.28 |
---|---|
SQL 심화교육 기본 용어 (SUN OS / Oracle 11g R2 EE / 가상머신(Virtual Machine) / IP (Internet Protocol) / 게이트웨이 (Gateway)) (0) | 2023.04.26 |
chatGPT 잘 쓰는 법 (0) | 2023.04.14 |
[NexacroN] 넥사크로N 유의사항 정리 (0) | 2023.04.11 |
[NexacroN] 넥사크로 화면 구성 (프로젝트 생성과 컴포넌트 사용) (0) | 2023.04.10 |