|
|
��� ������� �������� ��: English Castellano Deutsch Francais Nederlands Portugues Russian Turkce |
����� Fr�d�ric Raynal, Christophe Blaess, Christophe Grenier <pappy(_at_)users.sourceforge.net, ccb(_at_)club-internet.fr, grenier(_at_)nef.esiea.fr> �� ������: Christophe Blaess - ����������� ������� �� �����������. �� ���������� Linux � ������ ������� ����� ����� ������ �� ���� �������. �������� ������������ ��������� man �������, ����������� Linux Documentation Project. Christophe Grenier - ������� 5 ����� � ESIEA, ��� �� ����� �������� ����������. �������� ���������� ������������ �������������. Fr�d�ric Raynal ����� ��� ���������� Linux, ������ ��� �� �� ���������� ���������� �����, �� ���������� �� �������, �� MSG, �� �������� ���� �� �������� ... ������ ������� ���� � ��������. ������� �� �������: Kolobynin Alexey <alexey_ak0(_at_)mail.ru> ����������:
|
������:
�������� ����������� ����, ������� ������������ ����� ����� ���������� Perl ������ ...
"���������� ����� ������ ������� ��� �������!"
���������� ������ �� �����:
����� ������ ����������� HTML ����, ������ �������� ��� ����������� �������� (��� ���������
�� ������). ������� ������������ HTML ���, ����� ��������������� � ���������� ����.
��������, ����� URL (Uniform Request Locator - ��������������� ��������� ��������������� �������)
http://www.linuxdoc.org/HOWTO/HOWTO-INDEX/howtos.html
,
������ ������������ � ������� www.linuxdoc.org
� ����������� �������� /HOWTO/HOWTO-INDEX/howtos.html
(����� ������
���������� URI - Uniform Resource Identifiers (������������� ������������� �������)), ���������
�������� HTTP. ���� �������� ����������, ������ �������� ����������� ����. � �����
����������� ������, ���� ���� ������������ �� �������, �� ����������
������� ��� ����, ����� ���������� ��������� �� ������ (������ ��������� 404 - Not Found).
� ����������, ����� ������ �� ��������� ������������ ��������������� ��� ������ � �������������, ��� ������ ����������� ����� ����, ��� e-������, �-������������ (�������) �� ��������� � e-���_����_���.
� ������� ���� ������� ��� ����������� ������������ HTML ��������. CGI (Common Gateway Interface - ����� �������� ���������) ������� - ���� �� ���. � ���� ������ URI ��� ��������� ��� ������� �������� ������� ��-������� :
http://<������><������������>[?[�����_1=����_1][...]
[&�����_n=����_n]]
QUERY_STRING
.
� ������ ���������������, CGI ������ �� ����� ��� ����������� ����. �� ����������
stdin
(����������� ����) ��� ���������� ��������� QUERY_STRING
, �����
�������� ���������, ���������� ���. ����� ���������� ����, ��������� ���������
�� stdout
(����������� �����) � �����, ���������� ���-�������.
����� ������ ���� ���������������� ����� ���� ����������� ��� ��������� CGI ��������
(����������������� ��������� �� C, Perl, ������� shell � �.�.).
��� �������, ������� ������ � ����� HOWTO �� www.linuxdoc.org
�����������
� ssh :
http://www.linuxdoc.org/cgi-bin/ldpsrch.cgi?svr=http%3A%2F%2Fwww.linuxdoc.org&srch=ssh&db=1&scope=0&rpt=20
www.linuxdoc.org
;
/cgi-bin/ldpsrch.cgi
;
?
- ������ �������� ������ ����������:
srv=http%3A%2F%2Fwww.linuxdoc.org
- ��� ������, � �������� ��������
������;
srch=ssh
�������� ��� ������, ��� ������;
db=1
��������, ��� ����� ������� ������ � HOWTO;
scope=0
��������, ��� ����� ������� � ���������� ���������, � ��
������ � ��� ���������;
rpt=20
������������ �� 20 ���������� ��������� ����������, ������������
�� ��������.
����� ����� ���������� � �� ��������, ���� ������������� ��� ���� ��� �������������. ����� ����, ���������� �������� � ������� ��� ����� �������� �� ����������.
������ �� ������, ��� ������ ������� CGI �������� - ����������� ������������ ���������� ������ ����� ���������... �� ������ ������� - �� ��� ����� ���������� ������ ��������� ���� � ������������.
�� �������� �������� �������� �������, ������� ���������� ��� ������� �������
� ���������� �������. ��� ������� ������������ � ���������� ������ ISO 8859-1
(��������� �� >man iso_8859_1
).
� ������� 1
������������ �������� ��������� �� ���� �����. ��������, ��� � �������� IIS4.0 � IIS5.0
���������� ������ ������� ����������, ���������� unicode bug, ���������� ��
������������� �������� "/" � "\" � unicode.
SSI Server Side Include
"Server Side Include - ������� �� ������� �������
- ����
�� ������������ ���-�������. ��� ��������� ��������� ���������� � ���-��������, ����� ���
��������� � �������� ��������������� ����� ��� ���������� ������� (�������� ��� CGI �������).
� ����� ������������ Apache httpd.conf
����������
"AddHandler server-parsed .shtml
" �������� ���� ��������.
�����, ����� ������ �������� ����� .html
� .shtml
,
� ���� ���������� ���������� ���������� .html
. �����������, ���
��������� ������ �������... ������ ��������� �������������� �� ������ ����������
��� ������ ����������:
Options Includes
������������ ��� SSI ;
OptionsIncludesNoExec
��������� ������������� exec cmd
�
exec cgi
.
� �������������� � ����� ��������� �������
guestbook.cgi
,
�����, ��������������� �������������, ���������� � HTML ���� ��� ������
�������� '<' � ' >' �� HTML ��� < � >.
�������������� ������� ����� �������� ���� �� ��������� ����������:
<!--#printenv -->
(�������� �������� �� ������ ����� printenv
)
<!--#exec cmd="cat /etc/passwd"-->
guestbook.cgi?email=pappy&texte=%3c%21--%23printenv%20--%3e
DOCUMENT_ROOT=/home/web/sites/www8080 HTTP_ACCEPT=image/gif, image/jpeg, image/pjpeg, image/png, */* HTTP_ACCEPT_CHARSET=iso-8859-1,*,utf-8 HTTP_ACCEPT_ENCODING=gzip HTTP_ACCEPT_LANGUAGE=en, fr HTTP_CONNECTION=Keep-Alive HTTP_HOST=www.esiea.fr:8080 HTTP_PRAGMA=no-cache HTTP_REFERER=http://www.esiea.fr:8080/~grenier/cgi/guestbook.cgi? email=&texte=%3C%21--%23include+file%3D%22guestbook.cgi%22--%3E HTTP_USER_AGENT=Mozilla/4.76 [fr] (X11; U; Linux 2.2.16 i686) PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin REMOTE_ADDR=194.57.201.103 REMOTE_HOST=nef.esiea.fr REMOTE_PORT=3672 SCRIPT_FILENAME=/mnt/c/nef/grenier/public_html/cgi/guestbook.html SERVER_ADDR=194.57.201.103 [email protected] SERVER_NAME=www.esiea.fr SERVER_PORT=8080 SERVER_SIGNATURE=<ADDRESS>Apache/1.3.14 Server www.esiea.fr Port 8080</ADDRESS> SERVER_SOFTWARE=Apache/1.3.14 (Unix) (Red-Hat/Linux) PHP/3.0.18 GATEWAY_INTERFACE=CGI/1.1 SERVER_PROTOCOL=HTTP/1.0 REQUEST_METHOD=GET QUERY_STRING= REQUEST_URI=/~grenier/cgi/guestbook.html SCRIPT_NAME=/~grenier/cgi/guestbook.html DATE_LOCAL=Tuesday, 27-Feb-2001 15:33:56 CET DATE_GMT=Tuesday, 27-Feb-2001 14:33:56 GMT LAST_MODIFIED=Tuesday, 27-Feb-2001 15:28:05 CET DOCUMENT_URI=/~grenier/cgi/guestbook.shtml DOCUMENT_PATH_INFO= USER_NAME=grenier DOCUMENT_NAME=guestbook.shtml
���������� exec
������������� ��� ����� ��� ���������� shell:
guestbook.cgi?email=ppy&texte=%3c%21--%23exec%20cmd="cat%20/etc/passwd"%20--%3e
�� ����������� "<!--#include file="/etc/passwd"-->
", ����
������ ���������� ������������ ����������, ��� ���������� HTML ���� � �� ������
��������� "..
". ���� error_log
Apache ����� ���������
��������� � ������� ������� � ������������ �����. � ������������ ������ �������
��������� [an error occurred while processing this directive(��� ��������� ���������� �������� ������)]
�� HTML
��������.
SSI ����� ������ �����, ������� �� ����� ��������� �� �������. ������� ������������� �������� - ���������� ������������� ������� guestbook � SSI.
� ���� ��������� �� ���������� ���� � ������������, ����������� � CGI ��������, ���������� �� Perl. ��� �������� �� �� ����� ������ ������ ��� ��������, � ������ �����, ������� ���������� ��� ���������, ��� ��������� ��������.
������ �� ����� �������� �������� �� ���������� �������:
#!/usr/bin/perl -wT BEGIN { $ENV{PATH} = '/usr/bin:/bin' } delete @ENV{qw(IFS CDPATH ENV BASH_ENV)}; # ������� %ENV ���������� =:-) print "Content-type: text/html\n\n"; print "<HTML>\n<HEAD>"; print "<TITLE>��������� �������</TITLE></HEAD>\n"; &ReadParse(\%input); # ������ ����� ������������ $input, ��������, ���: # print "<p>$input{filename}</p>\n"; # #################################### # # ������ �������� �������� # # #################################### # # ################################## # # ����� �������� �������� # # ################################## # form: print "<form action=\"$ENV{'SCRIPT_NAME'}\">\n"; print "<input type=text name=filename>\n </form>\n"; print "</BODY>\n"; print "</HTML>\n"; exit(0); # ������ �������� ������ ���� ������� �� ���. # ��� ����� �������� �������. sub ReadParse($) { my $in=shift; my ($i, $key, $val); my $in_first; my @in_second; # ���������� ������ if ($ENV{'REQUEST_METHOD'} eq "GET") { $in_first = $ENV{'QUERY_STRING'}; } elsif ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN,$in_first,$ENV{'CONTENT_LENGTH'}); }else{ die "������: ����������� ����� �������\n"; } @in_second = split(/&/,$in_first); foreach $i (0 .. $#in_second) { # ������ ������ ��������� $in_second[$i] =~ s/\+/ /g; # ��������� �� ���� � �������� ($key, $val) = split(/=/,$in_second[$i],2); # ������� %XX �� ���������������� ����� � ������� $key =~ s/%(..)/pack("c",hex($1))/ge; $val =~ s/%(..)/pack("c",hex($1))/ge; # ������������� ����� � �������� # \0 - ����������� ���������� �������� $$in{$key} .= "\0" if (defined($$in{$key})); $$in{$key} .= $val; } return length($#in_second); }
��������� �� ����������, ���������� Perl (-wT
), ��������� �������.
�� �������� � ������� ���������� ��������� $ENV
� $PATH
� �������� HTML ��������� (��� ����� html ��������� ����� ��������� � ��������. �� �� ������
�� ������ �� ��������, ������������ � ��������). ������� ReadParse()
������ ���������, ���������� �������. ��� ����� ���� �� ����� ������� ��� ������ ������,
������ ��� �� �� ������� �� ���� ���. �����, �� ��������� ��� �������. � � ����� ���������
HTML ����.
��� Perl ��� ������� ���������, ��� �������, ��������, �� ������� C. ��� Perl ������� ������ ����� ������ - ��� ����� �� ������ ��� � ��� ���������. � ���?
������� ������� ��������� ��� � ��� ������, ����� ��������
showhtml.cgi
:
# showhtml.cgi my $filename= $input{filename}.".html"; print "<BODY>File : $filename<BR>"; if (-e $filename) { open(FILE,"$filename") || goto form; print <FILE>; }
������� ReadParse()
�������� ������ ���� ��������: ��� ����� ��� �����������.
����� �� ��������� ������ ������ �������� �� HTML ���������� "����������� �������",
�� ��������� ���������� ".html
" � ����� ����� �����. ������ �������, ���
������� ���� - ��� ����� �� ������, ��� � ��� ���������...
�������, ���� ��� ������ showhtml.cgi?filename=%2Fetc%2Fpasswd%00
, ����
����� ���������� my $filename = "/etc/passwd\0.html"
� ������ �����������
����� ���������� ���-��� �� ���������� HTML.
��� ���������? ������� strace
����������, ��� Perl ��������� ����:
/tmp >>cat >open.pl << EOF > #!/usr/bin/perl > open(FILE, "/etc/passwd\0.html"); > EOF /tmp >>chmod 0700 open.pl /tmp >>strace ./open.pl 2>&1 | grep open execve("./open.pl", ["./open.pl"], [/* 24 vars */]) = 0 ... open("./open.pl", O_RDONLY) = 3 read(3, "#!/usr/bin/perl\n\nopen(FILE, \"/et"..., 4096) = 51 open("/etc/passwd", O_RDONLY) = 3
��������� open()
, ���������� strace
, �������������
���������� ������, ����������� �� C. �� ����� ������, ��� ���������� .html
��������, ��� ��������� ��� ������� /etc/passwd.
��� �������� �������� ��� ������ ������ ����������� ���������, ������� ������� ��� ������� �����:
s/\0//g;
��� ������, ���������� ��� ������ ������. �� ���������� �������� ���� �� ������ ��������� /home/httpd/:
#pipe1.cgi my $filename= "/home/httpd/".$input{filename}; print "<BODY>File : $filename<BR>"; open(FILE,"$filename") || goto form; print <FILE>;
�� �������� � ����� �������! � ����� �������� �������.
������ ������������� ��� ��������:
pipe1.cgi?filename=..%2F..%2F..%2Fetc%2Fpasswd����� ������ �������� ����� �� ������, ����� �������� ������ � ������ �����. ������ ��� ���� ������ ����� ���������� �����������: ��������� ������� �� ������ ������. � Perl, �������
open(FILE, "/bin/ls")
���������
�������� ���� "/bin/ls
"... ������ open(FILE, "/bin/ls |")
��������� ��������� �������. ���������� ������ ������� ������ |
, ��������
��������� open()
.
������ �������� ��������� ��-�� ����, ��� �� ����������� ������������� �����,
��� ��������� ��� �� ������ ��������� ����� �������, �� � �������� �� ���������:
pipe1.cgi?filename=..%2F..%2F..%2Fbin%2Fcat%20%2fetc%2fpasswd%20|
���������� ���������� ����� �������.
�������� �� ������������� ����� ��� ��������, ���� ������ �������:
#pipe2.cgi my $filename= "/home/httpd/".$input{filename}; print "<BODY>File : $filename<BR>"; if (-e $filename) { open(FILE,"$filename") || goto form; print <FILE> } else { print "-e failed: no file\n"; }���������� ������ ������ �� ��������. �������� "
-e
" �� ��������, ��� ���
���������� ����� ���� "../../../bin/cat /etc/passwd |
".
��������� ������ ������� /bin/ls
. ��������� ������� ����� ��� ��. �� ����,
���� �� ���������� ������� ������ ������ � ��������� /etc
, "-e
"
�������� ������������� ����� "../../../bin/ls /etc |
", ������ ��
����� �� ����������. ��� ��� �� �� ����� ������ ��� ������� �����, �� �� ������ ��������
������ ����������� :(
������ ��-�������� ���� "����� �� ���������", ���� ���� ��� ��������� �� ��� �� �����.
���� /bin/ls
���������� (�� ����������� ������), ������, ����
open()
������� � ���� ������ �����, ������� �� ����� ���������, �
����� ������� �������� ���. ������� �� ������ ����� ������ ��������� �����
'|
' � ����� �����, �� ���, ����� �� �� ������������� ��� ��������
"-e
". �� ��� ����� ������� - ������� ����. ���� �� ������
"../../../bin/ls\0|
" � �������� �����, �������� �� ������������� �������
�������, ��� ��� ��� �������� ������ "../../../bin/ls
", ������
open()
����� ������ ����� � ������� �������� �������. �������,
URI, ������� ��� ���� ���������� ������� ���������� �����:
pipe2.cgi?filename=../../../bin/ls%00|
������ finger.cgi ��������� ���������� finger
�� ����� ������:
#finger.cgi print "<BODY>"; $login = $input{'login'}; $login =~ s/([;<>\*\|`&\$!#\(\)\[\]\{\}:'"])/\\$1/g; print "Login $login<BR>\n"; print "Finger<BR>\n"; $CMD= "/usr/bin/finger $login|"; open(FILE,"$CMD") || goto form; print <FILE>
���� ������ �� ������� ���� ������������� �������� ���� ����������������:
�� ���������, ����� �������� ������� �� ���� ���������������� ���������,
������� '\
' ����� ����. ����� �������, ����� � ������� ����������
�� "\;
" ��� ������ ����������� ���������. ������ ������ �� ��������
��� ���������� �������. ����� ��� ��� �������� ������ '\n
'.
� ��������� ������ ����� ������� �������� �� ������������� ����������, �������
������� ����
, ������� �������� ������ '\n
'. � Perl ��
������ ������ �� �� �����. �� ��� ������, ��� ���������� open()
���������
��� ��������� �������, ���� ������ ������������ �������� ������ '|
'.
����� ������������� ����� ���������, �� ������� ������� ������� � ���������� ����� �����, ������� ���������� ������� finger:
finger.cgi?login=kmaster%0Acat%20/etc/passwd
������ �������, ������� ��������� ��������� ��������� ���������� � ����� ������:
;
: ����� ��������� ������ ����������, ����������� ���������;
&&
: ���� ��������� ���������� ������ ����������
������� (�.�. ��� ���������� 0 ��������), �� ����������� ���������;
||
: ��� ��������� ���������� ������ ���������� (�.�.
��� ���������� ��������� �������� ��������), ����������� ���������.
���������� ������ finger.cgi
������� ��������, ������� ����� ���������� �
�������������� ��������� ��������. ����� �������, URI
finger.cgi?login=kmaster;cat%20/etc/passwd
�� ��������, ��� ��� ����� ������ � ������� �������� �������. ������, ���� ������
����� ������� �� ������������� - ������� '\
'.
������� � ������� ������, ������� �� ���� ��� ��������� �� ������ ��������� ��� ������
����������� ��������� s/\.\.//g
, ������� ������� "..
".
�� �����, ��� ���������! �������� ����� �������� � ����������� ������ ������� '/
' (�����
��������� ������ ���������� cat ///etc//////passwd
).
��������, � ������������� ������� pipe2.cgi
���������� $filename
���������������� ��� ������ �������� "/home/httpd/
". ������������� ����������� �����������
��������� ����� ���������� �����������, ����� �� ���� ����������� ��������� �� ����������� ������.
������� ��� ��������� ������� �� "..
", ������ ��� ����� ���� �� �������� ������� �����
�������� '.
'? ���������� ��������� �� ���������, ���� ��� ����� ����� .\./.\./etc/passwd
.
�������, ��� � ����� ������ ����� ��������� �������� ������� system()
(��� ` ... `
), ��
open()
� "-e
" ���������� ������.
�������� � ������� finger.cgi
. �����
finger.cgi?login=kmaster;cat%20/etc/passwd
� �������������� ����� � ������� �� ���� ���������� ����������,
��� ��� ����� � ������� ������ ���� �������� ����� ������ ����������� ���������. �� ���� ��������
�������� ����������:
/usr/bin/finger kmaster\;cat /etc/passwd� ����� ���-������� ���������� ��������� ������:
finger: kmaster;cat: no such user. finger: /etc/passwd: no such user.��������� ��������� ���, ��� ��������, ���� �� ������� ��� ������� � ��������� ������. �������� �������� � ���, ��� ������� ����� '
;
' ���������� ������������� ���� ������ ��� �����
������ "kmaster;cat
".
�� �� ����� ��������� ��� ����������: ���� ��� �������, � ������ ��� ������ �������������.
��� ����� �� ������ ������� ��������� ������� ����� ';
':
<A
HREF="finger.cgi?login=kmaster\;cat%20/etc/passwd">
finger.cgi?login=kmaster\;cat%20/etc/passwd</A>
.
������ "\;
" ���������� �������� �� "\\;
", � ����� ����������
��������. �������� �������� ������� :
/usr/bin/finger kmaster\\;cat /etc/passwd� ��������� �� �� ��� ����������:
/usr/bin/finger kmaster\
, ������� ��������� ����� ������ �� ����... �� ���
��� � �� ����� :-)
cat /etc/passwd
- ��� ������� ��� ���� � ��������. \
'.
������ �������� "��������" �� �������������� ������������� ��� ������ �������.
�� ������� ������ finger.cgi
���, ����� �������� ����� ��������
���������� $login
.
������, ���� � ������� ����� ��������� �� �������� ��������, ���� ����� �� ���� ������. ���� �������, ����������� �� ������ �������, �������� ��� ����. ��� ���������, ������ ��� ������ ������� �� ������� ������� ����������� ������� �� �������. �����, �� ������ ������� �������, � ������ ������� �� ������� ������� ������, ������� ������� ������ ������� �� �������.
������ finger2.cgi ������������ ���:
#finger2.cgi print "<BODY>"; $login = $input{'login'}; $login =~ s/\0//g; $login =~ s/([<>\*\|`&\$!#\(\)\[\]\{\}:'\n])/\\$1/g; print "Login $login<BR>\n"; print "Finger<BR>\n"; #����� (��)����������� �����-������: $CMD= "/usr/bin/finger \"$login\"|"; open(FILE,"$CMD") || goto form; while(<FILE>) { print; }
URI ��� ���������� �����:
finger2.cgi?login=kmaster%22%3Bcat%20%2Fetc%2Fpasswd%3B%22�������� ������� �������
/usr/bin/finger "$login";cat /etc/passwd;""
, ������� �� �������� ��� ������� �������.
������� �����, ���� �� ������ ����������� ��������� ��� ������ �������, ������� �������� ����� ����, ����� ��� � ����� ������ � ������� � ���������, ��� �� ��������� �����.
������������ �� Perl, ����������� ����� w
��� "use
warnings;
" (Perl 5.6.0 ��� �����), ��� ����������� ��� � ������������� ���������, �����
��� �������������������� ���������� � ���������� ���������/�������.
����� T
(taint mode) ������������� ����� ������� ������� ������������.
���� ����� ���������� ��������� ��������. ����� ������ �������� ����������
����������� (tainting) ����������. ���������� ����� ���� ���� ������, ����
�������. ������ ����������� ����� ��������� ��������� �������� �� ��� ���, ���� ��� �� �����
�������. ������� ���������� �� ����� ���� ������������ ��� �������� ��������, ������� ����� �������������� ��
��������� ��������� (����� ������ ��������).
� ������ ������ ��������� ��������� ������, ���������� ���������, ���������� ���������
��������� ������� (readdir()
, readlink()
,
readdir()
, ...) � ������ ���������� �� ������ ��������� ���������������,
� �������, ��������.
����� �������� ���������� �� ������ ���������� �� ���������� ����������.
��������, ��� ������������� .*
�� ���� ����������. ���� ������ ������� -
��������� ��� ���������� � ��������������� ����������. ������ ������������ ���������� ���������
��� ����� ���� �� ���������.
��� �� ����� ���� ����� �� ���������� ��� �� ���� �������: �������������� ����������,
��������� system()
��� exec()
����� ����������-������, �� �����������.
������� �� ������ ���� ����� ���������, ���� ���� �� ����� �������� ����������
��� �������. ���������� exec "sh", '-c', $arg;
���������
���������� ��� ����������� �� ���� ������� ��� ��� ���������� $arg
:(
����� ������������� ��������� "use strict;" � ������ ����� ���������. ��� ��������
��� ��������� ����������; ��������� ���� ������� ��� �����������, ������
��� �����������, ���� �� ����������� mod-perl
.
����� ������� CGI ������ �� Perl ������ ���������� �:
#!/usr/bin/perl -wT use strict; use CGI;��� �� Perl 5.6.0 :
#!/usr/bin/perl -T use warnings; use strict; use CGI;
open()
����� ������������� ��������� ���� ������ ��������� open(FILE,"$filename") ||
...
. �� ��� ������ ��������� ������ ����. ����� �������� ����, ����������
����� ��������:
open(FILE,"<$filename") || ...
������ ��� ������;
open(FILE,">$filename") || ...
������ ��� ������
����� �������� � ����� ������������� ��������� ��� �������������. ��� �� ������� �� �������, ��������� � �������� ���������, �������� � ���������� ������, ������ ������� ������� ����� ������ � �����������.
if ( -e $filename ) { ... }
������� � Perl 5.6 �������� ����� ��������� ��� open()
:
open(�������� ����������,�����,������)
. � ������� '<' ����
����������� ��� ������, � '>' - ���� ��������� ��� ��������� �� �������������, �
����� ����������� ��� ������. ���������� ����� ���������� ������ ��� ������� �
������� ����������. ���� ����� ������ ��� '|-' ��� '-|', �������� ������ ����������������
��� �������, ������� ����������� ����� ��� �� ������� ������ ��������������.
�� Perl 5.6 � ��������������� ������� open()
��������� ���� ������������
������� sysopen()
.
���� ��� ������: ���� �� ���������� ��� ������ ����������� ��������� ����������� �������, ���� �� ���� ����������� ���������� �������. ��������� �� �������� ������ ���� ��� �������, ��� ����� ����� ������ ������������� ������������ ������� �������, ������� ������ ����� ����������������.
�� �������� ��� ��� ���� �������: ��-������ ���������, ��� ������ �������� ������ ���������� �������. ����� ��������� �������� ����� ����������� ���������, ������� �������� ��������.
#!/usr/bin/perl -wT # filtre.pl # ���������� $safe � $danger �������� �������, ������� # �� ������������ � ������������ ���������, ��������������. # �������� ��� ������� �� ��� �������, ����� �������� ������ �������. # ������ � $input ��������� �������, ������ ���� ��� ������� ���������� # ����� ����������. use strict; my $input = shift; my $safe = '\w\d'; my $danger = '&`\'\\|"*?~<>^(){}\$\n\r\[\]'; #���������: # '/', ������ � ������ ��������� ���������� �� �������� � ������ if ($input =~ m/^[$safe$danger]+$/g) { $input =~ s/([$danger]+)/\\$1/g; } else { die "������������ ������� � $input\n"; } print "input = [$input]\n";
������ ���������� ��� ��������� ��������:
$safe
�������� ��, ������� �� ������������ ��������� (����� ������ ����� � �����);
$danger
�������� �������, ������� ���������, �� ������������ ������.
�� ���� ��������� ����������, ������ � ������, ��� ������� ����� ������ �� PHP, ���
�� Perl. ������, ��� ��������� �������������, � �����������, ����� ��� ������������
������ ������� �� PHP, � �� �� Perl. ���� ���-���� ����� �� PHP, �� �������� � ������������,
�� ����� ��� �� ������, ��� ���� �� �� ����� �� Perl, ��� ������ � ����������� PHP?
���� � ��� ���� �����-���� �������� � ���������������� �� PHP, �� ������ �������� ����������
����� (safe_mode=on
) ��� ��������� ������� (disable_functions=...
).
���������� ����� ��������� ������ � ������, �� ������������� ������������, ��������� ��������
���������� ��������� ����� ���������� �����������, ��������� ������� � �.�.
�� ��������� Apache ��������� ��� � ���������, ��� ������������ PHP.
$ telnet localhost 80 Trying 127.0.0.1... Connected to localhost.localdomain. Escape character is '^]'. HEAD / HTTP/1.0 HTTP/1.1 200 OK Date: Tue, 03 Apr 2001 11:22:41 GMT Server: Apache/1.3.14 (Unix) (Red-Hat/Linux) mod_ssl/2.7.1 OpenSSL/0.9.5a PHP/4.0.4pl1 mod_perl/1.24 Connection: close Content-Type: text/html Connection closed by foreign host.�������
expose_PHP = Off
� /etc/php.ini
����� ������
��� ����������: Server: Apache/1.3.14 (Unix) (Red-Hat/Linux) mod_ssl/2.7.1 OpenSSL/0.9.5a mod_perl/1.24
� ������ /etc/php.ini
(PHP4) � /etc/httpd/php3.ini
���� ����� ����������, ������� ����� ������ �������� �������. ��������, �����
"magic_quotes_gpc
" ��������� �������� ����� ��������� � ���������� �������
��������� � ����������, ���������� ����� ������ GET
, POST
� �� cookie; ��� ������ ��������� �������, ������� �� ������ � ����� �������� �� Perl.
�������� ��� ������ ����� ������� ��� ��������� ����� ��������� ������ �� ����� �����.
��� ���������� ����������, ������� ������������ ������ ���� � ����. ���� ����� ������, �����
���������� �� ������ ���������������� (��������, ������, ���������� ������, � ���������� ������
��� ���� From:
����� ��������, ������������� �������� �������� ��� ��������).
�������� ����� �����. ��� ������ ������ �������� �� ���-�����, ����� �������, ��� �������
���� ������� ��������� ������������ ��� � ����������������� �����.
��� ������ ��������� ���� ������ � ���������� ����������������. �� ��������, ��� ������� ��� ������ �������� ���� � ������������, ������� �������������� �� ������ �����������, � ������� �� ������ ��������� �� �������� �������� ������������ ��� �������������� � ���������������� ������ ����������. ���������� ������������ ����� ������������ ��-�� ������������ ����� ���������� ���������� (���������� �������������, ������������� � ������� ����, ��������� ������ � �.�.). ��� �� ����� ������, ������� ������������� ������ ��� ����� ������������� ����������, ����� ����� ������� ��� ����� ���������� ����������, � ������ ��������� ������������ ����� ������� ����� ��������������.
URI ��� (ISO 8859-1) | ������ |
%00 | \0 (����� ������) |
%0a | \n (������� �������) |
%20 | ������ |
%21 | ! |
%22 | " |
%23 | # |
%26 | & (���������) |
%2f | / |
%3b | ; |
%3c | < |
%3e | > |
man perlsec
: �������� man ����� Perl � ������������;
#!/usr/bin/perl -w # guestbook.cgi BEGIN { $ENV{PATH} = '/usr/bin:/bin' } delete @ENV{qw(IFS CDPATH ENV BASH_ENV)}; # ������� %ENV ���������� =:-) print "Content-type: text/html\n\n"; print "<HTML>\n<HEAD><TITLE>������� �������� �����</TITLE></HEAD>\n"; &ReadParse(\%input); my $email= $input{email}; my $texte= $input{texte}; $texte =~ s/\n/<BR>/g; print "<BODY><A HREF=\"guestbook.html\"> �������� ����� </A><BR><form action=\"$ENV{'SCRIPT_NAME'}\">\n Email: <input type=text name=email><BR>\n �����:<BR>\n<textarea name=\"texte\" rows=15 cols=70> </textarea><BR><input type=submit value=\"������!\"> </form>\n"; print "</BODY>\n"; print "</HTML>"; open (FILE,">>guestbook.html") || die ("�� ���� ��������\n"); print FILE "Email: $email<BR>\n"; print FILE "�����: $texte<BR>\n"; print FILE "<HR>\n"; close(FILE); exit(0); sub ReadParse { my $in =shift; my ($i, $key, $val); my $in_first; my @in_second; # ������ ������ if ($ENV{'REQUEST_METHOD'} eq "GET") { $in_first = $ENV{'QUERY_STRING'}; } elsif ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN,$in_first,$ENV{'CONTENT_LENGTH'}); }else{ die "������: ����������� ����� �������\n"; } @in_second = split(/&/,$in_first); foreach $i (0 .. $#in_second) { # �������� ����� �� ������� $in_second[$i] =~ s/\+/ /g; # ��������� �� ���� � �������� ($key, $val) = split(/=/,$in_second[$i],2); # ���������������� %XX �� ���������������� ����� � ������� $key =~ s/%(..)/pack("c",hex($1))/ge; $val =~ s/%(..)/pack("c",hex($1))/ge; # ����������� ���� � �������� $$in{$key} .= "\0" if (defined($$in{$key})); $$in{$key} .= $val; } return length($#in_second); }
|
Webpages maintained by the LinuxFocus Editor team
© Fr�d�ric Raynal, Christophe Blaess, Christophe Grenier, FDL LinuxFocus.org |
Translation information:
|
2002-09-26, generated by lfparser version 2.31