【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漏洞。尝试利用没有成功,有同窗利用成功的吗?安全

下载网鼎杯网络安全夺旗赛 题目源码

相关文章
相关标签/搜索