SSRF原理
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
参考链接:https://baijiahao.baidu.com/s?id=1730527553242243943&wfr=spider&for=pc
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下