[SW개발보안] SR1-4. 시스템 자원접근 및 명령어 수행 입력값 검증
SR1-4 시스템 자원접근(경로조작 및 자원삽입) 및 명령어 수행 입력값(운영체제 명령어 삽입)
자원삽입
외부 입력값을 검증, 제한하지 않고 자원의 식별자로 사용하는 경우
의도하지 않은 자원 참조 및 사용이 발생
→ 시스템 충돌 또는 자원 선점 등을 통해 정상적인 서비스를 방해
run.jsp
================================================
String portno = request.getParameter("port_no");
Socket s = new Socket(Integer.parseInt(portno));
[의도한 입력]
run.jsp?port_no=4323
⇒ 4323 포트를 이용한 소켓을 생성
[의도하지 않은 입력]
run.jsp?port_no=80
⇒ 웹 서버의 서비스 포트(80)로 소켓을 생성 ⇒ 의도하지 않은 자원 참조 및 사용 발생 ⇒ 시스템 장애 등을 통해 정상 서비스를 방행
[안전한 코드]
// 허용 목록
int[] allowedPortNo = { 4323, 4324 };
String portno = request.getParameter("port_no");
try {
// 허용 목록 범위 내에서 입력값이 사용
// 입력값이 처리에 직접 사용되지 않고, 허용 목록을 참조하는데 사용
Socket s = new Socket(allowedPortNo[Integer.parseInt(portno)]);
} Exception (e) {
:
// 숫자가 아닌 데이터가 전달되는 경우
// 0, 1이 아닌 데이터가 전달되는 경우
}
경로조작
참조하는 자원이 파일인 경우,
외부 입력값이 파일 자원의 식별자로 사용되는 경우
경로 조작 문자열 포함 여부를 확인하지 않고 사용하면 권한 밖에 시스템 자원(파일)에 대해 접근이 가능
[대응방안]
외부 입력값을 파일의 식별자로 사용하는 경우,
경로 조작 문자열(. .. / \ 등) 포함 여부를 확인 후 사용
download.jsp
============================================
String fname = request.getParameter("fname");
File f = new File("/upload/data/" + fname);
: ~~~~~~~~~~~~~~
[의도했던 입력]
download.jsp?fname=myphoto.gif
⇒ /upload/data/myphoto.gif 읽어서 다운로드
[의도하지 않은 입력]
download.jsp?fname=../../../../../../../etc/passwd
⇒ /etc/passwd 파일을 읽어서 다운로드
⇒ 권한 밖의 데이터(파일)에 대해서 접근이 가능
검증, 제한 방법
-
허용 목록 방식으로 검증, 제한한다. = 처리에서 사용할 값을 목록으로 만들고, 목록에 등록된 값만 사용되도록 제한한다.
-
외부에서 전달된 값을 처리에 직접 사용되지 않도록 한다. = 외부에서 전달되는 값은 프로그램 내부에서 허용 목록을 참조하는 용도록 사용되도록 한다. → 허용 목록 범위 내에서 값이 사용되는 것을 보장할 수 있고, 내부 처리 로직을 감출 수 있다.
허용목록 vs 제한목록
화이트 리스트 방식 = 허용 목록 ⇒ 해당 목록에 등록된 값만 믿고 사용
블랙 리스트 방식 = 제한 목록 ⇒ 해당 목록에 등록된 값은 사용하지 않음
입력유형 ⇒ a b c x y z
테스트결과 ⇒ o x x ~~~~~~~ 검증되지 않은 새로운 입력 유형
화이트 리스트 ⇒ [ a ] → a ⇒ 새로운 입력 유형이 만들어져도 동일한 보안성을 보장
블랙 리스트 ⇒ [ b c ] → a x y z
운영체제 명령어 삽입
운영체제 명령어를 실행하는 부분이 존재하는 경우,
외부 입력값을 검증, 제한하지 않고, 운영체제 명령어 또는 운영체제 명령어의 일부로 사용하는 경우 발생
의도하지 않은 명령어가 실행되게 되는 것
⇒ 해당 서버의 제어권을 탈취
[대응방안]
-
운영체제 명령어 실행이 반드시 필요한지 확인하고, 대체 기능을 강구
-
허용할 명령어를 정의하고 목록 내의 값만 사용하도록 제한
-
추가 명령어 실행에 사용되는 &, |, ; 등의 문자를 필터링
외부 입력값을 운영체제 명령어로 사용하는 경우
do.jsp
=========================================
String cmd = request.getParameter("cmd");
Runtime.getRuntime().exec(cmd);
[의도한 입력]
do.jsp?cmd=dir
⇒ 해당 서버의 디렉터리 정보를 반환
[의도하지 않은 입력]
do.jsp?cmd=ipconfig
⇒ 의도하지 않은 ipconfig 명령어 실행 결과가 반환
do.jsp?cmd=dir %26 ipconfig
⇒ 의도하지 않은 ipconfig 명령어가 추가로 실행된 결과가 함께 반환
외부 입력값을 운영체제 명령어의 일부로 사용하는 경우
help.jsp
===========================================
String help = request.getParameter("help");
Runtime.getRuntime().exec("cmd.exe /c type C:\\help_files\\" + help);
~~~~~~~~~~~~~~~~~~~~~~~~
type 명령어의 파라미터로 사용
[의도한 입력]
help.jsp?help=test.html
⇒ c:\help_files\test.html 파일의 내용을 반환
[의도하지 않은 입력]
help.jsp?help=test.html %26 ipconfig
⇒ c:\help_files\test.html 파일의 내용과 함께 의도하지 않은 ipconfig 명령어의 실행 결과가 함께 반환
'슈개's IT > SW개발보안' 카테고리의 다른 글
[SW개발보안] SR1-6. 웹 기반 중요기능 수행 요청 유효성 검증 (0) | 2021.01.23 |
---|---|
[SW개발보안] SR1-5. 웹 서비스 요청 및 결과 검증 (0) | 2021.01.23 |
[SW개발보안] SR1-3. 디렉터리 서비스 조회 및 결과 검증 (0) | 2021.01.23 |
[SW개발보안] SR1-2. XML 조회 및 결과 검증 (0) | 2021.01.23 |
[SW개발보안] SR1-1 DBMS 조회 및 결과 검증 (0) | 2021.01.23 |