原理

SSRF(Server-side Request Forge )服务器端请求伪造, 由于服务端提供了从其他服务器应⽤获取数据的功能,但没有对地址和协议等做过滤和限制。使得攻击者可以利⽤存在缺陷的web应⽤作为代理,攻击其远程和本地的服务器。

造成危害原因

1.防火墙:防火墙部署在内外网之间

2.ssrf利用内网应用缺陷,对内网发起请求。不经过防火墙

3.获取内网信息。探测内网信息

漏洞产生原因

1.服务端提供了从其他服务器应⽤获取数据的功能。
2.没有对⽬标地址,做过滤与限制。
例:
从指定URL地址获取⽹⻚⽂本内容,加载指定地址的图⽚,⽂
档等。

SSRF漏洞相关函数

1.file_get_contents()
功能:把整个⽂件读⼊⼀个字符串中,获取本地或者远程⽂件内容
语法:file_get_contents(path,include_path,context,start,max_length)

 

 

实例:

 

 

2.fsockopen()
功能:获得套接字信息
开启:编辑 PHP.ini 中 allow_url_fopen 选项allow_url_fopen = On
参数:
hostname:如果安装了OpenSSL,那么你也许应该在你的主机名地址前⾯添加访问协议ssl://或者是tls://,从⽽可以使⽤基于TCP/IP协议的SSL或者TLS的客户端 连接到远程主机。
port:端⼝号。如果对该参数传⼀个-1,则表示不使⽤端⼝,例如unix://。
errno:如果errno的返回值为0,⽽且这个函数的返回值为 FALSE ,那么这表明该错误发⽣在套接字连接(connect())调⽤之前,导致连接失败的原因最⼤的可能   是初始化套接字的时候发⽣了错误。
errstr:错误信息将以字符串的信息返回。
timeout:设置连接的时限,单位为秒

实例:

 

 

3.curl_exec()  该函数后续研究
功能 : 执⾏⼀个cURL会话, 这个函数应该在初始化⼀个cURL会话并且全部的选项都被设置后被调⽤。
语法:mixed curl_exec ( resource $ch )
参数: ch 由 curl_init() 返回的 cURL 句柄。

实例

 

 

curl使⽤curl –version查看版本以及⽀持的协议

 

 

4.fopen()
功能: 打开⽂件或者 URL
语法:fopen(filename,mode,include_path,context)

参数:

 

 

如果 PHP 认为 *filename* 指定的是⼀个本地⽂件,将尝试在该⽂件上打开⼀个流。该⽂件必须是 PHP 可以访问的,因此需要确认⽂件访问权限允许该访问。如果激活了安全模式或者 open_basedir 则会应⽤进⼀步的限制。

如果 PHP 认为 *filename* 指定的是⼀个已注册的协议,⽽该协议被注册为⼀个⽹络URL,PHP 将检查并确认 allow_url_fopen 已被激活。如果关闭了,PHP 将发出⼀个警告,⽽ fopen 的调⽤则失败。

实例:

 

 

5.readfile()

功能: 输出⼀个⽂件, 读⼊⼀个⽂件并写⼊到输出缓冲语法:readfile(*filename*,*include_path*,*context*)

 

 

如果在 php.ini ⽂件中 "fopen wrappers" 已经被激活,则在本函数中可以把 URL 作为⽂件名来使⽤。

SSRF用到的协议

(1)FILE协议

File协议主要⽤于访问本地计算机中的⽂件,就如同在Windows资源管理器中打开
⽂件⼀样。可以⽤于读取⽂件进⾏查看,如:file:///C:/

 

 

(2)dict协议

dict://⽹络协议可以⽤于探测或者扫描内⽹端⼝,在SSRF中发挥重要的作⽤

(3)GOPHER协议

Gopher是Internet上⼀个⾮常有名的信息查找系统,它将Internet上的⽂件组织成某种索引,
很⽅便地将⽤户从Internet的⼀处带到另⼀处。
在WWW出现之前,
Gopher是Internet上最主要的信息检索⼯具,Gopher站点也是最主要的站点,
使⽤tcp70端⼝。但在WWW出现后,Gopher基本过时很少使⽤。
gopher协议⽀持发出GET、POST请求:可以先截获get请求包和post请求包,在构成符合gopher协议的请求。攻击内⽹应⽤,如FastCGI、Redis 。
协议格式:URL:gopher://<host>:<port>/<gopher-path>_后接TCP数据流

●gopher的默认端⼝是70
●如果发起post请求,回⻋换⾏需要使⽤%0d%0a,如果多个参数,参数之间的 &也需要进⾏URL编码

Dict服务器和客户机使⽤TCP端⼝2628。

 

3.靶场练习:
(1)SSRF基于(curl_exec)函数

curl⽀持很多协议,有FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE
以及LDAP

Payload:http协议
http://www.pikachu.com/vul/ssrf/ssrf_curl.php?url=http://baidu.com

file协议
http://www.pikachu.com/vul/ssrf/ssrf_curl.php?url=file:///E:/1.txt

dict协议
http://www.pikachu.com/vul/ssrf/ssrf_curl.php?url=dict://127.0.0.1:3306
(2)SSRF基于(file_get_content)函数
Payload: http协议
http://www.pikachu.com/vul/ssrf/ssrf_fgc.php?file=http://baidu.com

Payload:file协议
http://127.0.0.1/pikachu/vul/ssrf/ssrf_fgc.php?file=file://E:/1.txt

漏洞防范

1.通过正则表达式编写不允许访问本机和内⽹
2.⽤户指定("或者预埋在前端的请求")的地址进⾏资源请求,则请做好⽬标地址的 过滤
3.限制协议只为HTTP、HTTPS, 减少其他如file://、gopher://和ftp://等可能引起的问题 协议
4.禁⽌3xx跳转, 重定向
5.设置URL⽩名单或者限制内⽹IP

业务场景

1.分享:通过URL地址分享⽹⻚内容
2.转码服务(⼿机适配)
3.在线翻译(百度翻译搜索检索IP的⽹址:http://www.ip.cn )
4.图⽚加载与下载:通过URL地址加载或下载图⽚
5.图⽚、⽂章收藏功能
6.未公开的api实现以及其他调⽤URL的功能
7.从URL关键字中寻找(share、wap、url、link、src、source、target、sourceURI、imageURL、domain )

总:会通过网络加载文件,加载资源。

危害

具体危害取决于,内⽹和本机涉及哪些漏洞有什么功能
1.对⽬标服务器所在的内⽹进⾏IP存活性扫描和端⼝扫描
2.利⽤扫描的指纹信息判断开放的服务,从⽽对内⽹的主机进⾏攻击
3.识别内⽹WEB应⽤指纹,判断应⽤类型进⾏攻击
4.使⽤特定协议攻击应⽤(gopher、dict、file、FTP/ SFTP等)
5.扫描内⽹开放的端⼝
6.读取主机任意⽂件
7.攻击内⽹应⽤,如redis,mysql等。
8.可以向内部任意主机的任意端⼝发送精⼼构造的数据包payload

挖掘思路

白盒

找相关函数

黑盒

能发起网络请求的地方就可能存在SSRF

看URL传参,url中出现协议和域名,就有可能存在url=http://此处可以是dnslog域名。
url=file://
相关关键字:share、wap、url、link、src、source、target、display、sourceURl、imageURL、domain



原文地址:http://www.cnblogs.com/jdslf/p/16867495.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性