Phrack Magazine , Vol 9 | Issue 55 ( 99 . 09 . 09 ) Title : Perl CGI problems 저자 : rain . forest . puppy / [ ADM / Wiretrip ] < rfp @ wiretrip . net > 역자 : dyanos @ newton . hanyang . ac . kr *. 소개 나 는 내 가 이것 이 무엇 에 대해서 작성 한 것 을 소개 해야 만 한다고 느꼈 다 . 게다가 , 나 는 다양 한 CGI 들 을 코딩 과 회계 ( auditing ) 를 해 왔 다 . 그리고 내 가 구멍 들 이 었 다고 생각 하 는 몇몇 문제 들 을 어떤 수단 으로 나타낼지 를 노력 했 다 . 그래서 무엇 이 든지 , 나 는 침묵 할 것 ( shutup ) 이 고 구멍 을 들춰낼 것 이 다 . *. Poison NULL byte 주의 : � oison NULL byte ' 란 이름 을 먼저 사용 한 사람 은 Bugtraq post 에 있 는 Olaf Kirch 이 다 . 나 는 이 이름 을 좋아한다 , 그리고 그것 은 알맞 다 . .. 그래서 나 는 사용 했 다 . Olaf 에게 인사 를 하 고 싶 다 . " root " ! = " root � 때 와 동시 에 � oot " == " root " 일 경우 는 언제 인가 ? ( 아직 혼동 스러운가 ? ) 그것 은 당신 이 프로그래밍 언어 를 동시 에 섞여서 ( co - mingle ) 쓸 때 이 다 . 어느 날 밤 나 는 이상 하 게 여겼 다 . 정확 하 게 는 펄 은 무엇 까지 허락 을 하 고 , 기대 하 지 않 은 방법 에서 나타난 어떤 것 을 얻 을 수 있 는가 . 그래서 나 는 다양 한 시스템 콜 들 과 함수 들 중 에 매우 기묘 한 데이터 들 을 설치 하 기 시작 했 다 . ( So I started piping very weird data out to various system calls and functions . ) 어떠 한 것 도 극 적 이 지 는 않 았 다 . 적어도 매우 주목 할 만 한 하나 를 제외 하 고 는 . .. 보 자 . 내 가 특별 한 파일 인 " rfp . db " 를 열 기 를 원했 다 . 나 는 달 고 들어오 는 값 인 � fp " 를 얻 기 위해 가짜 웹 시나리오 를 사용 했 다 . 당연히 이 � fp " 는 소스 중간 에 ". db " 를 포함 하 게 된다 . 펄 에서 , 스크립트 의 기능 적 인 부분 은 다음 과 같 다 . : # parse $ user _ input $ database = "$ user _ input . db "; open ( FILE "<$ database "); 훌륭 하 다 . ( Great . ) 나 는 � ser _ input = rfp ' 라고 입력 했 다 . 그리고 스크립트 가 " rfp . db " 을 읽 어 들 이 게 했 다 . 결과 는 매우 간단 했 다 . ( let ' s ignore the obvious / ../ stuff right now , 지금 당장 명백 한 / ../ 안 의 자료 를 무시 하 자 . ). 그때 내 가 � ser _ input = rfp % 00 ' 를 입력 했 을 때 흥미 로운 결과 를 얻 었 다 . 펄 은 $ database =" rfp \ 0 . db " 를 만들 었 고 , 그때 $ database 를 열 려고 시도 했 다 . 결과 는 ? 그것 은 " rfp "( or would have , had it existed ) 를 열 었 다 . . db " 는 어디 로 갔 는가 ? 이것 은 흥미 로운 부분 이 다 . 보 자 . 펄 은 데이터 로써 그것 의 변수 에서 NUL 문자 를 허락 한다 . C 와 같 지 않 다면 , NUL 은 문자열 식별 자 가 아니 다 . 그래서 , � oot " ! = " root \ 0 " 가 될 수 있 다 . ( 이것 은 펄 의 경우 이 다 . 다른 언어 에서 는 해 보 질 않 아서 모르 겠 다 . 직접 해 보 길 . ..) 그러나 , 하위 시스템 과 커널 콜 들 은 NUL 을 식별자 로 인식 을 하 는 C 에서 프로그램 했 다 . 그래서 끝 결과 는 ? 펄 은 � fp \ 0 . db " 를 통과 시킨다 . 그러나 하위 라이브러리 들 은 그 들 이 처음 으로 NUL 을 만날 때 처리 를 멈춘다 . 우리 가 root 를 제외 한 어떤 누구 의 계정 에서 암호 를 바꿀 때 신뢰 되 는 준 관리자 ( junior admin ) 를 허락 되 어 진 스크립트 에서 한다면 어떻게 될까 ? 코딩 은 다음 과 같 다 : $ user =$ ARGV [ 1 ] # user the jr . admin wants to change if ( $ user ne " root "){ # do whatever needs to be done for this user } ( ** NOTE : this is here in WAY simplistic form & theory just to illustrate the point ) ( ** 주의 : 이것 은 단지 관점 ( point ) 을 묘사 한 간단 한 형태 그리고 이론 적 인 방법 이 여기 에 있 다 . ) 그래서 , 준 관리자 가 그 이름 으로 � oot ' 가 되 려고 시도 를 한다면 , 그것 은 어떠 한 것 도 되 지 를 않 을 것 이 다 . 그러나 준 관리자 가 � oot \ 0 ' 을 입력 한다면 , 펄 은 테스트 를 성공 하 게 되 고 , 블록 을 실행 한다 . 지금 , 시스템 콜 들 이 piped out 했 을 때 , ( 만일 그것 이 펄 에서 모든 것 을 하 지 않 았 다면 , 가능 하 다 . 그러나 적당 하 지 는 않 다 . ) 그것 은 NUL 이 효과 적 으로 떨어졌 던 것 이 될 것 이 고 , 행동 은 루트 의 기록 에서 일어나 게 될 것 이 다 . 이것 은 그 자체 로써 보안 적 인 문제 가 필요 없 을 동안 , 그것 은 명확히 지켜 볼 만 한 흥미 로운 것 ( feature ) 이 다 . 나 는 resulting page 를 통해 몇몇 사용자 에 복종 하 는 ( user - submitted ) 폼 데이터 에 . html " 에 있 는 많 은 CGI 들 을 보 았 다 . 즉 page . cgi ? page = 1 나 에게 1 . html 을 보여 주 는 것 이 라는 것 을 눈치 챘 을 것 이 다 . 그것 이 . html " 페이지 를 더 하 기 때문 에 , 그것 은 단지 HTML 페이지 들 을 보여 줄 것 이 다 ( Semi - secure , because it adds ". html " page , so you ' d think , at worst , it ' d only show HTML pages ) . 글쎄 , 만일 우리 가 이것 을 보낸다면 , page . cgi ? page = page . cgi % 00 ( % 00 == '\ 0 ' escaped ) 그때 그 스크립트 는 그 자신 의 소스 의 복사 본 을 우리 에게 줄 것 을 느낄 수 있 을 것 이 다 ! 오히려 Perl 의 - e ' 를 가진 견제 는 실패 할 것 이 다 : $ file ="/ etc / passwd \ 0 . txt . whatever . we . want "; die ( " hahaha ! Caught you ! ) if ( $ file eq "/ etc / passwd "); if ( - e $ file ) { open ( FILE , ">$ file "); } 이것 은 성공 적 일 것 이 고 ( 실제로 / etc / passwd 가 만일 있 다면 ) , 쓰 는 것 을 통해 그것 을 열 것 이 다 . 이 문제 를 해결 할 해결책 은 ? 간단 하 다 ! NUL 문자 를 없애 라 . 펄 에서 그것 은 $ insecure _ data =~ s / \ 0 / / g ; 로써 간단 하 게 할 수 있 다 . 주목 : 쉘 메타 문자 들 의 정지 만 으로 그 들 에게서 달아날 수 없 다 . 완전 하 게 그 들 을 없애 라 . *. ( 백 ) 슬래쉬 그리고 burn 당신 이 W 3 C WWW 보안 FAQ 를 찾아보 았 다면 , 당신 은 쉘 메타 문자 의 리스트 인 &| � \ |*?~<>^(){}[]$\ n \ r 일 것 을 권하 는 것 을 볼 수 있 을 것 이 다 . 내 가 찾 았 던 가장 흥미 로운 것 은 모든 사람 이 백 슬래쉬 ( ?\ ) 에 대해서 잊어버린 것 처럼 보이 는 것 이 다 . 아마도 그것 은 당신 이 펄 에서 탈출 코드 ( escape code ) 쓰 기 에 필요 로 하 는 방법 일 것 이 다 . : s / ( [ \ & ; \ ` ' \ \\|"*?~<>^\(\)\[\]\{\}\$\ n \ r ] ) / \\$ 1 / g ; [ ] ( ) {} � 達 悶 【 나온 모든 이러 한 슬래쉬 들 을 포함 해서 ( With all those backslashes escaping [ ] ( ) {}, etc . ) , 그것 은 백 슬래쉬 가 또 한 설명 이 확신 하 게 혼동 에 이르 게 될 것 이 다 . 아마도 , 몇몇 사람 들 은 단지 regex - dyslexic 이 고 , 그리고 그것 이 설명 하 는 백 슬래쉬 의 하나 의 예 로 보 는 것 이 타당 할 것 이 다 . 그래서 , 물론 , 이것 이 왜 중요 한가 ? 당신 이 만일 당신 의 CGI 에 다음 과 같 은 라인 을 보내 는 것 을 상상 해 봐라 : user data ' rm - rf / ' 당신 은 그것 이 변하 게 되 면 당신 의 펄이 코드 를 빠져나가 는 동안 그것 을 실행 한다 . : user data \' rm - rf / \' 쉘 오퍼레이션 이나 기타 다른 곳 에서 사용 되 어 지 는 것 은 지금 은 안 전하 다 . 지금 백 슬래쉬 에서 벗어나 게 되 면 당신 의 잊 어 졌 다고 말 하 자 . ( Now , let ' s say your forgot to escape out backslashes . ) 사용 자 가 다음 과 같 은 줄 을 보낸다 . : user data \' rm - rf / '\ 당신 의 코드 는 그것 을 다음 과 같이 변하 게 하 면 : user data \\' rm - rf / \\' 더블 백 슬래쉬 는 ( leaving the backticks unescaped . ) 싱글 � ? 謙 ? 백 슬래쉬 로 바꿀 것 이 다 . ( 즉 하나 의 백 슬래쉬 로 전달 될 것 이 라는 말 입니다 . ) 이것 은 그때 � m - rf / \' 을 효과 적 으로 실행 한다 . 물론 , 이 방법 을 포함 해서 , 당신 은 항상 다루 는 위조 ( spurious ) 백 슬래쉬 들 을 항상 가진다 . 그 라인 에서 마지막 문자 로써 백 슬래쉬 를 떠나 는 것 은 시스템 상 에서 에러 를 펄 에게 야기 를 시킬 것 이 다 . 그리고 backtick 은 부른다 . ( 최소한 , 나 의 테스트 결과 는 그러 했 다 . ) 당신 은 이것 을 극복 하 는 것 에 비열 해져야 만 할 것 이 다 . :) ( 그것 은 가능 하 다 . ...) 다른 흥미 로운 백 슬래쉬 의 측면 적 효과 ( side - effect ) 는 역 디렉 토리 횡 단선 ( transversals ) 들 을 막 는 다음 에 따른 코드 로부터 나타난다 . : s / \.\.// g ; 그것 이 하 는 모든 것 은 효과 적 으로 파일 의 역 횡 단선 을 진압 하 는 , 이중 점 을 없앤다 . 그래서 / usr / tmp / ../../ etc / passwd 는 / usr / tmp / / / etc / passwd 로 될 것 이 다 . 이것 은 작동 하 지 않 을 것 이 다 . ( 주목 : 다중 슬래쉬 들 은 허락 된다 . � s - l / etc / /// passwd ' 를 시도 해 봐라 . ) 지금 우리 의 친구 인 백 슬래쉬 를 입력 하 라 . 다음 과 같 은 라인 을 주자 . / usr / tmp / .\./.\./ etc / passwd regex 표현 은 백 슬래쉬 에 기인 하 기 에 같 지 않 을 것 이 다 . 지금 펄 안 에서 파일 이름 이 $ file ="/ usr / tmp / .\\./.\\./ etc / passwd "; $ file = s / \.\.// g ; system ( " ls - l $ file "); 을 사용 하 라 . 주목 : 우리 는 단지 하나 의 � ? 謙 ? 백 슬래쉬 를 삽입 하 는 펄 을 얻 기 위한 더블 백 슬래쉬 들 의 사용 이 필요 하 다 . -- 그렇 지 않 으면 , 펄 은 당신 이 단지 점 ( periods ) 을 피하 기 위한 것 이 라고 추정 을 할 것 이 다 . 데이터 양식 으로 , 문자열 은 아직 "/ usr / tmp / .\./.\./ etc / passwd " 이 다 . 그렇지만 상기 의 사실 은 단지 시스템 에서 수행 되 고 backtick 은 부른다 . 펄 은 - e ' 이 고 열린 ( 파이프 가 아닌 ) 함수 는 일 하 지 안 는다 . 그러므로 : $ file ="/ usr / tmp / .\\./.\\./ etc / passwd "; open ( FILE , "<$ file ") or die ( " No such file "); 은 " No such file " 을 나타내 며 죽 을 것 이 다 . 나 의 추측 은 그 쉘 이 . � 횬막 ? \. � 실행 할 필요 가 있 기 때문 이 다 . ( as an escaped period is still just a period ) . 해결책 은 ? 당신 이 백 슬래쉬 를 벗어날 것 을 확신 하 라 . ( Make sure you escape the backslash . ) 간단 하 고 충분 하 다 . *. That pesky pipe 펄 에서 파일 을 여 는 곳 에서 파일 이름 의 끝 에 파이프 | � 추가 시키 면 그것 이 열리 는 것 보다 그 파일 을 열거 하 면서 실행 되 어 짐 을 야기 한다 . 그래서 open ( FILE , "/ bin / ls ") 은 많 은 이진 코드 들 을 당신 이 얻 게 될 것 이 다 . 그러나 open ( FILE , "/ bin / ls |") 는 실재 로 / bin / ls 을 실행 할 것 이 다 . 다음 구문 ( regex , 정확 한 뜻 을 몰라 구문 이 라고 하 겠 습니다 . ) s / (\|)/\\$ 1 / g 는 이것 을 막 을 것 이 다 . ( 펄 은 ? \ � 추적 함 을 표시 함 으로써 다음 라인 을 원하 는 sh 에 기인 하 여 , ' unexpected end of file ' 이라고 하 면서 죽 을 것 이 다 . 만일 당신 이 이것 을 피하 는 방법 을 안다면 나 에게 알려 달 라 . ) 지금 우리 는 우리 가 막 위 에서 배웠 던 그 다른 기술 을 가지 고 상황 을 복잡 하 게 할 수 있 다 . $ FORM 이 CGI 에게 가공 하 지 않 은 사용자 의 제시 한 입력 이 라고 생각 하 자 . 첫 번 째 로 우리 는 다음 을 가진다 . : open ( FILE , "$ FORM ") 디렉 토리 목록 을 얻 기 위해 $ FORM 에 는 " ls |" 가 설정 될 수 있 다 . 지금 , 우리 가 다음 을 가졌 다고 가정 하 자 . : $ filename ="/ safe / dir / to / read / $ FORM " open ( FILE , $ filename ) 그때 우리 는 � s " 가 어디 에 있 는지 를 특별히 나열 한 필요 가 있 다 . 그래서 우리 는 우리 에게 주어진 디렉 토리 목록 으로 , $ FORM 을 "../../../../ bin / ls |" 로 설정 한다 . 이것 이 파이프 되 어 열린 이후 로 , Anti - reverse - traversal regex 를 잘 극복 하 는 우리 의 백 슬래쉬 기술 은 적용 될 수 있 으면 , 가능 한 사용 되 어 져야 할 것 이 다 . 이 관점 에 이르 기 까지 , 우리 는 명령 을 가진 명령 라인 옵션 들 을 사용 할 수 있 다 . 예 를 들 면 , 위 의 단편 적 인 코드 를 사용 하 므로써 , 우리 는 / myself 라는 파일 을 생성 하 기 위해 " touch / myself |" 을 $ FORM 에 다 설정 할 수 있 다 . ( 미안 하 다 , 파일 이름 에 대해서 . . : ) 다음 에 , 우리 는 작 지만 더 어려운 상황 을 가진다 . : $ filename ="/ safe / dir / to / read / $ FORM " if ( !(- e $ filename ) ) die ( " I don ' t think so ! ") open ( FILE , $ filename ) 지금 우리 는 - e ' 의 바보짓 이 필요 하 다 . 문제 는 - e ' 가 그 끝 에 있 는 실재 의 파이프 를 가진 파일 을 찾 기 때문 에 , 만일 � s |" 를 찾 기 를 시도 한다면 없 으니까 되돌 아 오 는 것 이 다 . 그래서 우리 는 - e ' 체크 를 통해 파이프 를 � ┛ � 할 필요 가 있 다 . 그런데 어떤 것 이 조심 스러운가 ? ( Anything come to mind ? ) Poison NULL 에서 구출 된다 ! 우리 가 할려는 모든 것 은 $ FORM 을 " ls \ 0 |" ( 또는 웹 상 에서 " ls % 00 ! " 라고 하 거나 ) 으로써 설정 하 는 것 이 다 . 이것 은 � s " 통해 - e ' 를 표시 해야 하 는 이유 가 된다 . ( 그것 은 우리 의 NUL 을 만남 으로써 처리 를 멈추 거나 파이프 를 무시 한다 . ) 그렇지만 펄 은 아직 그 끝 에 있 는 파이프 가 우리 의 파일 을 열 기 위한 시간 이 되 면 , 우리 의 명령 을 실행 하 는 것 을 볼 것 이 다 . 이것 은 하나 의 포착 ( catch ) 이 다 . 그렇지만 펄이 우리 의 명령어 를 실행 할 때 , 그것 은 우리 의 NUL 에서 멈춘다 . -- 이것 은 우리 가 명령어 라인 옵션 을 나열 할 수 없 다는 것 을 의미 한다 . 아마도 다음 예제 들 은 더 낳 은 설명 을 해 줄 것 이 다 . : $ filename ="/ bin / ls / etc |" open ( FILE , $ filename ) 이것 은 / etc 디렉 토리 의 목록 으로 써 준다 . $ filename ="/ bin / ls / etc \ 0 |" if ( !(- e $ filename ) ) exit ; open ( FILE , $ filename ) 이것 은 '- e ' 가 / bin / ls / etc " 가 존재 하 지 않 는 것 으로 보 기 때문 에 끝날 것 이 다 . $ filename ="/ bin / ls \ 0 / etc |" if ( !(- e $ filename ) ) exit ; open ( FILE , $ filename ) 이것 은 우리 가 ( 분명 한 � s ' 가 ) 우리 의 디렉 토리 의 목록 을 단지 얻 기 위한 것 외 로 작동 할 것 이 다 . 그것 은 인수 로써 ls 에 / etc ' 가 공급 되 지 는 않 을 것 이 다 . < rant >( 역자 주 , 알 아서 해석 을 . ..) 나 는 또한 당신 의 쓰레기 코드 를 가진 노트 를 만들 기 를 원한다 . : 만일 당신 이 게으르 다면 , 펄 프로그래머 들 ( 모든 펄 프로그래머 들 이 개 으 른 것 은 아니 지만 ; 나 는 게으르 다 . ..) 은 당신 의 시간 을 만들 여분 의 시간 을 가져라 . 그리고 특별 한 파일 모드 를 나열 하 고 , 이 버그 의 모임 을 넘겨 줄 것 이 다 . </ rand >( 역자 주 , 이것 도 마찬가지 로 . ..) $ buf =" ls |" open ( FILE , $ bug ) open ( FILE , "$ bug ") 이것 은 작동 을 한다 . 하 지만 open ( FILE , "<$ bug ") open ( FILE , ">$ bug ") open ( FILE , ">>$ bug ") etc . . etc . . 작동 을 하 지 않 을 것 이 다 . 그래서 만일 당신 이 파일 에서 읽 기 를 원하 는 것 이 있 다면 , 그때 $ file 이 아닌 <$ file " 을 열 어라 . 보다 작 은 < � 銹 ( 하나 의 빈약 한 문자 ! ) 를 삽입 하 는 것 은 당신 과 매우 불쌍 한 당신 의 서버 를 구할 수 있 다 . 좋 아 , 지금 우리 는 거의 무기 가 없 으니 , 적 을 구속 시키 러 가 자 . .. - Real life ( insecure ) Perl scripts 우리 의 첫 번 째 CGI 는 , freecode . com 으로부터 가져왔 다 . 그것 은 분류 되 어 진 광고 관리 스크립트 에 있 다 . 그 CGI 파일 로부터 : # First version 1 . 1 # Dan Bloomquist dan @ lakeweb . net 지금 첫 번 째 예제 에서 Dan 은 % DATA 안 에 있 는 모든 들어오 는 형태 의 변수 를 해부 한다 . 그 는 '.. � 犬 NUL 문자 를 제거 하 지 않 았 다 . 그래서 , 코드 의 한 단면 을 엿보 자 . : # This sets the real paths to the html and lock files . # It is done here , after the POST data is read # of the classified page . $ pageurl = $ realpath . $ DATA { ' adPath ' } . ". html "; $ lockfile = $ realpath . $ DATA { ' adPath ' } . ". lock "; ' adPath =/../../../../../ etc / passwd % 00 ' 를 사용 하 여 , 우리 는 $ pageurl 에게 / etc / passwd 파일 을 나열 하 게 할 수 있 다 . $ lockfile 을 통해 나열 할 수 있 다 . 우리 는 후 에 그 가 . html "/". lock " 을 추가 하 기 때문 에 , 추가 된 파이프 를 사용 할 수 없 다 . ( 글 세 , 당신 은 그것 을 사용 할 수 있 다 . 하지만 그것 은 일 을 하 지 않 을 것 이 다 . :) # Read in the classified page open ( FILE , "$ pageurl ") || die " can ' t open to read $ pageurl : $|\ n "; close ( FILE ) ; 여기 서 Dan 은 우리 가 특별 한 파일 인 $ pageurl 에서 읽 는다 . Dan 을 통해 다행 이 도 , 그 는 그때 즉시 쓰 기 를 통해 $ pageurl 을 연다 . 그래서 우리 가 읽 기 를 상술 하 는 무엇 이 든 간 에 , 우리 는 또한 올바르 게 그것 을 쓰 는 것 도 상술 할 것 이 다 . 이것 은 잠재 적 인 이기 적 인 이용 을 훨씬 제한 한다 . 그러나 그것 은 이러 한 문제 의 유형 의 훌륭 한 실생활 의 예 로써 제공 한다 . 충분히 재미있 게 도 , Dan 은 다음 을 통해 거기 에 간다 : # Send your mail out # open ( MAIL , "|$ mailprog $ DATA { ' adEmail ' }" ) || die " can ' t open sendmail : $ adEmail : $!\ n "; 음 . ... 이것 은 일반 적 으로 하 지 말 아야 하 는 것 이 다 . 그리고 Dan 쉘 메타 문자 를 해석 하 지 않 는다 . 그래서 � dEmail ' 은 매우 두려운 것 을 얻 는다 . freecode . com 을 돌아다닐 때 , 나 는 그때 간단 한 폼 로거 ( a simple form logger ) 를 얻 었 다 : # flexform . cgi # Written by Lief M . Wright # leif @ conservatives . net Leif 는 % contents 안 으로 형태 입력 ( form input ) 을 해석 한다 . 그리고 그것 은 쉘 메타 문자 로 탈출 할 수 없 다 . 그때 그 는 다음 과 같이 한다 . $ output = $ basedir . $ contents {' file '}; open ( RESULT , ">>$ output "); 우리 의 표준 역 디렉 토리 횡 단선 ( 역 자주 : ?\ � 이야기 하 는 것 같 습니다 . ) 을 사용 한다면 , 우리 는 확장 된 밖 의 NUL 조 차 도 가지 지 않 는다 . 그래서 또한 , 우리 가 나열 하 는 파일 이 추가 의 형태 로 열 어 지 는 무엇 이 든 , 우리 는 우리 의 퍼 미션 ( permissions ) 을 가진다는 작 은 희망 을 가질 필요 가 있 다 . 또한 , 우리 의 파이프 버그 는 그 가 명확 하 게 ( >> � 경유 하 는 ) 추가 적 인 모드 로 설정 되 기 때문 에 일 하 지 않 는다 . 다음 은 많 은 인기 가 있 는 메일링 리스트 페키지이고 WWW 인터페이스 를 가진 LWGate 이 다 . : # lwgate by David W . Baker , dwb @ netscape . org # # Version 1 . 16 # Dave 는 % CGI 안 에 폼 변수 를 해석 했 던 것 을 놓 는다 . 그때 우리 는 다음 을 가진다 . # The mail program we pipe data to $ temp = $ CGI {' email '}; $ temp =~ s / ( [ : < > \ * \ | ' & \$!#\(\|\[\]\{\}:'"])/\\$ 1 / g ; $ MAILER = "/ usr / sbin / sendmail - t - f $ temp " open ( MAIL , "| $ MAILER ") || & ERROR ( ' Error Mailing Data ') 음 . ... Dave 는 그 의 regex replacement 에서 백 슬래쉬 를 잊 었 던 것 처럼 보이 는 군 . 좋 지 않 다 . 좋 다 , 많 은 쇼핑 카트 애플리케이션 ( cart applications ) 중 의 하나 를 바꾸 기 로 하 자 . 또한 이것 은 그 하나 인데 freecode . com 으로부터 가져왔 다 . 펄 숍 ( Perlshop ) 에서 : $ PerlShop _ version = 3 . 1 ; # A product of ARPAnet Corp . - perlshop @ arpanet . com , www . arpanet . com / perlshop 흥미 있 는 부분 은 : open ( MAIL , "|$ blat _ loc - - t $ to - s $ subject ") || & err _ trap ( " Can ' t open $ blat _ loc ! \ n ") 이 다 . $ to � 명확 하 게 사용 자 정의 된 email 이 다 . Blat 은 NT 메일 프로그램 이 다 . NT 에서 메타 문자 는 <>&!%( 더 있 나 ? ) 밖에 없 음 을 기억 하 라 . 내 가 언급 했 던 pesky pipe 문제 를 기억 하 는가 ? ( 나 는 당신 이 그것 을 기억 하 기 를 희망 한다 . .. 그것 은 단지 몇 페이지 전 에 이야기 했 던 것 이 다 . !!!) 나 는 그것 이 매우 불쾌 한 버그 라는 것 을 인정 한다 . 하지만 나 는 그것 을 찾 았 다 . Matt 의 Script Archive 의 머리 부분 을 보 자 : # File Download Version 1 . 0 # Copyright 1996 Matthew M . Wright mattw @ worldwidemart . com 첫 번 째 그 는 $ Form 안 으로 들어 는 사용 자 데이터 를 해석 한다 . ( 이때 어떠 한 것 도 빠져 나가 고 있 지 는 않 는다 . ) 그때 그 는 다음 을 실행 한다 . : $ Request _ File = $ BASE _ DIR . $ Form ( ' s ') . '/' / $ Form ( '|'); if ( !(- e $ filename ) ) { & error ( ' File Does Not Exist '); } elsif ( !(- r $ filename ) ) { & error ( ' File Permissions Deny Access '); } open ( FILE , "$ Request _ File "); while ( < FILE >) { print ; } 이것 은 � esky pipe problem '( tm ) 을 통한 criteria 에 알맞 다 . 우리 는 - e ' 체크 를 해야 만 하 며 , 그래서 커 멘 드라인 인자 를 사용 되 지 않 는다 . 그 가 정면 에서 $ BASE _ DIR 을 얻 은 이후 로 , 역 디렉 토리 횡 단선 ( ?\ ) 을 사용 할 필요 가 있 을 것 이 다 . 나 는 당신 이 위 의 소스 에서 훨씬 더 많 고 더 간단 한 문제 를 발견 할 것 을 확신 한다 . 만일 f 가 . ./../../../../../ etc / passwd 이 면 ? 글쎄 , 만일 그것 이 존재 한다면 , 그리고 그것 이 읽 을 수 만 있 다면 , 그것 은 당신 에게 보여질 것 이 다 . 그리고 물론 그렇 게 한다 . 다른 하나 에 주목 할 것 은 : download . cgi 에 접속 되 는 모든 것 은 다음 에 따른 코드 에 의해 기록 이 남겨졌 다 : open ( LOG , ">>$ LOG _ FILE "); print LOG "$ Date |$ Form {' s '}|$ Form {' c '}|$ Form {' f '}\ n "; close ( LOG ) ; 그래서 당신 은 당신 이 하 는 모든 것 을 감시 용 카메라 위 에서 할 것 이 다 . 하지만 당신 은 다른 사람 의 서버 에서 어떤 식 으로 든 그것 을 수단 적 재료 로 하 면 안 될 것 이 다 . BigNoseBird . com 으로 날라 가 보 자 . 나 는 나 의 생각 으로 마음 에 드 는 스크립트 이 다 : bnbform . cgi #( c ) 1997 BigNoseBird . Com # Version 2 . 2 Dec 26 . 1998 흥미 있 는 코드 는 스크립트 가 메일 을 센 드메 일 에게 보내 기 위해 파이프 를 열 은 후 이 다 . : if ( $ fields {' automessage '} ne "") { open ( AM , "< $ fileds {' automessage '}"); while ( < AM >) { chop $_; print MAIL "$_\ n "; } 이것 은 다른 간단 한 하나 이 다 . $ fileds 에서 사용 자 입력 을 해석 하 는 동안 은 아무 짓 도 하 지 않 는다 . 그래서 우리 가 � utomessage ' 를 통해서 원 하 는 어떠 한 파일 도 나열 할 수 있 다 . 그것 이 웹 서버 context 에 의해 읽 어 질 수 있 다고 가정 하 면 , 그것 은 우리 가 주소 를 건드릴 때 만 다 또는 그쪽 으로 갈 때 마다 메일 을 얻 게 될 것 이 다 . ( it will get mailed to whatever address we put ( or so the theory goes ) . *. Drats . ... That ' s the End . 역 자주 : 이 부분 은 원문 을 실 겠 습니다 . 이 내용 상 필요 가 없 어 보여서 입니다 . 편지 를 주 시 면 이것 도 해석 하 겠 습니다 . 물론 이 다 . 이 시간 까지 나 는 펄 코드 를 통해 모으 는 것 의 작 은 피곤 함 이 있 었 다 . 나 는 당신 이 더 많이 찾 을 것 이 라고 생각 해서 모든 것 을 연습 으로써 그것 을 남겨둘 것 이 다 . 그리고 만일 당신 이 그것 을 했 다면 , 나 에게 낚싯줄 을 드리 워라 -- 특별 하 게 당신 이 만일 당신 이 ' pesky pipe problem ' 을 사용 하 는 몇몇 스크립트 들 을 찾 는다면 . .. Anyways , that ' s all I wrote for this one , so till next time people . rain . forest . puppy . [ ADM / Wiretrip ] rfp @ wiretrip . net 인사말 은 다음 에서 찾 을 수 있 을 것 이 다 . http : / / www . 디 8 . org / ~ rfp / greets . html 역자 의 말 . .. 음 정말 어려웠 습니다 . 동사 두 개 가 같이 한 문장 에 바로 옆 에 나란히 나오 기 도 하 고 , 중간 에 동사 가 생략 된 것 들 도 있 었 구 . .. 해석 하 다 안 돼 는 부분 도 있 었 구 . .. 하 지만 하 면서 많 은 것 을 배웠 습니다 . 영어 단어 들 도 늘 고 있 구요 . .. 이것 은 어떻게 해석 해야 할지 를 막연 하 게 알 것 같 거든요 . . 정말 유익 한 것 같 구요 . .. 다음 번 에 는 조금 쉬운 것 을 해석 해 볼 생각 입니다 . 아직 해석 이 미숙 한 부분 이 많 습니다 . 그래서 문장 중간 중간 마다 이상 한 문장 이 있 을 것 입니다 . 이해 해 주 세요 . . 저 도 많이 수정 해서 내놓 은 것 을 보 시 겠 지만 . .. 그래도 재 가 미국인 이 아닌 이상 은 해석 을 잘 하 지 는 못 한다는 것 을 이해 해 주 셨 으면 감사 하 겠 습니다 .