ctfshow_web入门 反序列化(254~266)
web 254
这个题没有考什么,get方式传入payload即可,这里xxxxxx,就是6gex而已
payload:
web 255
审计代码,发现,可以从cookie的user中传入payload实例化字符串,同样需要isVip=True
由于cookie中将"
作为截断符号,所需要编码绕过,这里采用url编码
最后访问/?username=1&password=2
得到flag
web 256
题目
额,这里只是不让username和password相等即可
白嫖255payload即可
web 257
首先寻找一下unserialize函数,顺带看了一下流程。接下来找了顺便看了一下哪里能够拿到flag。但是没有找到。
在审计的过程中,看到在backdoor类中,看到了eval
,于是寻找哪里能够控制code
和引用back::getInfo()
;ctfshowuser类中的destruct中看到$this->class->getInfo();
。于是想,从ctfshowuser::destruct
中引用backdoor::getInfo()
,backdoor::code
就是变量。
exp:
payload:
最后访问/?username=1&password=2
得到flag
在类中嵌套类,需要初始化,所以使用__construact
函数进行初始化赋值
web 258——绕过正则
和257差不多,这里用了/[oc]:\d+:/
来过滤,我们给数字加上+
来绕过。
至于为什么用加号,额,函数定义就是这么写的,如果是+
那么也能正常执行(以前看到其他解释说的是,+1和1没区别,但是没有说这里C实现的过程)
这里使用一句话木马,上面那个,额,没想到
exp
这题卡了很久,因为我是复制粘贴257来修改的,没有注意到属性,,,,
web 259——ssrf
不懂,去找个wp,所以本题是直接抄的。
如果调用一个没有定义的方法,那么就会使用类本身的call方法。由于给了个ssrf的代码,那么河里推断这是一个ssrf的原生类。
看完了大师傅的视频,大概明白要赶个什么了。顺便说一句,大师傅太顶了!!!
我这里就在kali中做测试了,因为不想在本机上下载nc工具。
额,在kali中,还需要把soap的PHP扩展下载一下。这就比Windows可能方便很多了(只针对我个人嘛),因为我在Windows中装了一个PHP环境,用的不是phpstudy那边的PHP,所以自己添加外包可能有点麻烦,最主要还是是因为不想在Windows上装nc;
写得多,但是仔细看完就没什么了
安装扩展包
- 首先查看一下有没有soap包扩展(应该是没有的)
- 下载外包(根据自己的机器上的版本下载)
- 再查看一下soap包扩展
这个时候,应该是能够查看到的,效果如下,也有可能要等一下
可以看到;extension=soap
,说明soap
扩展已经下载好了,接下来只需要将;
去除即可。这样也就算了下载且添加进了PHP中,可以使用了。
接下来回到题目
在kali中打开nc工具监听一个端口,开一个终端来跑代码;打开web259.php文件(自己写的),布局可以参考一下下面的。
在web259.php中写入代码,(代码不全,因为是一步一步来的,我是希望将题目笔记尽量做细致一点,后来复习的时候也能看懂)
开启nc侦听8181端口,接着运行web259.php,从nc工具中可以看到侦听到的数据User-Agent: ctfshow
,注入的user-agent已经成功了。(目前进度大概是60%)
看题目:
- 题目要从X-Forwarded-For中获取ip。
将X-Forwarded-For按照,
分为数组,接着array_pop第一个元素,最后用第二个元素来作为ip;
所以构造
- 题目要求是post传入的参数,所以要构造一个post表单传入参数token=ctfshow
所以构造
因为设置了Content-Length=13
,所以只取后面13位,也就恰好吧token=ctfshow
取完就停止;十分的严格。顺便补一句,反序列化的规矩也是10分的严格。
由于本地应该是80或者是8080端口,把:8181
去掉就行了,利用默认端口进去;
最后exp是:
payload:
访问url/flag.txt
拿到flag
这个题,就做完了。师傅们太顶了,顶呱呱;
web 260
???,没仔细看,get传入ctfshow=ctfshow_i_love_36D
就拿到了
是对传入的字符串进行序列化,然后检测有没有ctfshow_i_love_36D
web 261
审计代码发现:
- 有__unserialize(),在7.4以上版本反序列化会绕过__wakeup()函数。
- 在destruct()函数中,有file_put_contents可以写入文件,一句话木马儿
- $this->code==0x36d是弱类型比较,0x36d又有没有打引号,所以代表数字,且数字是877,那么
877a
,877.php
等可以通过比较;所以设置username='877.php'
来通过比较
所以exp:
payload:
访问url/877.php执行一句话木马,1=system('cat /flag_is_here');
拿到flag
261还说是打redis,吓了一跳。。。
web 262——字符串逃逸_部分替换
先审计一下代码,发现:
fuck
会被替换为loveU
- 没有看到能够利用的函数或者是和flag有关的,不过找到message.php,(建议上午或者下午做题,晚上貌似是做题巅峰,是在是卡)
再审计之后发现,貌似可以直接从message.php这里,只需要看这么一段,就行了,也不用逃逸了,,,,
上分做法:
payload:
在message.php页面中,F12,cookie添加msg,刷新,拿到flag
字符串逃逸
首先要知道这里是将fuck
修改成了loveU
,由4个字符长度,变成了5个,长度发生了变化,导致了反序列化字符串结构改变。
我们知道,反序列化过程十分的严格,多读取一个,或者是少读取一个都是不被允许,会报错的。一旦长度有了变化,那么就会报错。加入我们精心构造一个字符串,那么不但不会报错,而且还能够拿到flag。
看了message.php我们知道,只需传入的payload在反序列化的时候,反出来一个token=admin
,就行。
这是用来测试的文件
首先拿到一个正常的,反序列化字符串
取末尾几位:";s:5:"token";s:5:"admin";}
,这长度为27
我们于是我们构造:t=3";s:5:"token";s:5:"admin";}
此时,用fuck来进行测试:&t=fuck";s:5:"token";s:5:"admin";}
,将fuck放在前面
由于长度变化了,反序列化也会失败。
看到了fuck
编程loveU
,长度由31变成了32,抵出去了一个字符的位置。
由于字符串是一个一个读取的,所以这里被抵出去的是}
,
一个fuck会抵出去一个位置,那么两个fuck就会抵出去两个(** :}
**)位置;
假如";s:5:"token";s:5:"admin";}
被抵出去了,那么就能够恰好的满足反序列化的条件了。
所以,有多少个fuck就会抵出去多少个位置;就需要len(";s:5:"token";s:5:"admin";})
个fuck,也就是27个。
最后构造得到
t=fuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuck";s:5:"token";s:5:"admin";}
拿到这个构造的payload,在题目中提交
访问url/message.php拿到flag
文辞有限,笔墨仅限于此。
没有说清楚的话,请移步大师傅的视频讲解
web 253
dirsearch扫描发现www.zip,看来是seesion反序列化了,
想了一下,突然意识到,貌似session反序列化可以直接把session中能反的给了;
人给我做傻了这题,不知道是不是因为开局就输入账号密码错误了几次,导致后来的cookie没有写入给整自闭了。所以查看cookie,limit一直是1。就有点不明所以了。
审计代码:
找到,当user类被析构的时候,会有file_put_content
的,执行,借此可以吸入一句话木马;
web 264
session的反序列化字符串逃逸,其实和262没有区别,把262payload拿过来用就行;只是需要再设置一个msg
的cookie,即可
这个题没有设置session反序列化的处理器,那就是磨人的,也就和平时反序列化代码的模式一样。所以这里可以按照262的方式去理解
web 265——引用
由于mt_rand()
预测不了,我预测不了,万一有大佬能预测呢,,,且md5(mt_rand())
确实预测不了。
可以利用引用的方式,将password赋值为token的引用
exp
payload:
web 266——伪协议,正则绕过
审计代码:
发现,反序列话的是$cs=file_get_contnets(php://input)
,同时在__destruct
中有输出flag的语句。暗示了要找个机会传入一个ctfshow类进去。恰好看到$cs
对字符串ctfshow过滤了,也就明示了要传入ctfshow类的字符串给cs。这题就差把flag顺手给提交了。
php://input伪协议是post输入的参数。首先拿到一个ctfshow类的反序列化字符串;
得到
利用burp传值;在hackbar中,post不能传入单个字符串,必须是以a=b
形式传入,只传入b
是不行的,所以要利用到burp,抓包,改值。
由于过滤了ctfshow
但是我这里用的是cTFSHOW
,在PHP中,类不区分大小写;所以绕过了过滤。
如果进入了判断,就会异常,然后不执行析构函数。
破坏结构进行析构
就是说,传入一个破坏了反序列化字符串结构的字符串进去,使得,即使异常了,也会析构。
新看到方法,太顶了,就看不懂为什么。。。。
魔术方法
如果有写得不对的地方,斗胆请师傅们斧正
__EOF__

本文链接:https://www.cnblogs.com/upstream-yu/p/15194626.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix