信息来源:黑色海岸线初学者进阶文库
前言:关于cgi程序的安全问题,历来都是网络编程的一个关键。也是黑客们入侵某个网站最常用的方法,所以无论从攻还是防都有很多的资料可供参考,我在这里通过对一个cgi留言板的简单测试,提供一种思考问题的思路,供新手朋友们参考。
最近自己有了一个自己的空间,所以做个简单的主页放上去,为了便于和大家交互,就想到留言板,但是自己没有编写cgi程序的经验,看到未名的免费代码,就借用了。稍微改改放到空间上就能用了,还挺不错的。但是作为一个对perl和网络安全感兴趣的我,来说很自然就对它的安全性产生担忧。于是请几个朋友作了一些测试,发现了一些问题,比如未限制输入大小,存在跨站脚本攻击等。如果说这些都不是很严重的问题的话,那么我下面的测试可能就不能置之不理了。
我们先来看看它的提交过程,通过一些简单的判断,就可以提交我们的留言了,然后把留言生成为一个cgi文件,在留言板里显示它的内容。问题就出在这里了。比如限制留言大小,跨站脚本攻击等,但是我们可以这样想既然生成的是cgi文件那么我们是否可以构造一些特殊的内容,让perl来解释呢?ok,试一下先
在留言里写上如下代码:
图(一)
以上代码是显示环境变量的。提交之后在ie里执行它:
http://xxxx.com/cgi-bin/xxx/xxx.cgi
看看提示如图:
图(二)
好像是没有成功之意哦。就是说留言的内容还是有被过滤或者改变的。那么还是打开xxx.cgi看看吧:
#usr/bin/perl<br>print<<"EOF";<br>Content-type:text/html\n\n;<br><html><title>huangjingbianliang</title><body><br>EOF<br>foreach(keys %ENV){<br>print "bianliang $_ wei:$ENV<br>";<br>}<br>print "</body></html>";
原来换行变成了<br>,”<”,”>”都被替换了,同时所有内容被写在一行上,所以执行错误。
我们来分析一下,以上的东东,说明你要让它成功执行的话,代码只能一行!而且不能被过滤,因为我对cgi编程也不熟悉,所以当时乱试了一些,都没有成功的。但是突然想起perl程序有一个规定,在类unix系统里#!usr/bin/perl才是用来关联解释程序的。但是windows下它根本没有意义,被当作是解释的内容!很多程序员在编程的时候都把它忘了!于是关键的突破点就在这里,因为空间的服务器是2000系统的,所以值得一试!在留言里写上:
print “hello\n”;
注:原本应该是:#!usr/bin/perl
print “hello \n”;
提交后,快看看他的结果吧!
图(三)
哇赛!看到hello了吗?说明它被成功执行了!~接下来好像大家都知道怎么做了。我们来试试调用系统命令!留言的内容为:
图(四) 提交
打开cgi看看结果:
图(五)
好像现在的问题已经很严重了。如果perl是以系统权限运行的话,那么入侵已经实现了,如果仅仅是空间用户的权限的话,那么可以查看系统上的很多信息,好像服务器已经暴露了。测试到此算是告一段落。
现在我们回头来思考一下,关键的问题在于,留言的过滤不严,和对应的服务器系统类型。因为perl语言的强大功能,程序员总是很容易忽略一些东西,于是产生不良的后果,事实上刚才的问题只要在留言内容的前面加上一些东东,就可以避免代码的执行,当然做好过滤才是解决之道。事实上不仅仅未名留言板存在这个问题,还有一些免费的cgi留言板也同样存在类似的问题。甚至有些perl cgi的论坛也存在着这方面的问题!如果在windows系统上安装的话,很容易被人利用!!所以提醒大家在windows系统上使用cgi程序时,注意一下。当然利用它来攻击的话,首先你要知道留言产生的cgi路径和名字。同时在留言板上会留下你的测试代码。后话:cgi程序很容易产生安全问题,其实很多时候,懂得如何去发现,也是一种能力。正如大家都知道的那样,安全问题永无止境。有兴趣的朋友欢迎来我的主页交流
www.chinaperl.org/perlfans/ocean/