当前位置: 首页 > news >正文

pop链详细分析、构造(以[NISACTF 2022]babyserialize为例)

目录

[NISACTF 2022]babyserialize

(一)理清pop链(链尾 链头),标注步骤

1. 先找eval、flag这些危险函数和关键字样(这是链尾)

2.往eval()上面看

3.往$bb()上面看

4.往strtolower()上面看

5.往huang上面看

6.往nisa()上面看

发现需要触发__wakeup()函数,此处即为链头

(二) pop链脚本构造

按照已标注步骤进行

(三)过滤与绕过

1.绕过waf

2. 绕过preg_match正则匹配


[NISACTF 2022]babyserialize

学习参考!!![NISACTF 2022]babyserialize(pop链构造与脚本编写详细教学)-CSDN博客

打开链接需要构造pop链

(一)理清pop链(链尾 链头),标注步骤

1. 先找eval、flag这些危险函数和关键字样(这是链尾)

找到eval()函数,可以利用参数txw4ever,调用系统函数system等实现命令执行

传给谁就标注在谁的后面,这里表示第一步:要传给txw4ever

2.往eval()上面看

发现需要触发__invoke()函数

__invoke():把对象当成函数执行时触发        e.g $a()

故在所有类中找,去找类似$a()的对象函数,发现$bb(),它对应的参数是su

第二步:要调用参数su,传入NISA类

3.往$bb()上面看

发现需要触发__toString()函数

__toString():把对象当成字符串输出触发        e.g echo $a

在所有类中找,发现strtolower()函数:将字符串转换成小写。对应参数 a

第三步: 要调用参数a,传入Ilovetxw类

第四步:此处还存在一个条件,fun="sixsixsix",由于fun属性为private,故直接在类里面修改

4.往strtolower()上面看

发现需要触发__set()函数

__set():给不存在的成员属性赋值时触发

在所有类中找,发现huang调用了fun,但在Ilovetxw类里不存在参数 fun

第五步:要调用参数huang,传入four类

5.往huang上面看

发现需要触发__call()函数

__call():调用不存在的方法触发

在所有类中找,发现nisa(),该类中不存在方法

第六步: 要从$ext属性中调用nisa()方法,传入Ilovetxw类

6.往nisa()上面看

发现需要触发__wakeup()函数,此处即为链头

此函数在类TianXiWei中

__wakeup():字符串被反序列化时触发

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

(二) pop链脚本构造

按照已标注步骤进行

1.实例化类NISA赋值给a,从中调用参数txw4ever执行RCE(ls /查看根目录)

2.实例化类Ilovetxw赋值给b,从中调用参数su传入NISA类

3.实例化类four赋值给c,从中调用参数a传入Ilovetxw类

4.实例化类Ilovetxw赋值给b,从中调用参数huang传入four类

5.实例化类TianXiWei赋值给d,从中调用参数huang传入Ilovetxw类

6.序列化类TianXiWei并输出

最终pop链:

<?php
class NISA{public $fun="show_me_flag";public $txw4ever;			//1 system
}
class TianXiWei{public $ext;				//6 Ilovetxwpublic $x;
}
class Ilovetxw{public $huang;				//5 fourpublic $su;					//2 NISA
}
class four{public $a="TXW4EVER";		//3 Ilovetxwprivate $fun="sixsixsix";	//4 fun="sixsixsix"
}
$a=new NISA();
$a->txw4ever='system("ls /");';
$b = new Ilovetxw();
$b->su = $a;
$c=new four();
$c->a = $b;
$b = new Ilovetxw();
$b->huang = $c;
$d=new TianXiWei();
$d->ext = $b;
echo urlencode(serialize($d));
?>

传入发现只有提示flag在根目录,可直接使用system("cat /flag");读取flag,但存在过滤

(三)过滤与绕过

源码提示 存在两处需要绕过

1.绕过waf

有一个hint()函数,触发就会输出一些提示

让if语句判断不成立(fun=="show_me_flag"不成立)即可绕过这个函数

故 可在对象NISA中 调用fun属性 并重新赋值line

再次传入后发现成功绕过了waf,但还存在正则匹配

2. 绕过preg_match正则匹配

暗示存在关键字的过滤:

使用了正则匹配,但没给匹配的内容,用的......

此处system被过滤掉了,使用会返回 something wrong

        flag也被过滤掉了,使用时无回显

故 使用大写字母System、f*分别绕过,得到flag。

(1)System大写绕过:php内置函数名不区分大小写

(2)*号通配符:匹配以f开头的所有字符        f* 

http://www.lryc.cn/news/376143.html

相关文章:

  • 使用超声波麦克风阵列预测数控机床刀具磨损
  • 怎么控制多个存储设备的访问权限?数据安全存储方案来了
  • 麒麟系统mate_indicators进程占用内存资源高
  • Docker高级篇之轻量化可视化工具Portainer
  • Vue32-挂载流程
  • 算法金 | 一个强大的算法模型:t-SNE !!
  • 用IAST工具强化“越权检测”能力,提升系统安全性
  • VirtualStudio配置QT开发环境
  • Nature发文介绍使用ChatGPT帮助学术写作的三种方式
  • 【网络安全的神秘世界】Kali 自带 Burp Suite 使用指南:字体与CA证书设置详解等
  • 【Go】爬虫数据解密_使用Go语言实现TripleDES加密和解密
  • 【HarmonyOS NEXT】鸿蒙 如何在包含web组件的页面 让默认焦点有效
  • mysql常用参数配置详解my.cnf my.ini
  • GlusterFS企业分布式存储
  • SSH生成SSH密钥(公钥和私钥)
  • 阶段性总结:如何快速上手一个新的平台或者技术
  • kettle从入门到精通 第七十一课 ETL之kettle 再谈http post,轻松掌握body中传递json参数
  • 第十二章:会话控制
  • 【LeetCode滑动窗口算法】长度最小的子数组 难度:中等
  • MySQL 用户权限管理:授权、撤销、密码更新和用户删除(图文解析)
  • Day39
  • Nginx之HTTP模块详解
  • JCR一区 | Matlab实现GAF-PCNN、GASF-CNN、GADF-CNN的多特征输入数据分类预测/故障诊断
  • 最新Prompt预设词分享,DALL-E3文生图+文档分析
  • 基于SpringBoot+Vue会所产后护理系统设计和实现
  • Linux中的EINTR和EAGAIN错误码
  • 用户需求分析揭秘:最佳实践与策略
  • 批量创建文件夹 就是这么简单 一招创建1000+文件夹
  • LogicFlow 学习笔记——8. LogicFlow 基础 事件 Event
  • Nginx缓存之代理缓存配置