태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

[실전 security ⑤] 안전한 CGI 프로그래밍

보안, 암호화 2008. 8. 11. 11:18 posted by 무병장수권력자


실전! 개발자를 위한 Security 체크 포인트
⑤ 안전한 서버 프로그래밍

작성자 : 김문규
최초 작성일 : 2008. 8. 11
* 본 포스트는 SDS e-campus의 '실전 개발자를 위한 Security 체크포인트' 강의 내용을 발췌하여 재구성한 개인적인 학습노트 입니다.

이번 포스트에서는 안전한 CGI 프로그래밍에 관련된 내용을 배우게 됩니다. 요즘 뭐 CGI 프로그래밍을 사용하는 사람이 있겠습니까? 그래서 이번 포스트에서는 CGI라는 특별한 케이스 보다는 서버 사이드 프로그래밍을 하면서 조심해야 하는 몇가지 부분에 대해서 공유하고자 합니다.

1. Shell을 실행하는 보안이 취약한 함수

1) 내부 명령어를 실행 가능하게 하는 인터페이스를 제공하지 말아야 합니다.

C system(), popen()
perl system(), open(), eval(), exec(), ' '(backticks)
php system(), passthru(), exec(), popen(), escapeshellcmd(), ' '(backticks)
asp Run("cmd.exe")
jsp exec() (Runtime객체)

2) asp, jsp와 같이 실행 가능한 파일이 업로드 되지 않도록 해야 합니다.
 - 1) 과 같은 명령의 수행이 가능한 파일이 업로드 될 경우에 보안 취약점이 발생합니다.

3) 해결책
 - 첨부파일 업로드시 파일명의 확장자 검사를 합니다.
 
 - 첨부파일 업로드시 파일명의 확장자를 임의로 변경하여, 실행되지 않도록 합니다.
   예) test.asp 업로드후-> test.asp021230

 - 업로드된 파일의 물리적인 위치를 유추할 수 없도록 합니다.

 - 첨부파일 업로드되는 디렉토리는 별도로 구성하여 asp, jsp, php등 실행되지 않도록 웹서버의 환경설정을 조정합니다.
   예) asp의 경우 업로드 디렉토리의 IIS관리자 → 등록정보 → 홈디렉토리 탭 → 실행권한 → 스크립트권한 제거

2. File Open (download) 주의 사항

1) URL을 통한 직접 다운로드을 제한합니다.
http://192.168.168.128:8080/upfile/진단신청서.gul
파일 다운로드 시 위와 같이 URL Link 만 연결하는 경우가 있습니다. 해당 파일이 중요하지 않다면 문제 되지 않지만 대외비 이상 문서, 혹은 개인정보 등 이 저장된 중요 파일이라면 반드시 다운로드 프로그램 (예: download.asp) 이용하여 세션 체크 후 정상적인 사용자만 접근하도록 해야 합니다. 

3. 사용하지 않는 HTTP method 옵션을 제거합니다.

1) 보안에 취약한 PUT, DELETE 옵션을 제거합니다.
 - PUT은 웹 서버 리소스의 변경을 초래할 수 있는 HTTP method 입니다.
 - DELETE는 웹 서버 리소스의 삭제를 초래할 수 있는 HTTP method 입니다.

참고 1 : 웹서버의 OPTION 확인방법
1) telnet [server ip] 80 로 접속한 후
2) OPTIONS / HTTP/1.0 엔터 2번 치면
3) 아래와 같이 결과화면이 나옵니다.
    ALLOW옵션에 아래와 같이 PUT, DELETE가 나타나면 취약한 서버입니다.
    (→ 아래 그림참조)

사용자 삽입 이미지

2) 해결책
 - PUT, DELETE의 허용 옵션을 제한합니다.
 예) [IIS 조치방법]
 인터넷서비스관리자 → 웹사이트 등록정보 → 홈디렉토리 탭 → "쓰기"옵션 제거

4. 맺음말
이번 장에서는 크게 어려운 내용이 보이지 않습니다. 실은 강의 원본이 CGI를 기준으로 되어 있어서 제가 잘 이해하지 못하는 부분도 있고 해서 일부 생략하고 제가 아는 내용과 이해하는 내용만 정리했습니다.
개인적으로는 3번째 PUT, DELETE에 대한 내용이 관심이 갑니다. 이유는 REST는 PUT, DELETE를 적절하게 사용하기 때문입니다. REST의 철학과 정면으로 배치되고 있기 때문에 다른 방법을 찾아야 하지 않을까 생각됩니다. 아직 방법은 잘 모릅니다. ^^ 추후 이 내용을 공유할 수 있는 기회가 있길 바랍니다.