시큐어 코딩(1)

Mkim4·2024년 5월 28일

애플리케이션 보안테스팅

SAST(Static Application Security Testing)

  • 소프트웨어 보안약점 점검

SCA(Software composition analysis)

  • 오픈소스 라이브러리 취약점 점검

DAST(Dynamic Application Security Testing)

  • 웹 취약점 점검

SAST에 해당하는 소프트웨어 보안약점 49개를 살펴보니 크게 다음과 같은 유형이 있었다.

1) 입력데이터 검증 및 표현
사용자, 프로그램 입력 데이터에 대한 유효성 검증체계를 갖추고, 실패 시 처리할 수 있도록 설계(SQL Injection, XSS, 다운로드 업로드 파일 검증 등)

2) 보안기능
인증,접근통제,권한관리,비밀번호 등의 정책이 적절하게 반영될 수 있도록 설계(중요정보 저장 및 전송 등)

3) 시간 및 상태
자원을 사용하는 시점과 검사하는 시점이 달라서 자원의 상태변동으로 야기되는 보안 취약점(무한반복 재귀함수)

4) 에러 처리
에러 또는 오류상황을 처리하지 않거나 불충분하게 처리되어 중요정보 유출 등 보안약점이 발생하지 않도록 설계(예외처리 등)

5) 코드오류
복잡한 소스, 가독성 저하, 코드 오류가 발생되지 않도록 설계(역직렬화)

6) 캡슐화
중요 데이터에 대한 비인가자 접근이 허용되지 않도록 설계(디버그코드)

7) API 도용
비정상적인 API를 사용하지 않도록 설계(취약한 API)

회원가입

설계항목: DBMS 조회 및 결과 검증
중점 점검항목

  • 중복 아이디 검색을 위한 사용자 ID에 쿼리를 조작할 수 있는 입력값으로 SQL 삽입 공격이 시도될 수 있으므로 입력값 검증이 필요함
  • 우편번호 검색을 위한 입력값을 조작하여 SQL 삽입 공격이 시도될 수 있으므로 입력값 검증이 필요함

설계항목: 웹 서비스 요청 및 결과 검증
중점 점검항목

  • 회원가입을 위한 입력정보에 악의적인 스크립트가 포함될 수 있으므로 입력값 검증이 필요함

소프트웨어 보안약점 & 웹 취약점이 있는데
보안약점은 잠재적인 문제를 의미하고
취약점은 악용될 수 있는 구체적인 결함이나 문제를 의미한다.

언어별 취약한 컴포넌트

자바는 pom.xml로 라이브러리를 관리하고 있다. 컴포넌트 때문에 취약점이 노출될 수도 있다.

SQL Injection

$strLoginSQL = "Select * from member where
id = `$strUserID' and password = '$strUserPass'".
$strLoginSQL = "Select * from member where
id = `admin' and password = '1 or '1=1'".

기존 SQL 코드에 $id = admin $password = 1or 1 = 1

WEBGoat에서 테스트 해볼 수 있음

$ 를 써야하는지, #을 써야하는지?

MyBatis Data Map은 외부에서 입력되는 값이 SQL 질의문을 연결하는 문자열로 사용되는 경우에 의도하지 않은 정보가 노출될 수 있는 공격 형태이다.
$ 기호를 사용하는 경우 외부에서 입력된 keyword 값을 문자열에 결합한 형태로 쿼리에 반영되므로 안전하지 않다.

select * from tbl_board where title like '%${keyword}%' order by pos asc

외부 입력값을 MyBatis 쿼리맵에 바인딩할 경우 $ 기호가 아닌 # 기호를 사용해야한다. $ 기호를 사용하는 경우 입력값을 문자열에 결합하는 형태로 쿼리에 반영하므로 쿼리문이 조작될 수 있다.

select * from tbl_board where title like '%'||#{keyword}||'%' order by pos asc
profile
귀요미 개발자

0개의 댓글