2019巅峰极客CTF-web1(LOL英雄联盟)
今晚有空 以后随缘写博客了 好好沉淀
web1当天做出的队伍很少 其实不难 折腾到最后就差一步 可惜
0x01 读取文件
截图没留了 只留了代码部分。
有个页面 有上传和下载功能
起初以为是上传漏洞 发现上传后都会在后面加.jpg
且phpsessionid为文件名和目录
上传绕了很久 再看的时候是看下载功能 发现有文件读取。
可以进行目录穿越读取 通过文件中的包含信息顺腾摸瓜把文件类读取出来:
func.php:
然后根据这里auto_class读取其他类文件。
0x02 分析文件
逻辑顺序来读一遍。分析利用的点
先是定义类的index:
<?php
defined('DS') or define('DS', DIRECTORY_SEPARATOR);
define('APP_DIR', realpath('./'));
define('Cache_DIR',APP_DIR.DS.'user');
define('View_DIR',APP_DIR.DS.'app'.DS.'view');
define('Core_DIR',APP_DIR.DS.'core');
define('Image_DIR',APP_DIR.DS.'upload');
include(Core_DIR.DS.'core.php');
然后是核心core文件:
<?php if(!defined('Core_DIR')){
exit();
} include(Core_DIR.DS.'config.php');
include(Core_DIR.DS.'func.php'); _if_debug($config['debug']);
spl_autoload_register('autoload_class');
config($config['ini']); // 'session.name' => 'PHPSESSID',
// 'session.serialize_handler' => 'php' session_start();
define('Upload_DIR',Image_DIR.DS.session_id());
init(); $app = new IndexController(); if(method_exists($app, $app->data['method'])){
$app->{$app->data['method']}($app->data['param']);
}else{
$app->index();
} #$this->method($_POST)
先是包含了两个文件func和inc
然后spl_autoload_register('autoload_class');加载类文件 接着开启session 定义上传文件的路径 下面就是new 了一个 IndexController();对象
看看这个对象的IndexController类文件:
(比赛的时候自己做了点注释)
不难看出 在post方法中会实体一个FILEs类 这是题目自己定义的文件类 接着进行Cache类的实体化
FILE类:
Cache类:
File类对上传的文件进行控制处理,目录写死了的 $data虽然在IndexController类可控 意义不大 重点看Cache类:
<?php
class Cache{
public $data;
public $sj;
public $path;
public $html;
function __construct($data){
$this->data['name']=isset($data['post']['name'])?$data['post']['name']:'';
$this->data['message']=isset($data['post']['message'])?$data['post']['message']:'';
$this->data['image']=!empty($data['image'])?$data['image']:'/static/images/pic04.jpg';
$this->path=Cache_DIR.DS.session_id().'.php';
} function __destruct(){
$this->html=sprintf('<!DOCTYPE HTML><html><head><title>LOL</title><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" /><link rel="stylesheet" href="/static/css/main.css" /><noscript><link rel="stylesheet" href="/static/css/noscript.css" /></noscript> </head> <body class="is-preload"><div id="wrapper"><header id="header"> <div class="logo"><span class="icon fa-diamond"></span> </div> <div class="content"><div class="inner"> <h1>Hero of you</h1></div> </div> <nav><ul> <li><a href="#you">YOU</a></li></ul> </nav></header><div id="main"><article id="you"> <h2 class="major" ng-app>%s</h2> <span class="image main"><img src="%s" alt="" /></span> <p>%s</p><button type="button" onclick=location.href="/download/%s">下载</button></article></div><footer id="footer"></footer></div><script src="/static/js/jquery.min.js"></script><script src="/static/js/browser.min.js"></script><script src="/static/js/breakpoints.min.js"></script><script src="/static/js/util.js"></script><script src="/static/js/main.js"></script><script src="/static/js/angular.js"></script> </body></html>',
substr($this->data['name'],0,62),$this->data['image'],$this->data['message'],session_id().'.jpg'); if(file_put_contents($this->path,$this->html)){
include($this->path);
}
}
}
发现此类的析构函数中对前端输出同时 用一些变量写入了文件 并且在后面进行写文件和包含
这里就考察了php反序列化的内容 一个经典的引擎解析不同导致反序列化 + session.upload_progress进行文件包含
upload_progress这个以前没遇到过~ 卑微
关于解析引擎不同的反序列化这里只简单提一下 看不懂自己网上去学
反序列化参数:
session.save_handler session保存形式。默认为files
session.save_path session保存路径。
session.serialize_handler session序列化存储所用处理器。默认为php。
session.upload_progress.cleanup 一旦读取了所有POST数据,立即清除进度信息。默认开启
session.upload_progress.enabled 将上传文件的进度信息存在session中。默认开启。
当 session.serialize_handler=php 时,session文件内容为: name|s:7:"mochazz";
当 session.serialize_handler=php_serialize 时,session文件为: a:1:{s:4:"name";s:7:"mochazz";}
所以解析引擎不同导致反序列化 本来是字符串的 | 被当成php中的分隔符
关于session.upload_progress.enabled
当 session.upload_progress.enabled INI 选项开启时,PHP 能够在每一个文件上传时监测上传进度。 如果session.upload_progress.cleanup = off的话 会话信息会写到文件中。
这里对文件名直接反序列化并文件名被写在包含文件中
直接构造上传表单即可:
<form action="index.php" method="POST" enctype="multipart/form-data">
<input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="1111" />
<input type="file" name="file" />
<input type="submit"/> </form>
filename为我们的反序列cache类的 paylaod 内容进行一句话的替换
2019巅峰极客CTF-web1(LOL英雄联盟)的更多相关文章
- 巅峰极客CTF writeup[上]
经验教训 1.CTF不比实战,最好不要死磕.死磕就输了.我就是死磕在缓存文件死的.真的惭愧: 2.对于flag的位置不要太局限于web目录下,如果是命令执行直接上find / -name flag*: ...
- 2019balsn两道web和2019巅峰极客一道web记录
遇到3道有点意思的web,记录一下~ web1 题目地址:http://warmup.balsnctf.com/ 源码如下所示: <?php if (($secret = base64_deco ...
- 2018 巅峰极客CTF misc writeup
flows 拿到一个pcap包,用wireshark打开,发现是USB协议,尝试在kali下使用tshark提取,提取失败,发现异常.回到wireshark分析数据.在其中一个数据包中发现了tip 把 ...
- 巅峰极客第二场CTF部分writeup
word-MISC 微信回答问题+word字体里. sqli-WEB 注册个admin空格即可,长字符截断. 晚上把后续的写出来.现在睡觉
- 2020 巅峰极客 WP_ Re
第一题:virus 是一个win32 的题,没给加壳. 主函数: int __cdecl main(int argc, const char **argv, const char **envp) { ...
- [原题复现][极客大挑战 2019]BuyFlag
简介 原题复现:[极客大挑战 2019]BuyFlag 考察知识点:php函数特性(is_numeric().strcmp函数()) 线上平台:https://buuoj.cn(北京联合大学公开 ...
- BUUOJ [极客大挑战 2019]Secret File
[极客大挑战 2019]Secret File 0X01考点 php的file伪协议读取文件 ?file=php://filter/convert.base64-encode/resource= 0X ...
- 极客大挑战2019 http
极客大挑战 http referer 请求头 xff 1.查看源码,发现secret.php 2.提示要把来源改成Sycsecret.buuoj.cn,抓包,添加Referer Referer:htt ...
- 2016第七季极客大挑战Writeup
第一次接触CTF,只会做杂项和一点点Web题--因为时间比较仓促,写的比较简略.以后再写下工具使用什么的. 纯新手,啥都不会.处于瑟瑟发抖的状态. 一.MISC 1.签到题 直接填入题目所给的SYC{ ...
随机推荐
- 客户端相关知识学习(十二)之iOS H5交互Webview实现localStorage数据存储
前言 最近有一个需求是和在app中前端本地存储相关的,所以恶补了一下相关知识 webView开启支持H5 LocalStorage存储 有些时候我们发现写的本地存储没有起作用,那是因为默认WebVie ...
- 关于Vue中,checkBox等组件在赋值后,点击切换页面未及时更新问题
我们经常碰到这样的问题,在v-for循环中,给某些组件(此处以checkBox为例)赋值后,组件并不能正常切换, 这是因为数据层太多,render函数没有自动更新,需手动强制刷新. 解决方法:在切换c ...
- PHP函数问题
有时候,运行nginx和PHP CGI(PHP FPM)web服务的Linux服务器,突然系统负载上升,用top命令查看,很多phpcgi进程的CPU利用率接近100%后来通过跟踪发现,这种情况与PH ...
- js获取地理位置
直接上代码: if(navigator.geolocation) { navigator.geolocation.getCurrentPosition( function (position) { v ...
- Java基础加强-类加载器
/*类加载器*/ 把.class文件从硬盘上加载出来,将类的字节码(二进制)加载到内存中 /*类加载器及其委托机制*/ Java虚拟机中可以安装多个类加载器(可以自己编写),系统默认三个主要类加载器, ...
- 什么是N+1查询?
在Session的缓存中存放的是相互关联的对象图.默认情况下,当Hibernate从数据库中加载Customer对象时,会同时加载所有关联的Order对象.以Customer和Order类为例,假定O ...
- Java基于Redis的分布式锁
分布式锁,其实最终还是要保证锁(数据)的一致性,说到数据一致性,基于ZK,ETCD数据一致性中间件做分数是锁,才是王道.但是Redis也能满足最基本的需求. 参考: https://www.cnblo ...
- DNS服务和BIND
今天我们来介绍一下DNS服务,在大家的印象中DNS可能只是将域名解析为IP地址,可能其他的暂时还不太了解,希望本篇内容能帮助大家. 1.什么是DNS? DNS( Domain Name System) ...
- Java基础 反射的基础应用和Class笔记
笔记: /**直接 throws Exception,完美包含全部异常! * --------------------------- * Class: * 首先创建一个类, 接着编译程序: javac ...
- python_面向对象——继承
1.继承 class Animal: def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex d ...