type
status
date
slug
summary
tags
category
icon
password
刚开始看到没什么有点懵,尝试了去爆破目录,用御剑,结果卡的要死,然后看到题目上写了包含文件,就直接尝试文件包含,无果,就想着去网页上看看源码有没有什么收获:

接着弹出select,点了发现

再点了一次也没什么收获,果断看看抓包文件(有时候网页上是没有显示的),看到一个php文件

访问一下该
secr3t.php,回显了源码
接着就好办了,在该文件的基础上
file=php://filter/read=convert.base64-encode/resource=flag.php
得到一串base64编码
接着进行解码得到html网页

可以看到flag为
flag{41fb146f-a94a-41e9-b025-92e8dccacbf0}[ACTF2020 新生赛]BackupFile

提示我们尝试找到源文件,搜寻了一番,没找到什么关键信息。
尝试dirsearch爆破目录
等着~~~

总算找到一个备份文件了,可以记录下ctf的备份文件(常见的www.zip)
找到源码:
!is_numeric($key)验证是否为数字使用
intval()将key转换为整数类型。
将转换后的整数与字符串"123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3"进行比较。这里使用的是==而不是===,意味着 PHP 会进行类型转换后再比较。关键在于 PHP 的弱类型比较特性:当使用
==比较一个整数和字符串时,PHP 会尝试将字符串转换为整数。字符串转换为整数的规则是:从字符串开头提取数字部分,直到遇到非数字字符为止。对于字符串"123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3",转换后的整数为123。那么结果就不言而喻了

[极客大挑战 2019]PHP

常见的网站源码备份文件后缀:
tar.gz,zip,rar,tar
常见的网站源码备份文件名:
web,website,backup,back,www,wwwroot,temp
多年的经验告诉我,加个www.zip试试,很多ctf题就爱出这个
还真有
从里面找到源代码:
同时还有index.php
魔术方法 | 触发时机 | 主要用途 |
__construct() | 对象创建时 | 初始化对象属性 |
__destruct() | 对象销毁时 | 清理资源(如关闭文件) |
__wakeup() | 反序列化对象时 | 恢复对象状态 |
__sleep() | 序列化对象前 | 准备需要序列化的属性 |
这里就是要求我们
username=admin和password=100,但是里面的username又会覆盖成guest在 PHP 5.6.25/7.0.10 之前的版本中存在一个反序列化漏洞:
- 当序列化字符串中声明的属性个数大于实际对象的属性个数时,
__wakeup()方法会被绕过执行。
- 在你的代码中,
Name类实际有 2 个私有属性($username和$password),但我们可以在序列化字符串中声明 3 个属性来触发漏洞。
所以我们先制造出序列化对象:
运行后为payload:
O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}该类中本来只有2个私有属性,我们需要声明大于实际属性个数

所以payload:
O:4:"Name":3:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}同时,由于上述的是为私有属性,所以我们需要对该
payload进行编码:
PHP 在序列化对象时,会根据属性的访问控制级别(public、protected、private)使用不同的前缀:
- 公有属性(public):直接使用属性名(如
s:4:"name")
- 受保护属性(protected):使用 作为前缀(如
s:6:"%00*%00name")
- 私有属性(private):使用 类名 作为前缀(如
s:14:"%00ClassName%00name")
注意:这里需要先进行编码,后在
Nameusername这些类和属性上加上%00所以最终的payload:
O%3a4%3a%22Name%22%3a3%3a%7bs%3a14%3a%22%00Name%00username%22%3bs%3a5%3a%22admin%22%3bs%3a14%3a%22%00Name%00password%22%3bi%3a100%3b%7d
在 Python 中构造,需要使用
\x00 表示 NULL 字符,再进行 URL 编码对应python的poc:

flag{79fde13f-5174-49ec-8f81-3751904addd0}🤗 总结归纳
实操其实不难,难的是思路,多做题,思路就会顺其自然
- 作者:zhiles小屋
- 链接:https://tangly1024.com/article/22022e55-9ee8-8098-9166-e80ed5f2ab53
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
