首页 > 编程语言 >php反序列化键值逃逸

php反序列化键值逃逸

时间:2023-10-14 19:56:40浏览次数:34  
标签:php photo nickname 逃逸 键值 序列化 config

又遇到键值逃逸了。

这里提前说一下我的理解吧,这次理解比上几次遇到字符串逃逸还要深刻一点。

譬如这次我是先写逃逸payload,然后使用 "}; 闭合第一个逃逸部分,然后在后续插入新的字符串,也就是更改可控值,再用一次 "}; 闭合后续字符串。

 

详细的看题目吧。来自:[0CTF 2016]piapiapia

打开是个login界面,很难不让人想到sql注入,但是注不出来。

这里没先用dirsearch,因为太慢,先用脚本扫看能不能扫出东西:

绷不住了,全都能访问。

那这里我就选择www.zip,这个集成了源码备份文件。

下载得到一堆源码,接下来就是源码审计。

一个个看,先看class文件:

 

没什么特别的,就是mysql数据库,下面有个filter过滤函数,会把关键字换成hacker,如果我还没看到后面,都真要以为是sql的黑名单注入了。

然后接着看config.php,出现关键信息:

flag就在config.php,所以我们的目标应该是对这个config.php有所操作,但是暂时还没有想法,接着看index.php:

这里出现了个profile.php,里面是个username和password的strlen检验,没什么特别的,再看到profile.php:

又套到了update.php,但是有个关键注入点出现了,也就是else后面的$photo用base64加密把photo读出来,这里就有个思路,把这个photo想办法换成前面的config.php,不就能读flag了吗?而且还有个unserialize的关键反序列化函数,这里思路就出来了,显然要用反序列化字符串逃逸把photo参数换成config.php,猜想update.php有文件上传和序列化函数:

猜对了。看看判断条件,username/email都被写死了,不可控了。但是nickname只有个简单的判断,只需要写数字和字母,那对我们要插入的字符串来说等于啥都没过滤,而且strlen函数有个经典的数组绕过,传nickname[],就能卡出NULL,绕过长度限制。

分析一下流程,register.php显然就是简单注册进去然后我们再登录进去,直接再update.php上修改东西,然后bp上改nickname,传入序列化字符串,接着就会触发profile.php的反序列化函数然后打出base64加密的config.php。

 

关键就是,如何构造这个序列化字符串。

这里我使用的是键值逃逸,因为看到有个过滤函数:

对!就是这个,这里的精髓就是,输入一个黑名单字符串,换成了hacker,加入我输入5个字符的where,它会换成6个字符的hacker,这样就逃逸出了一个字符,以小换大。

而且这里也只有where可以用来逃逸,其他的跟hacker一样是6字符。

 

然后就是序列化字符串分析了,我们可以本地跑一下,简单的序列化就是:

逃逸精髓还有一个就是闭合。

原始:

O:1:"a":4:{s:8:"username";s:8:"admin111";s:5:"email";s:11:"[email protected]";s:8:"nickname";s:12:"Eddie_Murphy";s:5:"photo";s:5:"1.png";}

先想好要插入什么,肯定是s:10:"config.php";}直接闭合后面的东西,而且我们传到的是nickname里面,也就是Eddie_Murphy这部分,我们的目的是把photo部分黑了。

同时考虑引号和右花括号闭合,得到真正插入的完整字符串是:

s:8:"nickname";s:12:"";s:5:"photo";s:10:"config.php";}";s:5:"photo";s:5:"1.png";}

有效语句是(右花括号前):

s:8:"nickname";s:12:"";s:5:"photo";s:10:"config.php";}

插入的部分是:

";s:5:"photo";s:10:"config.php";}

一共34个字符,但是前面原始的数据并没有这凭空插入的34个字符,但是前面分析知道where以小换大hacker能逃逸一个字符,那么我们写34次where就能逃逸出34个字符,插入的payload就生效了。

完整payload:

wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere";}s:5:"photo";s:10:"config.php";}

然后就是按流程来,然后在update.php里数组绕过nickname,改包传payload:

 

 

或者说放包:

 

点进去查看源码得到:

丢赛博厨子里就出来了:

 

标签:php,photo,nickname,逃逸,键值,序列化,config
From: https://www.cnblogs.com/EddieMurphy-blogs/p/17764620.html

相关文章

  • 如何在 XAMPP 中使用 不同的 PHP 版本?
    你有没有碰到这种情况,你工作的项目需要的是PHP8,而你自己的项目需要的是PHP7,而你又特别钟爱于XAMPP,奈何它却不能自由切换PHP版本,下面就讲下本人在用的方法将PHP7更新到PHP8,可以通过单个XAMPP在Windows系统下安装设置多个版本的PHP。1、下载PHP8压缩包打开 XAMPP 官网,下载你所需......
  • php读取txt随机一行一个数据输出
    php读取txt随机一行一个数据输出,代码如下<?phpfunctiongetline($file){$i=0;do{$data=file($file);$num=count($data);$id=mt_rand(0,$num-1);$shuju_text=chop($data[$id]);$i=strlen($shuju_text);}while($i<1);ech......
  • [安洵杯 2019]easy_serialize_php
    原理反序列化字符串逃逸解题过程跟sql拼接差不多_SESSION['imgflagphp']=;s:1:"1";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";}参考文章:https://blog.csdn.net/weixin_52585514/article/details/124291588https://xz.aliyun.com/t/9895......
  • 2023版本Phpstorm的运行和初始文件配置
    1.PHPForWindows:BinariesandsourcesReleases官网下载配置包php-8.0.30-nts-Win32-vs16-x64.zip  2.解压 3.复制php.ini-production,将副本更名为php.ini作为初始文件 4.编辑php.ini文件 a.取消extension_dir的;注释 b.找到配置包中的ext文件路径,赋值给exten......
  • PHP 日期加月份
    function setMonth($time, $length){    // $time => 时间戳  $length => 加减几月(数字)    if (!is_numeric($time)) $time = strtotime($time);    if ($length > 0) $length = "+$length";    $hour = date(' H:i:s', $time); ......
  • 编译安装CENTOS7.6+NGINX1.8+MYSQL5.7+PHP7.9+ZABBIX5.0
    LNMP系统安装环境准备:系统版本:CentOSLinuxrelease7.6.1810(Core)PHP版本:php-7.4.9NGINX版本:nginx-1.19.2MYSQL版本:MySQL5.7.43zabbix版本:zabbix-5.0.3以下为下载地址PHPNginxMYSQLzabbixPHP依赖包 把下载的源码包都上传到服务器上,并解压[root@zabbixserver......
  • PHP命令空间namespace及use的用法实践总结
    使用namespace的目的:团队合作项目时,避免与团队其它成员新建的类发生冲突;个人负责项目时,避免前后新建的类发生冲突; 据个人理解,用到所需要的类时,需要先require或include引入,所以会发生类重定义的错误的前提是:两个相同命名的类都有被引入。目前有些php框架会自动加载(即include)所......
  • PHP+MySQL制作简单动态网站(附详细注释+源码)
    项目介绍项目名称:图书管理系统项目实现的内容:1.用户登录、用户注册、登录界面验证码功能。2.退出登录功能、内容查看、内容添加、内容修改。前端页面设计得有点可能不太专业,将就着用。主要专注在功能的实现。具体实现步骤根目录布置: 1.登录界面实现具体步骤参照文章:PH......
  • Docker dnmp 多版本php安装 php8.2
    Laravel9开发需要用到php8.1以上的版本,而dnmp只支持到php8.0。安装php8.2的步骤如下: 1.从/services/php80目录复制一份出来,重命名为php82,extensions目录只保留 install.sh和 install-php-extensions这两个文件 2.修改.env文件,添加php82的配置参数:##PHP82##......
  • 文件包含漏洞在phpinfo条件竞争下获取WebShell
    PHP文件包含漏洞(利用phpinfo与条件竞争)在PHP环境下,如果网站存在本地文件包含漏洞,但找不到可以包含的文件时,我们可以通过条件竞争来包含缓存文件的方法来获取webshell。又因为临时文件名是随机的,如果目标网站上存在phpinfo,则可以通过phpinfo来获取临时文件名,进而进行包含。前提......