0x00
Perface
这次比赛再次让我意识到了自己很菜,队友疯狂c,呜呜呜,希望下次可以多做几道题目。
0x01
web1-easyphp
题目一上来就给了源码:
1 |
|
经过分析之后我们可以知道,这题目是让我们使用call_user_func_array
这个函数来执行一个可以停止当前进程的函数,但是和进程有关的pcntl
全都被过滤了。并且,我们几乎所有的进程函数都是没有三个参数的。场面陷入的僵局。。
然后我在FUZZ
的时候,偶然发现了call_user_func
这个函数是可以支持三个参数的。突发奇想,我们是不是可以把参数缩短到2
位。(因为 $_GET['b']
使我们可以控制的 且 $_GET['b']
没有任何过滤,我们可以输入b=pcntl_waitpid
)。这样我们的payload
也就完成了。
1 | ?a=call_user_func&b=pcntl_waitpid |
打出phpinfo
。直接搜索flag
就可以了。
注一:之后发现pcntl_wait
等让进程停止的函数都可以使用。
注二: 如果你还是在想assert
和eval
等语言结构,那只能说推荐你看一下我之前写的php测试assert和eval
了。
0x02
web2-babyunserialize
同样给了源码。在根目录下的www.zip
中。是一个框架的源码,打过近些天比赛的话可以发现,这其实是WMCTF2020 webweb
的题目。不过之前的payload
无法直接打通。网上随便找了条链通了。
1 |
|
找的是http://phoebe233.cn/?p=56#Webweb
大佬的payload
。感谢大佬。
payload
就是上面的那样了。但是这里我想啰嗦一下,说一下在审计框架时的东西。
首先,一位师傅问我为什么没有文件包含,但是我们却还是可以利用所有的类进行构造反序列化链。为了搞清楚框架的__autoload
机制,我特地去问了学开发的叶局长(叶局tql!)。
1 | php在实例化一个类的时候,如果找不到会自动调用 autoload 方法。我们在实例化一个 Student 类的时候,没有找到 Student ,就会把这个名字当做字符串传入。这也是为什么我们无法直接反序列化 Agent ,而要先创建 WS 的实例。因为没有 cli/Agent.php 只有 cli/WS.php 。从而成功包含 ws.php 。 |
另一个知识点是phpinfo(-1)
是显示所有的phpinfo
信息。这个可以在官方文档中找到。
最后再讲一个人尽皆知的知识吧。几乎所有反序列化的入口点都是__destruct
和__wakeup
。所以审计框架的时候,我们最好先全局搜索这几个魔术方法。
0x03
web3-littlegame
题目全都给了源码。这里只贴一下关键代码:
app.js
:
1 | var express = require('express'); |
index.js
:
1 | var express = require('express'); |
观察代码的业务逻辑可以知道,我们只要使用正确的密码登录就完事了,但是因为我们不知道密码,所以我们要自己添加密码,基本上一眼就可以看出是 原型链污染。关键是从哪里做,怎么做?
注意到setFn
这个奇怪的函数。发现这个函数是const setFn = require('set-value');
。查看文档发现我们可以利用它来原型链污染。走下流程。
1.先去/SpawnPoint设置一下 session.knight
2.然后去/Privilege传输 {"NewAttributeKey":"__proto__.cioi","NewAttributeValue":"cioi"}
3.最后去/DeveloperControlPanel传 {"key":"cioi","password":"cioi"}
0x04
web4-rceme
1 |
|
这题目其实难度不低的,不知道为什么那么多的解。首先这是个zzzcms
的一个CVE
的二次加工。本来我们可以使用{if:var_dump(((strrev(stnetnoc_teg_elif)))((strrev(edoced_46esab))(Li8uLi8uLi8uLi8uLi8uLi8uLi9mbGFn)))}
。
PS: 为什么可以这么写,可以查看 zzzcms
的官方文档。
但是我们这里的str
被过滤了。那么我们就尝试一下别的编码呗。。发现hex2bin
没有被过滤。测了一下,打穿了。。
1 | ?a={if:var_dump(((hex2bin(%2766696C655F6765745F636F6E74656E7473%27)))(%27../../../../../flag%27))}{end%20if} |
0x05
web5-easytrick
这题被队友打穿了。队友太强了。。
1 |
|
要求不说了。。其实就是一个php
的精度问题。我们可以使用的解有:
解法一
:
1 |
|
解法二
:
1 |
|
0x06
Conclusion
我是废物,队友乱C。