2021 陇剑杯 日志分析
2026-08-22 20:05:38

问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
2
3
4
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"
172.17.0.1 - - [07/Aug/2021:01:38:20 0000] "GET /?file=sess_car HTTP/1.1" 200 687 "-" "python-requests/2.26.0"
172.17.0.1 - - [07/Aug/2021:01:38:20 0000] "GET / HTTP/1.1" 200 645 "-" "python-requests/2.26.0"
172.17.0.1 - - [07/Aug/2021:01:38:21 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
2
3
GET /?
filename=../../../../../../../../../../tmp/sess_car&content=func|N;files|a:2:
{...}paths|a:1:{s:5:"flag";s:13:"SplFileObject"}

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 内容,在反序列化时触发危险操作。

攻击流程总结

  1. 写入阶段
  • 发送请求:GET /?filename=/tmp/sess_car&content=...SplFileObject...
  • 利用任意文件写入漏洞,将恶意 session 数据写入 /tmp/sess_car
  1. 包含阶段
  • 发送请求:GET /?file=sess_car
  • 利用文件包含漏洞,确认文件可被加载。
  1. 触发阶段
  • 发送请求:GET /(并设置 Cookie: PHPSESSID=car
  • PHP 自动加载 /tmp/sess_car,反序列化时执行 new SplFileObject('/flag'),读取 flag 文件

为什么是 SplFileObject

SplFileObject 是 PHP 内置类

它的 __construct() 方法会立即尝试打开传入的文件路径

在反序列化过程中,如果对象属性被赋值为 SplFileObject 实例,构造函数会被自动调用

因此,它可以被用来 读取任意文件

问3

单位某应用程序被攻击,请分析日志,进行作答:****分析攻击流量,黑客使用的是______类读取了秘密文件。得到的flag请使用NSSCTF{}格式提交。

NSSCTF{SplFileObject}

上一页
2026-08-22 20:05:38
下一页