13. 시스템 정보 노출

[소스코드 내 시스템 정보 노출]

O 개발 과정 또는 소스코드 수정 시 소스코드 내 하드코딩 된 패스워드가 포함된 소스코드 또는 웹 어플리케이션의 에러 상황에 대한 에러페이지 관리 미흡으로 인해 에러 페이지 및 메시지 등을 통해 시스템 정보가 노출되어 악의적인 사용자들의 2차 공격에 핵심 정보를 획득할 수 있는 취약점


O 근거 자료

☞ 주요정보통신기반시설 기술적 취약점 분석 평가 상세 가이드 (p.676)

☞ OWASP TOP10 2021


O 판단 기준 

양호웹 사이트 또는 소스코드 내 테스트 서버 정보 등 시스템정보가 노출되어 있지 않은 경우
취약웹 사이트 또는 소스코드 내 시스템 정보가 노출되는 경우


O 점검 방법

- F12 등 소스 코드 보기를 통해 웹 페이지 소스코드 내 하드코딩 되어있는 중요정보가 있는지 확인


O 조치 방법

- HTML 레벨의 소스 내 중요 정보 코멘트 처리 및 hidden 값 기록 삭제

데이터베이스 연결을 위한 패스워드는 안전한 암호화 방식으로 암호화하여 별도의 파일에 저장

- 소스코드 내부에 암호화 키를 하드 코딩하게 될 경우 악의적인 사용자에게 노출될 위협이 있으므로, 암호화 키는 별도 외부 파일에 안전한 방식으로 암호화하여 보관

- 취약한 라이브러리를 사용할 경우 안전한 버전으로 업데이트

- 소스코드 내부에 라이브러리 버전 제거 및 라이브러리 명 난수화 


O 시큐어 코딩(Secure Coding) 예시 

# JAVA (패스워드) ▶
public class MemberDAO {
    private static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
    private static final String URL = "jdbc:oracle:thin:@192.168.0.3:1521:ORCL";
    private static final String USER = "SCOTT"; // DB ID
    .....

    public Connection getConn() {
        Connection con = null;
        try {
            Class.forName(DRIVER);
  
            // 암호화된 패스워드를 프로퍼티에서 읽어 들여 복호화해서 사용해야 한다.
            String PASS = props.getProperty("EncryptedPswd");
            byte[] decryptedPswd = cipher.doFinal(PASS.getBytes());
            PASS = new String(decryptedPswd);
            con = DriverManager.getConnection(URL, USER, PASS);  


# JAVA (암호화된 키) ▶
import javax.crypto.KeyGenerator;
import javax.crypto.spec.SecretKeySpec;
import javax.crypto.Cipher;
.....

public String encriptString(String usr) {
    // 암호화 키는 외부 파일에서 암호화 된 형태로 저장하고, 사용시 복호화 한다.
    String key = getPassword("./password.ini");
    key = decrypt(key);
    if (key != null) {
        byte[] bToEncrypt = usr.getBytes("UTF-8");
        SecretKeySpec sKeySpec = new SecretKeySpec(key.getBytes(), "AES"); 


# JavaScript (jQuery) ▶
var f = " "     // var f = "라이브러리 버전 명"
// 소스코드 내부에 라이브러리 명, 라이브러리 버전을 제거한다.
    , S = function(e, t){
        Return new S.fn.init(e,t)
};



[오류페이지 노출]

O 개발 과정 또는 소스코드 수정 시 소스코드 내 하드코딩 된 패스워드가 포함된 소스코드 또는 웹 어플리케이션의 에러 상황에 대한 에러페이지 관리 미흡으로 인해 에러 페이지 및 메시지 등을 통해 시스템 정보가 노출되어 악의적인 사용자들의 2차 공격에 핵심 정보를 획득할 수 있는 취약점


O 근거 자료

☞ 주요정보통신기반시설 기술적 취약점 분석 평가 상세 가이드 (p.676)

☞ OWASP TOP10 2021


O 판단 기준 

양호웹 서비스 에러 페이지가 별도로 지정되어 있는 경우
취약웹 서비스 에러 페이지가 별도로 지정되지 않아 에러 발생시 중요 정보가 노출되는 경우


O 점검 방법

- 서버 에러 및 DB에러 발생 시도

- 코드별 서버 에러 발생 및 에러페이지로의 리다이렉트 여부 확인

- 인위적인 DB에러 유발 시 DB정보 유출 여부 확인


O 조치 방법

- 에러 코드에 대해 서버 정보가 노출되지 않는 별도의 에러페이지로 리다이렉트

- 적절한 에러 처리 루틴을 설정하여 처리


O 시큐어 코딩(Secure Coding) 예시 

# Apache ▶

- 에러 코드에 대해 에러 메시지 출력 및 특정 페이지 리다이렉트 httpd.conf의 전역 설정 추가 및 원하는 가상 호스트 <VirtualHost> 태그사이에 추가

ErrorDocument 401 /error/error.html
ErrorDocument 403 /error/error.html
ErrorDocument 404 /error/error.html
ErrorDocument 500 /error/error.html


# IIS ▶

1. IIS 관리자에서 적용할 사이트 선택 후 오류 페이지 아이콘 클릭 

2. 우측 '기능 설정 편집' 클릭 후 다음과 같이 설정

- 오류 응답 : 사용자 지정 오류 페이지

- 경로 유형 : 파일 

3. 우측 '추가'를 통해 에러 상태 코드에 대한 에러페이지 맵핑 (모든 상태 코드가 동일한 에러 페이지로 리다이렉트 설정 권고)


# Tomcat ▶

- web.xml 내 오류페이지 설정

.....
<web-app>
    <error-page>
        <error-code>400</error-code>
        <location>/error400.jsp</location>
    </error-page>
    <error-page>
        <error-code>404</error-code>
        <location>/error404.jsp</location>
    </error-page>
    <error-page>
        <error-code>500</error-code>
        <location>/error500.jsp</location>
    </error-page>
    <error-page>
        <exception-type>java.sql.SQLException</exception-type>
        <location>/sqlexception.jsp</location>
    </error-page>
</web-app>
.....


카카오톡 채널 채팅하기 버튼