zoukankan      html  css  js  c++  java
  • SSRF漏洞挖掘利用技巧

    参考文章


    概述


    总结
    利用一个可以发起网络请求的服务当作跳板来攻击内部其他服务。


    一、漏洞介绍

    SSRF(Server-Side Request Forgery:服务器端请求伪造)


    二、漏洞原理

    由于服务端提供了从其他服务器应用获取资源的功能,但又没有对目标地址做严格过滤与限制,导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据。

    数据流:攻击者--->服务器--->目标地址


    三、漏洞危害

    • 内网信息泄露(端口、物理路径、配置信息、本地文件泄露等)
    • 内网或本地其他服务收到攻击,(DDos)
    • 穿透防火墙
    • 对内网web应用进行指纹识别,通过访问默认文件实现;

    四、利用前提

    • 目标网站获取资源的方式
    • 可以控制目标网站获取指定资源,或向指定站点获取资源
    • 获取指定资源后,顺利通过过滤,成功执行
    • 可以获取过滤后或执行后的内容

    五、挖掘利用

    1、使用curl会话请求

    描述
    利用curl会话请求,获取相关地址的资源。

    挖掘
    因为可以通过GET请求、POST请求等方式,获取用户想要的目标资源,所以该漏洞的挖掘思路只能是判断观察服务器用户什么数据并执行(如给定数据https://www.baidu.com,观察是否访问了百度)
    支持的协议dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp

    利用
    使用http、https等协议,搜寻我们想要的信息。下面以GET型举例

    //探测端口、内网IP、等
    ?curl=http://127.0.0.1:80
    
    //探测服务器物理目录、文件等
    ?curl=file:///C:/Windows/System32/drivers/etc/hosts
    
    

    2、file_get_contents()

    描述
    该函数是用于把文件的内容读入到一个字符串中的首选方法。但是实际情况下,常常会输出它。且该函数时二进制安全的。可以用它获取相关地址的资源。

    挖掘
    同上。

    利用
    不明,可以使用file、http、https。

    3、fsockopen()

    4、SSRF in java

    网络请求支持的协议如下:http,https,file,ftp,mailto,jar,netdoc
    以下几种类引用不当会造成SSRF :Request类,URL类的openStream,HttpClient类,URLConnection和HttpURLConnection类,

    5、SSRF in python

    当使用了Python 的urllib库,请求url为用户可控时,就可能存在ssrf漏洞,且可以通过漏洞python urllib http头注入实现对内网未授权仿问的redis 服务器getshell

    6、挖掘方向

    • 分享:通过url地址分享网页内容
    • 转码服务:通过url地址把源地址的网页内容调优使其适合手机屏幕浏览
    • 在线翻译:通过url地址翻译对应文本的内容
    • 能够对外发起网络请求的地方
    • 请求远程服务器资源的地方
    • 图片、文章、文件收藏功能
    • 未公开的api实现以及其他调用url的功能
    • 寻找关键字:share wap url link src source target u 3g display sourceURl imageURL domain(配合谷歌语法寻找)

    7、绕过技巧

    1.IP限制绕过

    locahost绕过
    攻击本地地址,过滤掉127.0.0.1的情况下,用locahost替代
    [::]绕过
    过滤掉locahost,可使用[::]替代
    利用@
    http://example.com@127.0.0.1
    利用短地址
    http://dwz.cn/11SMa (这个不太清楚)
    进制转换绕过
    十进制转换 八进制转换 十六进制转换  不同进制组合转换
    例如将192.168.0.1改写成:

    8进制格式:0300.0250.0.1
    10进制整数格式:3232235521
    16进制格式:0xC0.0xA8.0.1
    16进制整数格式:0xC0A80001
    

    利用Enclosed alphanumerics

    利用Enclosed alphanumerics
    ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ  >>>  example.com
    List:
    ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳ 
    ⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇ 
    ⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛ 
    ⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵ 
    Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ 
    ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ 
    ⓪ ⓫ ⓬ ⓭ ⓮ ⓯ ⓰ ⓱ ⓲ ⓳ ⓴ 
    ⓵ ⓶ ⓷ ⓸ ⓹ ⓺ ⓻ ⓼ ⓽ ⓾ ⓿
    

    利用句号
    127。0。0。1  >>>  127.0.0.1
    利用302跳转
    如果后端服务器在接收到参数后,正确的解析了URL的host,并且进行了过滤,我们这个时候可以使用302跳转的方式来进行绕过。
    http://xip.io 当我们访问这个网站的子域名的时候,例如192.168.0.1.xip.io,就会自动重定向到192.168.0.1。
    DNS Rebinding
    对于常见的IP限制,后端服务器可能通过下图的流程进行IP过滤

    对于用户请求的URL参数,首先服务器端会对其进行DNS解析,然后对于DNS服务器返回的IP地址进行判断,如果在黑名单中,就pass掉。
    但是在整个过程中,第一次去请求DNS服务进行域名解析到第二次服务端去请求URL之间存在一个时间查,利用这个时间差,我们可以进行DNS 重绑定攻击。
    要完成DNS重绑定攻击,我们需要一个域名,并且将这个域名的解析指定到我们自己的DNS Server,在我们的可控的DNS Server上编写解析服务,设置TTL时间为0。这样就可以进行攻击了,完整的攻击流程为:

    (1)、服务器端获得URL参数,进行第一次DNS解析,获得了一个非内网的IP
    
    (2)、对于获得的IP进行判断,发现为非黑名单IP,则通过验证
    
    (3)、服务器端对于URL进行访问,由于DNS服务器设置的TTL为0,所以再次进行DNS解析,这一次DNS服务器返回的是内网地址。
    
    (4)、由于已经绕过验证,所以服务器端返回访问内网资源的结果。
    

    2.协议限制绕过

    当url协议限定只为http(s)时,可以利用follow redirect 特性
    构造302跳转服务,
    结合dict:// file:// gopher://


    六、修复防范

    如果一定要通过后台服务器远程去对用户指定("或者预埋在前端的请求")的地址进行资源请求,则请做好目标地址的过滤(黑白名单)。

    • 限制协议为HTTP,HTTPS ,或禁止使用不需要的协议
    • 设置URL白列表或限制内网IP
    • 过滤返回信息
    • 统一错误信息
    • 限制请求的端口为http常用的端口

    七、提出问题

  • 相关阅读:
    leetcode 155. Min Stack 、232. Implement Queue using Stacks 、225. Implement Stack using Queues
    leetcode 557. Reverse Words in a String III 、151. Reverse Words in a String
    leetcode 153. Find Minimum in Rotated Sorted Array 、154. Find Minimum in Rotated Sorted Array II 、33. Search in Rotated Sorted Array 、81. Search in Rotated Sorted Array II 、704. Binary Search
    leetcode 344. Reverse String 、541. Reverse String II 、796. Rotate String
    leetcode 162. Find Peak Element
    leetcode 88. Merge Sorted Array
    leetcode 74. Search a 2D Matrix 、240. Search a 2D Matrix II
    Android的API版本和名称对应关系
    spring 定时任务执行两次解决办法
    解析字符串为泛型的方法
  • 原文地址:https://www.cnblogs.com/gorillalee/p/14342626.html
Copyright © 2011-2022 走看看