시스템에 관한 정보가 새어나갈 수도 있다. 예를 들어, "finger" 스크립트 같은 경우 사용자의 홈 디렉토리에 대한 물리적 경로를 출력해준다. "w" 명령어 같은 경우 서버에서 어떤 프로그램들이 돌고 있고 어떤 사용자들이 있는지에 대한 다양한 정보를 제공해 주고, "ps" 명령어는 "w"보다 더 자세한 정보를 제공해 준다.
사용자의 입력의 크기 제한
C와 같은 언어로 CGI 프로그래밍을 하는 경우 지나치게 긴사용자의 입력으로인한 버퍼 오버플로우 때문에 보안 헛점은 발생한다. 다음과 같은 예제를 보자.
이 코드에서는 사용자의 입력이 1024바이트보다는 작을 것이라고 가정하고 있다. 이런 경우 해커가 1024바이트보다 더 긴 입력을 줘서 프로그램을 오동작 시킬 수도 있게 된다.
버퍼 오버플로우가 생기게 되면 프로그램이 오동작하게되면 때로는 해커가 원격지에서 명령어를 수행할 수도 있게 되는 경우가 있다. 따라서 위와 같은 프로그램은 다음과 같이 수정하는 것이 바람직하다.
char* read_POST() {
int query_size=atoi(getenv("CONTENT_LENGTH"));
char* query_string = (char*) malloc(query_size);
if (query_string != NULL)
fread(query_string,query_size,1,stdin);
return query_string;
}
이 프로그램에서는 동적으로 메모리를 할당해서 사용자의 입력을 받아들이게 되어 있다. 또한 동적으로 할당된 메모리에 대해서는 리턴코드를 검사해야 한다.
동적으로 할당하고 싶지 않다면 strcpy()나 strcat()을 사용하는 것은 바람직하지 못하다. 왜냐면 두 함수는 모두 입력 스트링이 끝날 때까지 무조건 복사하기 때문이다. 따라서 입력 문자열의 최대 길이를 정해 놓고 최대 길이까지만 복사하도록 하는 것이 바람직하다. 이것을 위해서 다음과 같이 strncpy()나 strncat()을 사용할 수 있다.
$mail_to = &get_name_from_input; # read the address from form
open (MAIL,"| /usr/lib/sendmail $mail_to");
print MAIL "To: $mailto\nFrom: me\n\nHi there!\n";
close MAIL;
C 함수 중에서 popen(), system()는 명령을 처리하기 위해 /bin/sh을 호출하게 되고, 펄에서는 system(), exec(), 파이프를 사용하는 open()이 쉘을 호출하고 eval()이 펄 프로그램을 호출하게 된다. 따라서 입력에 쉘의 메타문자가 들어오거나 펄의 명령어가 들어오게 되는 경우 보안 헛점이 생길 가능성이 있다. 예를 들어 다음과 같은 펄 프로그램을 보자.