荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: bkbll (战歌), 信区: Security
标  题: 一个CGI脚本漏洞的分析
发信站: 荔园晨风BBS站 (Sat Oct 20 21:00:46 2001), 站内信件

一个CGI脚本漏洞的分析
bkbll(bkbll@cnhonker.net).http://www.cnhonker.net
下午出去运动了一下,回来lion告诉我邮件列表里有一个新的CGI hole,呵呵.让我试一下
.那我就看一看了,得到一个URL :             http://xxxx/cgi-bin/webcart/webcar
t.cgi?CONFIG=mountain&CHANGE=YES&NEXTPAGE=;ls|&CODE=PHOLD在NEXTPAGE那里,可以
执行任意命令J.呵呵.比较严重吧.既然有这个漏洞,那么我来分析一下.ok,先得到源程序
:
http://xxxx/cgi-bin/webcart/webcart.cgi?CONFIG=mountain&CHANGE=YES&NEXTPAGE=
;cat%20webcart.cgi|&CODE=PHOLD
webcart.cgi的源代码就出来了.我把关键的地方列出来:
既然是问题出在NEXTPAGE这个name上,那么我重点考察一下NEXTPAGE的value处理:
程序中先用&FormInput(*input)函数将浏览器传送过来的值赋给一个hash数组input.那
么我们来查询一下用到$input{'NEXTPAGE'}的地方.(至于为什么是$input,呵呵写个CGI
的人一下字就能看出来).查找一下,然后发现程序里面有如下语句:
&PrintNextPage($DEBUG,"$DIR",$input{'NEXTPAGE'},$input{'CODE'});
ok,既然问题出在PrintNextPage函数,那么我们就重点考察它:
sub PrintNextPage
{
local($debug,$directory,$page,$code) = @_;
#这里$page就是NEXTPAGE的值了.
$code =~ s/\012//g;
$code =~ s/\015//g;
…………………………………….
……………………………………..
        else
                {
                $dir = "$directory";
                }
        }
#问题出在这里了.呵呵.
open(BODY,"$dir/$page");<-这里是问题的所在
while (<BODY>)
        {
        if($_ =~ /\[price\]/)
                {
                $PROCESS_CONTROL=1;
……………………………………….
让我们来看看phrack杂志55期的<< PERL CGI Problems>>一文关于cgi中|符号在open函
数中问题的描述:
In Perl appending a '|' (pipe) onto the end of a filename in a open statemen
t
causes Perl to run the file specified, rather than open it.  So,
        open(FILE, "/bin/ls")
will get you a lot of binary code, but
        open(FILE, "/bin/ls|")
will actually run /bin/ls.
大意就是说在open中,如果在文件末尾加上一个|符号,则perl会尝试调用系统中的shell
(一般是/bin/sh)来执行该文件(加了<和>符号的除外).
Ps:该文章关于CGI的安全问题写的很详细,建议对CGI比较关心的朋友能去看看J
在open(BODY,"$dir/$page")中,并没有对$dir/$page进行指定是读取的动作,这样当我们
让$page的值最后面带一个|的话,就会去执行前面的命令,但是前面有一个$dir/在限制怎
么办呢?
既然是调用/bin/sh去执行,那么我们用一个;符号来让sh真正执行我们的程序J.假设我们

$dir="test";
$page=";ls|".
那么调用open的时候就是:
open(BODY,"test/;ls|");
实际在shell中就是:/bin/sh test/;ls
呵呵.这样不就执行了ls么?
解决办法其实也挺简单,把open(BODY,"$dir/$page")修改成:open(BODY,"<$dir/$page"
)就不会引起上述的问题了.
后记:其实这篇文章写的也很无聊,只是想让CGI程序员的朋友们注意一下open的时候注意
下别让人家有漏子可钻就是了.分析别人发现的漏洞是一件很无奈的事情.可以叫做"拾人
牙慧"吧.所以自己还是要多学习,多注意一下吧.

--
※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 202.96.134.135]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店