0%

通配符绕过

参考链接

linux下的 ?绕过拦截【通配符绕过】

参考wp

津门杯CTF Web Write-Up万字详解

0x00 前言 今天写篇有关绕过/[a-zA-Z0-9_@$]+/的知识点总结

ctfhub上做了一道题,令我大受震撼。

0x01 题目搭建

一开始在自己的阿里云服务器上搭建了这个环境,但却复现不出来。。。甚至收到了一个报警邮件。搞了半天,感觉应该是服务器的环境太安全了。我图省事直接用的宝塔,估计他的默认安全配置应该就挺高的,再加上用的服务器是阿里云的,估计很多简单的洞都已经默认防御了。并且我现在严重怀疑上次的强网杯2021-whereisuwebshell半复现最后没成功应该也是哪里的安全配置太高了。

所以我觉得不能在图省事了,应该完全自己动手去做。

然后我决定先不使用服务器,还是用虚拟机来做,这样操作起来简单一些,并且可以从一个真正纯白的系统开始。我选择了ubantu20.04.2.0,在官网下载了镜像之后,熟练的创建虚拟机。随便找个教程安装了apache2phpmysql

便可以把这道题目环境搭起来了。在我没有进行任何有关安全的配置后,果然就打通了🙃。

在虚拟机上搭服务器唯一的缺点可能就是无法在互联网上访问吧。充其量就是在内网里可以访问,但我觉得这对于学习还是很有帮助的。

0x02 解题思路

1
2
3
4
5
6
7
8
9
10
11
12
<?php
//题目源码
error_reporting(0);
if(!isset($_GET['code'])){
highlight_file(__FILE__);
}else{
$code = $_GET['code'];
if(preg_match("/[A-Za-z0-9_$@]+/",$code)){
die('fighting!');
}
eval($code);
}

这道题的核心是/[A-Za-z0-9_$@]+/。有一些其他类似的题目只是匹配了大小写字母和数字,那种题的解法多是通过异或符号,即两个字符做异或运算在php里可以得到另外一个字符,最后构造出payload。详细的过程在文章开头的参考链接和参考wp里已经写的很清楚了,因为时间原因(指军训晚上组织看电影看到晚上11点半😥)我就不赘述了。

但上面的方法最后的payload 一定会有$_字符。在本题中均进行了过滤。通过wp,学习到,本题是用linux系统下的通配符进行的绕过。例如:在命令行执行 /bin/cat /flag 便可以得到flag,但多数情况下也可以这样写 /???/??? /????。但在我的系统里/???/???匹配到的并不是cat,在ctfhub上的环境上确实可以匹配到cat。虽然这样,但还是令我大受震撼。

0x03 小结

更详细的就不说了,这两天发现自己搭环境确实挺难的。以后做题可能也都会尝试自己本地尽量搭建。不多说了,睡觉觉了😴。