적절한 입력 정제(sanitization)는 데이터베이스와 같은 서브시스템으로 악성 코드가 삽입되는 것을 방지할 수 있다.
데이터 출력을 목적으로 하는 여러 서브시스템 공격
HTML renderer는 출력을 디스플레이하기 위한 일반적인 시스템 중의 하나다.
출력 서브시스템으로 보내진 데이터는 신뢰할 수 있는 소스에서 온 것처럼 보일 수 있지만 출력 정제가 불필요하다고 가정하는 것은 위험하다.
이러한 데이터가 비신뢰-소스에서 시작되어 우회했을지도 모르고, 악의적인 내용을 포함할 수도 있기 때문이다.
출력 서브시스템으로 전달되는 데이터를 적절히 정제하지 못하면 여러 가지 형태의 공격을 허용하게 된다.
- HTML renderer는 HTML 인젝션과 XSS 공격을 당하기 쉽다.
- 이런 공격을 방지하기 위한 출력 정제는 입력 정제만큼이나 매우 중요하다.
따라서 입력을 검증할 때, 의심스러운 문자들을 정제하기 전에 데이터가 정규화되어야 한다.
검증을 우회하는 데이터로 인한 취약점을 피하기 위해, 안전하다고 알려진 문자 이외의 모든 출력 문자들을 적절히 인코드 해야 한다.
부적절한 코드 - 데이터를 인코딩하거나 이스케이핑 하지 않은 코드
데이터를 인코딩하거나 이스케이핑 하지 않은 Spring의 MVC 패턴의 Controller
- 사용자의 입력 데이터를 그대로 모델에 추가하여 뷰로 전달.
- 데이터가 웹브라우저로 보내졌기 때문에 코드는 HTML 인젝션과 XSS 공격을 당할 수 있다.
솔루션 - 데이터를 정제하는 ValidateOutput 클래스를 이용한 더블체크 메커니즘 수행
- 사용자의 입력 데이터를 validateAndClean 메서드를 통해 정제하고 화이트리스트를 이용하여 필요한 문자만 남기며, 알려진 문자집합으로 인코딩한 후 뷰로 전달.
- 필요한 화이트리스트링 패턴은 필드별로 지정된 요구에 따라 다르다.
출력 인코딩과 이스케이핑은 필수적이다.
겹따옴표("")나 각괄호([ ])와 같은 위험한 문자를 허용할 때는 출력 인코딩과 이스케이핑이 필수이다.
만약 입력이 이러한 문자들을 허용하지 않도록 화이트리스트화 되어있다고 할지라도 출력 이스케이핑을 해야 한다.
- 정확한 이스케이프 시퀀스는 어디에 출력이 포함되어 있는지에 따라 다를 수 있다.
- 예를 들어, HTML 값 속성, CSS, URL, 스크립트에서 신뢰할 수 없는 출력이 나타날 수도 있다.
- 따라서 두 번째 방어책으로 출력 이스케이핑을 제공하자.
참고자료
자바용 CERT 오라클 보안 코딩 표준 - "문자열을 검증하기 전에 정규화하라"
XSS 공격 방지 - OWASP 크로스 사이트 스크립팅 방지 참고 자료
'Java > Secure Coding' 카테고리의 다른 글
[Secure Coding] XPath 인젝션을 방지하라 (0) | 2023.09.07 |
---|---|
[Secure Coding] 코드 인젝션을 방지하라 (0) | 2023.09.02 |
[Secure Coding] 마구잡이 파일 업로드를 방지하라 (0) | 2023.08.07 |
[Secure Coding] 보안에 민감한 메서드들이 검증된 매개변수를 가지고 호출되도록 보장하라 (0) | 2023.08.06 |
[Secure Coding] 민감한 가변적 클래스에 수정이 불가능한 래퍼를 제공하라 (0) | 2023.08.04 |