CGI的全称是Common Gateway Interface,即通用网关接口,是外部程序和HTTP服务器进行信息交互的一种标准,当前的版本是CGI/1.1。由于它是实时执行的,所以它返回的信息也是动态的,它也是当前网络上应用最广的Web应用,它既可以使用C,Pascal等编译型语言,也可以使用Perl,PHP等解释型语言来。
CGI是可执行的,也就是说是让别人在你的服务器上运行程序的,这当然不是很安全的。所以在使用CGI之前要做充分的安全准备工作。首先它们必须处于特定的目录(一般情况是/cgi-bin/),以便于服务器去执行它们而不是简单的返回给浏览器。这个目录应该直接置于管理员管理之下,用户编写的程序必须由管理员来设定。
编译过的程序一般比解释执行的程序有更高的安全性,首先用户不可能取得你的源程序,尽管一个正确配置的服务器是不会返回源程序,但是泄漏源程序的可能总是存在的,一旦你的源程序被Hacker们所熟知,那么就越容易被人攻破。(例如,你用一个编辑器修改了程序,那么这个编辑器会留下一个备份,此时用户就可以通过http://server/*.cgi~来得到你的源程序),当然,在网上可以找到很多CGI的C的源程序,即便是编译过的程序也不一定是百分之百保险的。使用编译过的程序另外一个好处是,无论是PERL或者PHP或者别的解释器它们都是包含着很多Bug的,这些Bug无论我们知道或者不知道,它们都在那里。第三个好处就是解释性语言都是调用系统命令并返回值的,这样很容易给不怀好意者输入特定的字符串来攻击你的系统。但在C程序中,要想通过发送特定字符串来执行Shell命令几乎是不可能的。当然在C程序也存在着很多由于设计者原因所造成的可以被攻击的地点。新版本的解释器也往往修正了很多Bug,并提供了很多捕捉安全漏洞的工具。 不要轻易使用从网上得到的Script,越复杂的程序中包含的漏洞可能性越大;其次确认这个程序是否读写本机的文件,如果读写的话可能会给服务器的文件带来不可预测的损失;再次查看是否使用了本机的程序,若是的话容易被人利用来搞破坏;再看是否以suid权限运行,这对系统是非常危险的;最后看程序是否检测用户的输入,检测输入是保证系统安全的一个必备的步骤。
如果在开发工程中,那么绝对不要让别人知道你的主机,如上所述,此时程序最有可能泄漏出去(尽管不一定是最新的);其次一定不能假设用户输入了多少内容,如下面一个例子: #include static char query_string[1024]; char* read_POST() { int query_size; query_size=atoi(getenv(\"CONTENT_LENGTH\")); fread(query_string,query_size,1,stdin); return query_string; } 如果用户输入的内容超过了1024个字节,内存越界一般会造成程序异常中止,在某种情况下可以使Hacker从远程运行本机的程序,这也是攻击的常用手段,应该动态的分配内存。跟溢出有关的是,绝对不要使用strcpy类的函数, 这类函数直接拷贝知道碰到NULL,而应该用strncpy类的函数,确定不会发生越界错误。最重要的一点是,千万不能在不检查用户输入的情况下直接把它传递给系统程序。尤其在攻击中,最常用的是包含&;`'\\\"|*?~<>^()[]{}$\\n\\r这些特殊字符,一定要滤掉这些字符。 在CGI中,永远不要用相对路径来执行程序,例如system(\"ls -l /local/web/foo\"),应该改为system(\"/bin/ls -l /local/web/foo\");如果必须使用相对路径,那么在执行前应该就该环境变量,如putenv(\"PATH=/bin:/usr/bin:/usr/local/bin\")。 使用接口来调用CGI有利有弊,用户只有通过接口才能调用CGI,由于以往Server执行CGI时是以Server的User ID(“nobody”)运行的,这样管理员很难定位错误,而通过接口CGI只能以某个用户的ID来运行,这样不至于对系统造成致命的破坏,事情是相对的,由于CGI有某个用户的ID,那么就可以通过这个程序来删除该用户的文件或者给该用户设置木马。 不要迷信限制某些IP或者用户才能使用CGI能够解决问题,因为你不能够控制这个CGI程序怎么被调用。因为一个CGI程序可以被任意的表单调用,或者干脆直接输入URL,永远不要假设程序只被你写的表单调用,在执行之前一定要检查参数。 用户不能修改隐藏域中的值,这个看法也是错误的,当HTML文件传到客户端的时候,用户可以简单的修改它,然后把他们想要的数据发送给你,所以信任隐藏域。 使用Post方法可以更安全?当然,Post数据不会出现在URL中,但是从安全角度来讲,他们的安全系数都是一样的,监听Post消息和Get消息是一样容易的。 不要使用Cookie来存放重要的信息,如密码等,尽管可以对Cookir进行加密,但是对于冒名顶替者来说,他们本身并不关心这些,只要能够假冒别人的ID就有可能对网站造成致命的破坏。 因篇幅问题不能全部显示,请点此查看更多更全内容