網鼎杯2020線下半決賽兩道WEB題WriteUp
網鼎杯2020線下半決賽兩道WEB題WriteUp
第一次參與網鼎杯線下賽,五道題3道PWN、兩道WEB(PHP),下午又加了一道web(nodejs)。
先說下賽制,網鼎杯賽制叫做AWD PLUS,應該是全國唯一采用這個賽制的比賽。名字叫做AWD,實際這個賽制隊伍之間不需要也不允許相互打。每個隊伍每個題目有一個GameBox,提供下載源代碼包,攻擊和修復代碼漏洞就可以得分。與一般AWD不同的是,網鼎杯賽制不需要准備不死馬/通防腳本等,更加偏重於代碼審計、漏洞挖掘、漏洞利用和修復。(也許叫CTF PLUS 或者 AWD STATIC 更合適?)
兩道web題write_up
WEB1 web_AliceWebsite
打開主頁,容易看到上面有個文件包含。
查看源碼,看到
<?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
修復加固:
1、正則過濾掉../ ./
2、配置php.ini文件
關閉遠程文件包含功能(allow_url_include = Off allow_url_fopen = Off)
2、 設置文件白名單。
4、 建議假定所有輸入都是可疑的,嘗試對所有輸入提交可能可能包含的文件地址,包括服務器本地文件及遠程文件,進行嚴格的檢查,參數中不允許出現../之類的目錄跳轉符。
// 驗證郵箱格式 function checkEmail($email) { if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/", $email)) { return false; } else { return true; } }
WEB2 FAKA
先部署代碼到本地,並導入sql文件。代碼目錄
根目錄robots.txt 里提示1.txt,1.txt里面是注冊邀請碼,根據提示注冊,是一般用戶,略微審計了下 /application/merchat/ 目錄,沒啥用。
后台頁面在/application/admin目錄下,使用的表叫做 system_user
打開system_user表,第一行為賬戶名為admin,密碼為md5的用戶。賽前准備了TOP10W密碼的哈希值,搜索了下這個哈希值沒有搜到。看來需要修改密碼或者新增一個用戶。
繼續審代碼,application/admin/index.php 文件下有兩個方法:
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