【WriteUp】網鼎杯2020線下半決賽兩道WEB

網鼎杯2020線下半決賽兩道WEB題WriteUpphp

網鼎杯2020線下半決賽兩道WEB題WriteUp

第一次參與網鼎杯線下賽,五道題3道PWN、兩道WEB(PHP),下午又加了一道web(nodejs)。
先說下賽制,網鼎盃賽制叫作AWD PLUS,應該是全國惟一採用這個賽制的比賽。名字叫作AWD,實際這個賽制隊伍之間不須要也不容許相互打。每一個隊伍每一個題目有一個GameBox,提供下載源代碼包,攻擊和修復代碼漏洞就能夠得分。與通常AWD不一樣的是,網鼎盃賽制不須要準備不死馬/通防腳本等,更加偏重於代碼審計、漏洞挖掘、漏洞利用和修復。(也許叫CTF PLUS 或者 AWD STATIC 更合適?)
兩道web題write_up

html

WEB1 web_AliceWebsite

在這裏插入圖片描述

打開主頁,容易看到上面有個文件包含。
查看源碼,看到
node

<?php
        $action = (isset($_GET['action']) ? $_GET['action'] : 'home.php');
        if (file_exists($action)) { 
            include $action;
        } else { 
            echo "File not found!";
        }
?>

沒有任何過濾, include /flag 拿到flag;
payload
?action=/flag

web

WEB2 FAKA

先部署代碼到本地,並導入sql文件。代碼目錄
代碼目錄
根目錄robots.txt 裏提示1.txt,1.txt裏面是註冊邀請碼,根據提示註冊,是通常用戶,略微審計了下 /application/merchat/ 目錄,沒啥用。
後臺頁面在/application/admin目錄下,使用的表叫作 system_user
數據庫
打開system_user表,第一行爲帳戶名爲admin,密碼爲md5的用戶。賽前準備了TOP10W密碼的哈希值,搜索了下這個哈希值沒有搜到。看來須要修改密碼或者新增一個用戶。
system_user表





sql

繼續審代碼,application/admin/index.php 文件下有兩個方法:docker

public function pass()
    { 
        if (intval($this->request->request('id')) !== intval(session('user.id'))) { 
            $this->error('只能修改當前用戶的密碼!');
        }
        if ($this->request->isGet()) { 
            $this->assign('verify', true);
            return $this->_form('SystemUser', 'user/pass');
        }
        $data = $this->request->post();
        if ($data['password'] !== $data['repassword']) { 
            $this->error('兩次輸入的密碼不一致,請從新輸入!');
        }
        $user = Db::name('SystemUser')->where('id', session('user.id'))->find();
        if (md5($data['oldpassword']) !== $user['password']) { 
            $this->error('舊密碼驗證失敗,請從新輸入!');
        }
        if (DataService::save('SystemUser', ['id' => session('user.id'), 'password' => md5($data['password'])])) { 
            $this->success('密碼修改爲功,下次請使用新密碼登陸!', '');
        }
        $this->error('密碼修改失敗,請稍候再試!');
    }

    /** * 修改資料 */
    public function info()
    { 
        if (intval($this->request->request('id')) === intval(session('user.id'))) { 
            return $this->_form('SystemUser', 'user/form');
        }
        $this->error('只能修改當前用戶的資料!');
    }

嘗試了下,兩個路徑均可以直接訪問。第一個方法是修改用戶密碼,能夠看到代碼中驗證比較多,沒有什麼能夠利用點;info這個方法直接調用父類的方法,沒有什麼比對驗證,也許能夠利用?
index/info
根據提示保存數據,數據庫果真新增了一條用戶,並在後臺頁面登陸成功。
後臺頁面
功能比較少,點擊內容管理時,提示沒有權限,接下來須要越權。
審計了一圈下來,用戶信息都存在session當中,沒辦法直接在頁面交互中改權限。
比對數據庫發現,本身註冊的用戶和admin用戶的authorize值不同。
user表
並且本身新增的用戶authorize值爲null。能不能在剛纔修改用戶的資料裏這個頁面直接改?
burp
在burp里加入authorize=3,超級用戶添加成功
user表










thinkphp

成功登陸
成功登陸。
接下來繼續找能夠利用的點。
在代碼中能夠找到upload, upfile 等方法,在本地測試中,http://localhost/index.php/admin/plugs/upfile 這個路徑能夠上傳文件,並且,超級用戶能夠修改白名單,容許phtml這樣的後綴。
修改白名單
上傳成功後的路徑結構




shell

可是!在比賽方的服務器根本上傳不了,提示mkdir() permission refuse。 可是比賽平臺頁面提示中明確寫着/var/www/html/static目錄可寫!本着出題方通常不會出錯的想法,嘗試修改上傳路徑直接到/static路徑下(路徑根據token生成,token可控, …/…/…/往上穿便可)。這一次不提示permission 了, 直接提示 file exits 。 暈。可能比賽方擔憂選手搞壞docker影響服務器,不但願選手上傳shell吧。
好吧,閒話很少說。繼續找漏洞。搜索 file_ 一個一個試,此處略過。
最後在application/manage/Backup.php中找到利用點
備份文件下載
沒有任何檢查,任意文件讀。最終payload:
http://localhost/index.php/manage/backup/downloadBak?file=…/…/…/…/flag




數據庫

小問題

這個源碼是基於thinkphp 5.0.14的,衆所周知這個版本有個RCE漏洞。嘗試利用沒有成功,有同窗利用成功的嗎?安全

下載網鼎杯網絡安全奪旗賽 題目源碼

相關文章
相關標籤/搜索