问1
**单位某应用程序被攻击,请分析日志,进行作答:
**网络存在源码泄漏,源码文件名是_____________。(请提交带有文件后缀的文件名,例如x.txt)。得到的flag请使用NSSCTF{}格式提交。
观察日志文件assess.log
存在大量404响应 存在200响应且响应大小为1686字节
出现www%2ezip这样的url编码内容%2e=.于是就是www.zip
攻击者很可能通过GET /www.zip成功下载了源码,嗯嗯
NSSCTF{www.zip}
assess.log
assess.log是web服务器记录客户端请求的文本日志文件
每一行代表一次HTTP请求
1 | IP地址 - - [时间] "请求方法 路径 HTTP/版本" 状态码 响应大小 "来源" "User-Agent" |
1 | 192.168.1.100 - - [04/Jan/2026:11:18:00 +0800] "GET /index.html HTTP/1.1" 200 1234 "http://example.com" "Mozilla/5.0..." |
404的含义
404表示未找到,访问的路径或文件不存在
攻击者通常会使用工具来进行目录/文件爆破扫描,尝试枚举服务器上存在的资源
如果出现大量的404,说明有人在暴力猜解路径
202的含义
202表示请求成功,返回正常的内容
在众多的404里,突然有一个200并且响应大小为1686字节,就很可疑
文件名www.zip很可能就是网站的源代码压缩包,被黑客下载了
源码泄露
当web应用部署不当,将源代码文件.zip``index.php等等暴露在公网可访问路径之下时,就可以发生源码泄露
问2
**单位某应用程序被攻击,请分析日志,进行作答:
**分析攻击流量,黑客往/tmp目录写入一个文件,文件名为_____________。得到的flag请使用NSSCTF{}格式提交。
ctrl+F tmp url decode
1 | 172.17.0.1 - - [07/Aug/2021:01:38:20 0000] "GET /?filename=../../../../../../../../../../../../../../../../../tmp/sess_car&content=func|N;files|a:2:{s:8:"filename";s:16:"./files/filename";s:20:"call_user_func_array";s:28:"./files/call_user_func_array";}paths|a:1:{s:5:"/flag";s:13:"SplFileObject";} HTTP/1.1" 302 879 "-" "python-requests/2.26.0" |
filename=../../../../../../../../../../tmp/sess_car
多重的../是典型的路径遍历攻击,目标是写入到服务器上的临时目录/tmp/sess_car
于是sess_car就是黑客往/tmp写入的文件名
黑客利用漏洞,让网站把一段数据保存成文件。
他指定路径为 /tmp/sess_car
/tmp 是 Linux 临时目录,PHP 默认把用户登录信息(session)存在这里,名字通常是 sess_xxx
所以他故意起名叫 sess_car,是为了伪装成正常的 session 文件骗过系统
NSSCRF{sess_car}
第一步:写入恶意session文件
1 | GET /? |
1.1 filename的作用
值为:../../../../../../../../../../tmp/sess_car
每个 ../ 表示“父目录”,连续使用可跳出web应用根目录,进入系统根目录
最终目标路径是:/tmp/sess_car
/tmp 是 Linux 系统的临时目录
sess_car格式符合php session文件命名规则(sess_ + 任意ID)
攻击者意图:在 **/tmp** 目录下创建一个名为 **sess_car** 的文件
1.2 content参数的内容
值包含:paths|a:1:{s:5:"flag";s:13:"SplFileObject"}
这是php session的原生存储格式(不是标准 serialize() 输出,但原理相同)
1 | paths|a:1:{s:5:"flag";s:13:"SplFileObject"} |
a:1: → 表示这是一个数组,有 1 个元素。
s:5:"flag" → 键是字符串 "flag",长度为5
s:13:"SplFileObject" → 值是字符串 "SplFileObject",长度为13
在 PHP session 反序列化时,如果配置了 session.serialize_handler = php_serialize 或使用某些框架,这个字符串就被解释为:
1 | $paths['flag'] = new SplFileObject('...'); |
1 | new SplFileObject('/flag'); |
1.3 服务器漏洞:任意文件写入
假设后端代码是:
1 | file_put_contents($_GET['filename'], $_GET['content']); |
没有校验路径的合理性,允许写入任何位置。结构就是/tmp/sess_car被写入上述恶意内容(任意文件写入)
第二步:验证文件可被包含
1 | GET /?file=sess_car |
服务器行为
服务器响应状态码为 200,说明请求成功。
响应体大小为 687 字节,说明返回了文件内容。
服务器漏洞:本地文件包含(LFI)
假设后端代码是
1 | include($_GET['file']); |
第三步:看第三个请求(触发执行)
1 | GET / |
这是一个普通的首页访问。
但它会触发 PHP 的 session 自动加载机制。
PHP Session 机制简述:
当用户访问网站时,PHP 会根据 Cookie 中的 PHPSESSID 值(例如 car),去 /tmp 目录查找对应的 session 文件(如 sess_car)。
找到后,PHP 会 反序列化该文件的内容,恢复用户的会话变量。
关键点:
攻击者之前写入的 sess_car 文件内容包含 SplFileObject。
当 PHP 反序列化这个文件时,会执行:
1 | new SplFileObject('/flag'); |
SplFileObject的构造函数会尝试打开/flag文件。- 如果文件存在,其内容会被读入内存(可能被输出或记录在日志中)。
这就是 PHP 反序列化漏洞 的利用:通过控制 session 内容,在反序列化时触发危险操作。
攻击流程总结
- 写入阶段
- 发送请求:
GET /?filename=/tmp/sess_car&content=...SplFileObject... - 利用任意文件写入漏洞,将恶意 session 数据写入
/tmp/sess_car。
- 包含阶段
- 发送请求:
GET /?file=sess_car - 利用文件包含漏洞,确认文件可被加载。
- 触发阶段
- 发送请求:
GET /(并设置 Cookie:PHPSESSID=car) - PHP 自动加载
/tmp/sess_car,反序列化时执行new SplFileObject('/flag'),读取 flag 文件
为什么是 SplFileObject?
SplFileObject 是 PHP 内置类
它的 __construct() 方法会立即尝试打开传入的文件路径
在反序列化过程中,如果对象属性被赋值为 SplFileObject 实例,构造函数会被自动调用
因此,它可以被用来 读取任意文件
问3
单位某应用程序被攻击,请分析日志,进行作答:****分析攻击流量,黑客使用的是______类读取了秘密文件。得到的flag请使用NSSCTF{}格式提交。
NSSCTF{SplFileObject}