정보보안심화 · 16분 읽기
명령 주입·XXE·역직렬화와 실행 경계
외부 입력이 shell, XML resolver, 객체 복원기, 템플릿 처리기에 전달될 때 어떤 권한과 동작을 얻는지 설명합니다. 수업의 RCE·Command Injection·OWASP 메모를 원리별로 연결합니다.
개념부터 찾아보기
정의·역할·동작 원리를 독립 페이지에서 확인하세요. 본문의 밑줄 용어에도 설명이 있습니다.
이 노트에서 설명할 수 있게 되는 것
- 입력이 데이터에서 실행 구조로 바뀌는 지점을 찾는다.
- shell 제거·인자 검증·XML 외부 자원 제한·안전한 자료형 복원을 구분한다.
- RCE 결과와 취약점 원인, 실제 실행 권한을 분리해 설명한다.
01개념과 구성 요소
- 공통 경계외부 자료가 ·XML ·객체 복원기·템플릿 등 해석기의 기능을 제어할 때 문제가 생긴다.
- 성립 조건지원 기능·호출 방식·권한·노출된 자원이 실제 영향을 결정한다.
- 원격 코드 실행은 가능한 결과이며 모든 주입·역직렬화 문제가 같은 조건으로 를 만드는 것은 아니다.
02외부 파일 검사를 안전한 실행 경로로 바꾸는 순서
- 입력 의미 제한사용자에게 파일 경로·명령 구문 대신 허용된 자료의 ID를 받도록 설계한다.
- 서버 자료로 해석ID를 형식·길이·권한 기준으로 검증하고 서버가 관리하는 파일 목록에서 실제 대상을 선택한다.
- 실행 경계 선택가능하면 언어의 라이브러리로 처리한다. 외부 프로그램이 필요하면 고정 실행 파일과 인자를 분리해 해석을 피한다.
- 옵션·자원 통제, PATH·환경·작업 디렉터리, timeout·출력 크기·최소권한을 별도로 제한한다.
- 결과와 흔적 연결반환 코드·파일 변화·자식 를 원래 요청과 연결하고 예상한 자료 처리만 발생했는지 확인한다.
03RCE는 원인 하나가 아니라 실행 결과의 범위
- 와 원인는 원격 입력이 실행 경계에 도달하여 대상 권한으로 코드를 실행하는 결과를 뜻한다. OS ·코드 평가··템플릿 처리·실행 가능한 업로드는 서로 다른 원인으로 실행에 도달할 수 있다.
- 권한어느 기능이든 실제 실행은 권한·샌드박스·접근 가능한 자원에 제한된다.
- 실행 후 도구Reverse ·web ·특정 프레임워크 세션은 실행 이후 가능한 도구나 통신 형태이며 와 같은 분류 축의 취약점 이름은 아니다. 원격 코드 실행이 있다고 항상 관리자 권한이나 전체 네트워크 제어를 얻는다는 뜻도 아니다.
- 성립 조건인증 전후·사용자 상호작용·기능 활성화 같은 성립 조건을 함께 기술한다.
04Shell 문자열에 연결하면 구문을 공유한다
- 재해석프로그램이 inspect-file 같은 외부 도구에 파일명을 넘길 때 문자열을 만들면 이 공백·메타문자·확장·리다이렉트 등을 다시 해석한다. 애플리케이션은 이름 하나를 전달한다고 생각하지만 에는 여러 명령 또는 다른 구조로 보일 수 있다.
- 문법·자료 결합입력과 명령 문법을 같은 문자열에 합친 것이 경계의 문제다.
- 라이브러리·인자 배열가장 직접적인 개선은 외부 명령 없이 언어의 파일·네트워크 라이브러리를 사용하는 것이다. 꼭 외부 프로그램이 필요하면 실행 파일과 인자를 배열로 분리하여 을 거치지 않도록 한다.
- 단, 제거는 다음 절의 까지 자동 해결하지 않는다.
# 취약 구조의 개념 예: 실행하지 않음
command = "inspect-file " + user_value
run_shell(command)
# 개선 설계
validated_id = validate_allowed_id(user_value)
path = server_owned_file_table[validated_id]
inspect_with_library(path)원리를 설명하는 가상 학습 예시입니다.
LEARN THROUGH PRACTICE
웹의 Ping 기능을 입력·프로세스·출력으로 분해하기
입력 문자열이 셸 문법으로 해석되는 경계를 찾고 안전한 인자 전달 방식으로 바꾼다.
실습 구성과 전제
- 격리된 교육용 Ping 폼과 폐기 가능한 만 사용한다.
- 아래 웹 출력과 터미널 출력은 기능의 대응 관계를 비교하는 자료이며 지연 수치가 같은 연속 실행은 아니다.
웹 입력이 만드는 정상 프로세스를 추적한다
- 폼의 주소 입력은 ping 프로그램에 전달되는 데이터여야 한다. 웹 서버가 주소를 셸 명령 문자열에 붙이면 데이터와 셸 구문이 같은 문맥에 놓인다.
- 정상 주소 하나로 제한하고 응답에서 전송 수·수신 수·손실률을 읽는다.
원본 크기로 보기 ↗- 웹 화면에는 Ping for FREE와 주소 입력칸이 있으며 3 packets transmitted, 3 received가 표시된다.
- 0% packet loss는 해당 ICMP 시험 결과다. 입력 검증이나 명령 주입 방어가 구현됐다는 뜻은 아니다.
확인 기준정상 기능이 실제로 어떤 실행 파일과 옵션을 사용하는지 코드에서 확인한다.
웹 결과와 프로그램 출력을 연결한다
- 터미널 출력의 ping -c 3은 세 번의 요청 횟수를 지정한다. 웹이 이 출력을 그대로 반환한다면 서버 명령 결과가 응답 경로에 들어간 것이다.
- 서버가 받은 입력을 안전한 인자 배열로 전달해도 실행 파일·옵션·시간 제한을 별도로 통제해야 한다.
address = str(ipaddress.ip_address(user_input)) result = subprocess.run(['ping', '-c', '3', address], shell=False, capture_output=True, text=True, timeout=5)전용 비교 예시. ipaddress와 subprocess를 가져온 후 사용하며 실제 실행은 자신의 실습 장비로 제한한다.
원본 크기로 보기 ↗- 터미널 명령은 ping -c 3이며 결과에 세 개의 응답과 요약 통계가 있다.
- 웹 화면과 출력 형식은 비슷하지만 RTT 값은 다르다. 이를 동일 실행의 앞뒤 증거로 합치지 않는다.
확인 기준허용 주소 형식과 프로그램 옵션을 서버가 고정하는지 본다.
실행 전 거부와 실행 실패를 나누어 시험한다
- 주소 형식 오류는 를 만들기 전에 거부한다. 정상 주소의 응답 없음·시간 초과는 실행 단계의 실패로 구분한다.
- 출력 길이·동시 실행 수·권한도 제한한다. 셸을 쓰지 않는 것과 서비스 자원 소진 방지는 서로 다른 조건이다.
확인 기준잘못된 입력에서 가 생성되지 않고, 타임아웃 뒤 작업이 정리돼야 한다.
실습에서 확인한 동작 원리
- 의 경계는 데이터가 셸 문법으로 넘어가는 지점이다.
- 정상 기능의 옵션·권한·시간·출력까지 제한해야 한다.
설정·출력 추가로 확인하기 36장
아래 화면을 펼쳐 위 실습의 설정값, 명령과 확인 기준을 비교해 보세요. 각 묶음은 별도 실습 기록입니다.
실습 화면 묶음 01 2장
원본 크기로 보기 ↗- 「로그」 문맥에 삽입된 원본 실습·개념 참고 화면이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「/var/log/audit/audit.log」 문맥에 삽입된 원본 실습·개념 참고 화면이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
실습 화면 묶음 02 1장
원본 크기로 보기 ↗- 수업 원본 자료 · 격리된 웹 실습의 명령 주입 요청과 패킷. 원문에서 「시나리오」에 배치된 그림 또는 화면이다.
실습 화면 묶음 03 4장
원본 크기로 보기 ↗- 「COMMAND EXEC」 문맥에 삽입된 원본 실습·개념 참고 화면이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「COMMAND EXEC」 문맥에 삽입된 원본 실습·개념 참고 화면이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「COMMAND EXEC」 문맥에 삽입된 원본 패킷 캡처이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「COMMAND EXEC」 문맥에 삽입된 원본 패킷 캡처이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
실습 화면 묶음 04 1장
원본 크기로 보기 ↗- 학습 원본 · XML 처리와 인증 요청 실습의 해당 절에 수록된 화면·도식이다.
실습 화면 묶음 05 1장
원본 크기로 보기 ↗- 학습 원본 · XML 처리와 인증 요청 실습의 해당 절에 수록된 화면·도식이다.
실습 화면 묶음 06 1장
원본 크기로 보기 ↗- 학습 원본 · XML 처리와 인증 요청 실습의 해당 절에 수록된 화면·도식이다.
실습 화면 묶음 07 1장
원본 크기로 보기 ↗- 학습 원본 · XML 처리와 인증 요청 실습의 해당 절에 수록된 화면·도식이다.
실습 화면 묶음 08 14장
원본 크기로 보기 ↗- 「Netcat(nc)이란?」 문맥에 삽입된 원본 명령·상태 출력이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「n」 문맥에 삽입된 원본 명령·상태 출력이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「n」 문맥에 삽입된 원본 명령·상태 출력이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「n」 문맥에 삽입된 원본 설정·관리 화면이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「n」 문맥에 삽입된 원본 실습·개념 참고 화면이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「n」 문맥에 삽입된 원본 실습·개념 참고 화면이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「n」 문맥에 삽입된 원본 실습·개념 참고 화면이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「n」 문맥에 삽입된 원본 실습·개념 참고 화면이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「n」 문맥에 삽입된 원본 실습·개념 참고 화면이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「n」 문맥에 삽입된 원본 실습·개념 참고 화면이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「n」 문맥에 삽입된 원본 실습·개념 참고 화면이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「n」 문맥에 삽입된 원본 실습·개념 참고 화면이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「n」 문맥에 삽입된 원본 실습·개념 참고 화면이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「n」 문맥에 삽입된 원본 실습·개념 참고 화면이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
실습 화면 묶음 09 1장
원본 크기로 보기 ↗- 학습 원본 · 격리 웹 환경의 명령 주입 실습의 Command injection에 수록된 화면·도식이다.
실습 화면 묶음 10 1장
원본 크기로 보기 ↗- 학습 원본 · 격리 웹 환경의 명령 주입 실습의 Command injection에 수록된 화면·도식이다.
실습 화면 묶음 11 1장
원본 크기로 보기 ↗- 학습 원본 · 격리 웹 환경의 명령 주입 실습의 injection에 수록된 화면·도식이다.
실습 화면 묶음 12 1장
원본 크기로 보기 ↗- 학습 원본 · 격리 웹 환경의 명령 주입 실습의 injection에 수록된 화면·도식이다.
실습 화면 묶음 13 1장
원본 크기로 보기 ↗- 학습 원본 · 격리 웹 환경의 명령 주입 실습의 injection에 수록된 화면·도식이다.
실습 화면 묶음 14 1장
원본 크기로 보기 ↗- 학습 원본 · 격리 웹 환경의 명령 주입 실습의 injection에 수록된 화면·도식이다.
실습 화면 묶음 15 1장
원본 크기로 보기 ↗- 학습 원본 · 격리 웹 환경의 명령 주입 실습의 리버스쉘 실습1-command injection에 수록된 화면·도식이다.
실습 화면 묶음 16 1장
원본 크기로 보기 ↗- 학습 원본 · 격리 웹 환경의 명령 주입 실습의 리버스쉘 실습1-command injection에 수록된 화면·도식이다.
실습 화면 묶음 17 1장
원본 크기로 보기 ↗- 학습 원본 · 격리 웹 환경의 명령 주입 실습의 리버스쉘 실습1-command injection에 수록된 화면·도식이다.
실습 화면 묶음 18 1장
원본 크기로 보기 ↗- 학습 원본 · 격리 웹 환경의 명령 주입 실습의 리버스쉘 실습1-command injection에 수록된 화면·도식이다.
실습 화면 묶음 19 1장
원본 크기로 보기 ↗- 「실습」 문맥에 삽입된 원본 실습·개념 참고 화면이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
05Argument Injection은 새 명령이 없어도 성립한다
- 옵션 해석외부 프로그램은 전달받은 인자를 자체 옵션 문법으로 해석한다. 파일명 자리에 --help 같은 값이 들어가면 없이도 프로그램 동작이 달라질 수 있다.
- 지원 기능더 위험한 옵션을 지원하는 프로그램에서는 쓰기 위치·설정 파일·외부 연결 같은 기능이 선택될 수도 있다.
- 고정 실행·옵션고정된 실행 파일 경로와 허용 옵션, 입력 값의 형식·길이·범위를 따로 검증한다. 해당 도구가 지원한다면 --로 옵션 종료를 표시할 수 있지만 모든 프로그램이 같은 규칙을 사용한다고 가정하지 않는다.
- 환경 문맥PATH·환경변수·작업 디렉터리도 실행 파일 선택과 동작에 영향을 주므로 서비스의 실행 문맥을 함께 통제한다.
06정상 명령 실행에도 자원·출력 경계가 있다
- 자원 한도명령 이름이 고정되어 있어도 입력이 큰 파일·느린 주소·복잡한 변환을 선택하게 하면 CPU·메모리·worker를 오래 점유할 수 있다. timeout, 출력 크기 제한, , 파일·네트워크 범위 제한은 주입 예방과 별도로 실행 기능의 피해 범위를 줄인다.
- 증거관찰 자료는 웹 요청 ID, 부모·자식 , 실행 파일, 인자, 반환 코드, 파일·연결 변화를 연결한다. 자식 가 하나 생겼다는 사실만으로 공격을 확정하지 않고 원래 기능이 생성하는 정상 와 비교한다.
- 행위 변화입력 한 개가 어떤 행위를 바꾸었는지 설명하는 것이 핵심이다.
07XML에서 Entity와 외부 Resolver
- ·XML 파서는 태그 구조뿐 아니라 설정에 따라 와 를 처리할 수 있다. 내부 는 이름을 텍스트로 치환하는 구조를 보여 준다.
- 외부 외부 해석이 허용된 파서가 신뢰하지 않는 선언을 따라가면 파일이나 네트워크 자원을 읽을 수 있어 XML 입력이 서버 권한의 외부 접근으로 바뀐다.
- 영향의 결과는 로컬 자료 노출··자원 소모 등이며 파서·설정·권한·응답 노출 조건에 따라 달라진다. 아래는 외부 접근을 하지 않는 내부 의 단순 학습 예다.
- 내부·외부 구분이를 지원한다는 사실만으로 외부 도 허용되는 것은 아니다.
- XML 입력파서가 XML 구조와 지원 설정에 따라 DOCTYPE·· 선언을 읽는다.
- 해석내부 는 정의된 텍스트로 치환한다. 외부 해석이 허용되면 가 파일·네트워크 자원에 접근할 수 있다.
- 내용 사용해석 결과가 응답 또는 후속 처리에 사용된다. 자료 노출··자원 소모의 실제 영향은 파서·권한·반환 경로에 달려 있다.
xml
<!DOCTYPE note [
<!ENTITY lesson "training-marker">
]>
<note>&lesson;</note>
개념상 치환 결과: <note>training-marker</note>
보안 정책이 DTD를 금지하면 이 입력 자체가 거부될 수 있다.원리를 설명하는 가상 학습 예시입니다.
08XXE 방어는 실제 파서의 기능을 제한한다
- 제한기능에 가 필요 없다면 DOCTYPE을 거부하는 구성이 가장 단순하다. 필요하다면 외부 와 외부 로딩을 제한하고 확장량·깊이·크기를 제한한다.
- 다른 XInclude· 검증·스타일시트 변환 등 다른 외부 자원 해석 경로도 별도 설정을 가질 수 있다.
- 네트워크 차단의 한계네트워크 송신만 막아도 로컬 파일 읽기나 내부 의 과도한 확장은 남을 수 있다. 반대로 기능 하나를 껐다고 모든 XML 관련 외부 접근이 꺼지는 것도 아니다.
- 옵션·대조군라이브러리·버전에 맞는 보안 옵션을 적용하고 지원하지 않는 옵션 오류를 무시한 채 파싱을 계속하지 않는다. 학습에서는 정상 문서와 외부 참조가 거부되는 결과를 각각 관찰한다.
원리 심화
09파서 설정·자료 스키마·자원 예산의 세 경계
- 기능 제한XML 외부 ··XInclude· 외부 참조는 서로 다른 기능일 수 있다. 한 옵션을 끈 사실만으로 모든 외부 읽기가 차단됐다고 가정하지 않는다.
- 경계업무상 참조가 필요하면 허용 자료를 명시적으로 제공하는 정책을 둔다. 사용자 입력이 임의 파일·네트워크 대상이 되지 않게 한다.
- 자료 검증JSON처럼 자료 전용 형식도 필드 타입·필수값·허용 범위·중첩·총크기를 검증해야 한다. 코드 실행 방지와 자원 고갈 방지는 별도 요구다.
- 서명 위치서명된 바이트를 안전하게 확인한 뒤 허용 형식으로 해석한다. 서명은 발신·무결성을 확인하지만 자료가 업무 규칙에 맞거나 무해함을 자동 증명하지 않는다.
- 실행 권한파서와 변환기가 접근할 수 있는 파일·네트워크· 권한을 줄이면 기능 제한 실패의 영향을 제한할 수 있다.
예제로 추적
10가상 JSON 작업 요청의 타입·범위 판정
- 조건교육용 요청은 quantity라는 정수 하나를 요구하고 허용 범위는 1~10이라고 가정한다. 추가 필드는 거부하는 정책이다.
- 정상 자료quantity=3이면 정수 타입과 범위를 모두 통과한다. 이 뒤에도 해당 작업을 요청할 권한은 따로 검사한다.
- 문자열 자료quantity가 문자열 "3"이면 엄격한 에서는 타입 오류다. 자동 변환을 허용할지 업무 정책에서 명시하지 않고 조용히 바꾸지 않는다.
- 범위 초과quantity=11은 정수이지만 범위 조건에서 거부한다. 타입 검사만 통과했다고 업무 입력이 유효해지는 것은 아니다.
- 처리 순서본문 크기·파싱→·범위→→작업 실행 순으로 경계를 적용한다. 검증 전에 파일·를 생성하면 거부해도 부수 효과가 남는다.
검증·예외
11안전한 API를 썼는데도 외부 효과가 생길 때
- 하위 호출처음에는 =False여도 하위 프로그램이나 스크립트가 다시 셸 문자열을 만드는지 본다. 전체 호출 경로의 해석기를 추적한다.
- 옵션 해석인수 배열은 셸 문법을 피하지만 프로그램 자체의 옵션 문법은 남는다. 파일명 자리에 옵션처럼 해석되는 값을 허용하는지 확인한다.
- 파서 단계XML 파싱 이후 XSLT· 검증·이미지 변환 등 후속 처리에서 외부 참조가 다시 활성화되는지 확인한다.
- 예산과 오류깊이·노드 수·CPU·메모리·출력 한도를 넘었을 때 작업을 중단하고 잔여 파일·자식 를 정리하는 정책을 둔다.
12직렬화는 표현, 역직렬화는 복원
- ·복원는 객체·값을 저장·전송할 표현으로 바꾸는 작업이고 역직렬화는 그 표현을 다시 메모리 구조로 복원하는 과정이다. 단순 JSON 값과 언어별 객체 는 같은 능력을 가지지 않는다.
- 복원기의 기능어떤 복원기는 클래스 선택·특수 메서드·상태 복구 코드를 실행할 수 있다.
- 는 신뢰하지 않는 입력이 이런 기능을 통제할 때 발생한다. 은 객체 복원 과정에서 호출 관계로 연결될 수 있는 기존 코드 조각을 가리킨다.
- 다른 영향모든 역직렬화가 는 아니며 자료 변조·권한 속성 조작·자원 소모처럼 다른 영향도 가능하다.
13Pickle과 자료 전용 형식
- 위험 은 신뢰할 수 없는 바이트를 안전하게 읽는 일반 데이터 포맷이 아니다. 복원 중 코드 실행이 가능하므로 외부 입력에 .load/loads를 사용하는 설계는 피한다.
- 메모리 포렌식 구분포렌식에서 메모리를 수집하는 기능과 객체 도 서로 다른 작업이다.
- JSON 자료 전용 JSON을 선택해도 user.role 같은 속성을 그대로 권한에 반영하면 업무 무결성 문제가 남는다. 허용 필드·타입·길이·중첩 깊이를 검증하고 서버가 결정해야 할 값은 입력에서 받지 않는다.
- 후속 실행 경계JSON의 값들을 다시 eval·동적 객체 생성에 넣으면 처음의 안전한 자료 경계가 다시 사라진다.
import json
data = json.loads('{"item":"lesson-42","quantity":2}')
if not isinstance(data, dict) or set(data) != {"item", "quantity"}:
raise ValueError("unexpected fields")
if not isinstance(data["item"], str):
raise ValueError("invalid item")
if type(data["quantity"]) is not int or not 1 <= data["quantity"] <= 10:
raise ValueError("invalid quantity")
# 가격·소유자·권한은 서버 자료와 현재 세션에서 결정가상 자료의 필드·타입·범위를 검사하는 학습 예입니다.
14템플릿 입력과 템플릿의 값
- 템플릿·자료 값템플릿 엔진은 작성자가 정한 표현식·조건·반복과 자료 값을 결합한다. 사용자 이름을 템플릿의 데이터 값으로 전달하는 것과 사용자 문자열을 새로운 템플릿 소스로 컴파일하는 것은 다르다.
- 소스 컴파일후자는 사용자가 엔진의 표현식 문법에 영향을 줄 수 있다.
- SSTI 영향SSTI의 실제 영향은 엔진이 노출한 함수·객체·sandbox·권한에 따라 달라진다. 템플릿 표현식이 평가되었다는 관찰과 OS 명령 실행을 증명했다는 결론을 구분한다.
- 기능 제한사용자에게 서식 기능이 필요하면 허용하는 언어와 접근 객체를 제한하고, 일반 텍스트 입력은 코드가 아닌 값으로 다룬다.
15검증·서명·권한은 서로 다른 방어층
- 서명·검증 순서서명이나 MAC은 신뢰한 생산자가 만든 바이트인지 검증하는 데 도움이 되지만 생산자가 위험한 내용을 만들 수 있거나 검증 전에 역직렬화하면 목적을 달성하지 못한다. 형식 검증·출처 검증·실행 권한 제한을 서로 대체할 수 없다.
- 문법별 통제한 문자열 필터로 ··XML·HTML의 다른 문법을 모두 막는 접근도 정확하지 않다.
- 정상·거부 결과정상 입력의 기대 결과와 거부해야 할 구조, 오류 시 정리되는 자원, 로그에 남는 원인을 연결한다. 파서가 어떤 문법과 자원 접근을 지원하는지에 따라 입력 한 개의 의미가 달라지므로, 겉으로 같은 문자열이라도 ··XML·템플릿에서 다른 검증 기준을 적용해야 한다.
학습 확인
이해했는지 확인하기
- 외부 입력이 전달되는 처리기와 그 권한을 구분했는가?
- 정상 값이 유지되고 실행 구조·외부 자원 참조가 제한되는가?
- 파서 오류·시간 초과·부분 처리 후 안전한 상태와 증거가 남는가?