nikto 扫描报 0 host(s) tested 与 Web 服务器漏洞扫描用法
Nikto 是一个开源的 Web 服务器扫描器,用于检查服务器上的危险文件、过时组件、默认配置与常见响应头缺失。它把请求发往目标 Web 端口,用内置特征库逐条比对,最后给出条目清单。
仅供已获得书面授权的安全测试使用。
安装与版本
Kali 自带 Nikto。先确认版本:
bash
nikto -Version
实测环境为 Kali GNU/Linux Rolling 2025.4(内核 6.16.8+kali-amd64),返回:
Nikto 2.5.0 (LW 2.5)
Debian/Ubuntu 系也可以直接安装:
bash
sudo apt update && sudo apt install -y nikto
基本用法
最小可用命令是指定主机与端口:
bash
nikto -h 127.0.0.1 -p 8080
下面是一次针对本地 8080 端口的真实扫描回显,已截取:
- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP: 127.0.0.1
+ Target Port: 8080
+ Server: SimpleHTTP/0.6 Python/3.13.9
+ /: The anti-clickjacking X-Frame-Options header is not present.
+ /: The X-Content-Type-Options header is not set.
+ SimpleHTTP/0.6 appears to be outdated (current is at least 1.2).
+ 8078 requests: 4 error(s) and 11 item(s) reported on remote host
+ End Time: 2026-10-14 16:32:29 (GMT8) (22 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested
每个 + 行是一条发现。最后一行 + N host(s) tested 表示实际完成扫描的目标数,这个数字是后续排查的入口。
报错 0 host(s) tested
把端口换成一个没有监听的端口:
bash
nikto -h 127.0.0.1 -p 8099
返回只剩头尾,没有条目:
- Nikto v2.5.0
---------------------------------------------------------------------------
---------------------------------------------------------------------------
+ 0 host(s) tested
0 host(s) tested 的含义不是「没有漏洞」,而是根本没连上目标。常见三种原因:
- 端口没监听或写错,先用
nmap -p 8099 127.0.0.1确认端口是否 open; - 目标在防火墙后,SYN 被丢弃,表现与端口关闭一致;
- 目标其实是 HTTPS 却按明文 HTTP 扫,需要显式加
-ssl。
换成确认开放的端口再扫,就会出现与上面一致的 1 host(s) tested。
报错:扫描结束后卡在提交提示
第一次扫陌生服务器时,Nikto 常在结尾停住不动:
Portions of the server's headers (Python/3.13.9) are not in
the Nikto 2.5.0 database or are newer than the known string. Would you like
to submit this information (*no server specific data*) to CIRT.net
for a Nikto update (or you may email to sullo@cirt.net) (y/n)?
这是服务器 banner 不在本地特征库里,Nikto 询问是否把该信息提交回官方数据库。它不是报错。自动化脚本里应预先关掉这个交互:
bash
nikto -h 127.0.0.1 -p 8080 -ask no
-ask 有三个取值:yes 每次询问(默认)、no 不询问也不发送、auto 不询问直接发送。
扫描前的连通性确认
Nikto 不负责判断端口是否开放,扫描前先用 nmap 把面探清楚:
bash
nmap -sV -p 80,443,8080,8443 192.168.1.10
输出里 open 的端口才是 Nikto 的有效目标。对同一个主机同时存在 80 与 443 时,要分别扫两次,HTTP 与 HTTPS 的特征库判断不同:
bash
nikto -h 192.168.1.10 -p 443 -ssl
分场景用法
把结果落成 JSON,便于批量收集后统一处理:
bash
nikto -h 127.0.0.1 -p 8080 -o nikto.json -Format json
只关心指定类型的检查项时用 -Tuning,例如只跑配置类(2)与注入类(4):
bash
nikto -h 127.0.0.1 -p 8080 -Tuning 24
给长时间扫描加一个上限,避免跑不完就中断:
bash
nikto -h 127.0.0.1 -p 8080 -maxtime 30s
需要看到全部 200 响应与 HTTP 错误时,打开显示开关:
bash
nikto -h 127.0.0.1 -p 8080 -Display 3E
规避 WAF 的编码技巧
-evasion 用编码变形绕过简单规则拦截。例如把请求里的字符做随机 URI 编码:
bash
nikto -h 127.0.0.1 -p 8080 -evasion 1
用 /./ 做目录自引用绕过路径规范化:
bash
nikto -h 127.0.0.1 -p 8080 -evasion 2
取值从 1 到 8 以及 A、B,含义在 nikto -Help 里有完整列表。开启后请求数会上升,且可能触发 WAF 告警,只在授权测试里用。
结果怎么读
Nikto 的 + 行大致分三类,处理优先级不同:
- 响应头类,如
The anti-clickjacking X-Frame-Options header is not present,属于加固建议,可以批量修复; - 组件与版本类,如
appears to be outdated,要先落到实际组件版本再定; - 路径与文件类,如
#wp-config.php# file found,优先级最高,需立即人工确认该文件是否真能读到。
特征库里有一批通用猜测条目,例如对 /%2e/、// 的判断来自规则匹配,命中不代表该服务器真有对应问题。判定方式是手工访问一次该路径,看返回内容是否真的暴露信息。
结尾的 4 error(s) and 11 item(s) reported 中,item(s) 是发现的条目数,error(s) 是请求失败数,两者都要看,错误率高说明这次扫描本身不稳定。
一次完整评估的流程
先确认端口与协议,再按对象分流:
bash
nmap -sV -p- 192.168.1.10 -oN ports.txt
对每个开放的 Web 端口分别扫描,HTTP 与 HTTPS 分开跑:
bash
nikto -h 192.168.1.10 -p 80 -ask no -o http-80.json -Format json
nikto -h 192.168.1.10 -p 443 -ssl -ask no -o https-443.json -Format json
最后把 JSON 归档,逐条复核头缺失与文件类条目。整个流程里 Nikto 只负责列出可能的问题,不负责判定可利用性。
适用边界
Nikto 面向 HTTP/HTTPS 服务端,不覆盖前端 JavaScript 逻辑,也不会登录后再扫描。它的特征库偏向常见 Web 服务器与应用的历史问题,对自研框架的误报与漏报都偏多。真正判定某个条目是否可利用,仍需回到请求与响应本身。它适合做第一轮的资产面清点,不适合作为漏洞结论的唯一来源。
注意事项
+ 0 host(s) tested一律先按连通性问题处理,不要当成「资产干净」。- Nikto 是特征匹配扫描器,报出的条目里有相当一部分是 banner 误报,需要人工二次确认。
-Tuning能大幅减少请求数,但也会漏检,正式评估不要为图快裁检查项。- 默认会尝试把 banner 信息提交到 CIRT.net,内网或客户环境建议用
-ask no明确关闭。 - 请求量很大,上面一次小站点就是 8078 个请求,对生产站点务必限速或安排在窗口期执行。