java代码审计自学:从爬虫到SSRF漏洞

0x00 前提

主要是因为自己的学习Java 代码审计中的学习思路吧,主要自己一个人学习,有点闭门造车,百度学习法,但是还是记录一下,也分享一下,也便于将来的总结和反思,如果我能终能学到什么,我也会重新梳理思路,为那些自学者提供一个好的思路,所以有了下面的系列文章java代码审计自学篇。

这个是因为刚刚造轮子,学习了一下Java的GUI是怎么写的,造了一个轮子,要写一个爬虫,由于中间出现了小bug,看了看网络请求这块,后来发现顺便就是把SSRF这个漏洞就一起研究。

0x01 SSRF漏洞

SSRF(Server-Side Request Forge, 服务端请求伪造),攻击者让服务端发起指定的请求,SSRF攻击的目标一般是从外网无法访问的内网系统。

这个不必多说了,直接copy吧

Java中的SSRF和PHP的有点区别:协议支持少一些,而且部分协议是受限的比如gopher协议,所以总体上来说Java的SSRF危害肯没PHP那么大。

通常 ssrf 容易出现的功能点,还是和php那些都一样:

基本上都是发起url请求的地方:

1、通过关键字 share、url、link、src、source、target、display、3g、target、domain、u

2、通过URL地址加载

3、下载图片、文章收藏功能

4、通过url 地址分享文章

0x02 详情介绍

最开始是看到了URLConnection写的爬虫,后来发现这个算是比较原始的了,相当于直接请求出去,接受回来的字节码的流文件,没啥处理,直接接受,后面都得自己处理,比如 charset都得自己去匹配,要不又的是GBK有的是UTF-8的,写的好烦

第一种:URLConnection 发起的请求

支撑的协议有

file ftp mailto http https jar netdoc gopher

注意:

gopher 实际在 jdk8 版本以后被阉割了,所以没有PHP那种SSRF那么牛逼了

先看一个简单的爬虫

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;

class URLConnectionDemo {

    public static void main(String[] args) throws IOException {

        URL url = new URL("https://www.baidu.com");
        // 打开和url之间的连接
        URLConnection connection = url.openConnection();
        // 设置请求参数 键-通过该请求是已知的(例如,“关键字Accept ”)
        connection.setRequestProperty("user-agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36");
        //设置指定的超时值
        connection.setConnectTimeout(1000);
        //如果是写爬虫的话,最后加上,要不一直抛出异常重试,实测如果写特别影响效率,尤其是全网乱爬
        //将读超时设置为指定的超时,以毫秒为单位
        connection.setReadTimeout(1000);
        // 建立实际连接
        connection.connect();

        // 获取响应头字段信息列表
        connection.getHeaderFields();
        System.out.println(connection.getHeaderFields());

        StringBuilder response = new StringBuilder();
        //获取流到缓冲区
        BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        String line;


        while ((line = in.readLine()) != null) {
            response.append(line);
        }

        System.out.print(response.toString());
    }
}

1、URL 建立一个对象, 调用openConnection 来获取一个 URLConnection 的实例

2、然后设置各种请求参数以及一些配置

3、使用其中的 connect 方法来发起请求,用 getInputStream 来获请求的响应流

4、最后接收自行处理

漏洞点

如果 URL 是可控的,那么就会存在 SSRF 漏洞

如果中间存在这句话,就不能使用gopher协议, 因为到不了发起请求的连接之前就会抛出异常中断

con.setRequestMethod("GET");

漏洞利用

URL 是可控的,file协议读取etc/passwd

URL url = new URL("file:///etc/passwd");

image-20200731140914542

第二种:限制过的http请求

还有一些封装过的http请求,这些其实都做过限制,或者要换协议直接抛异常了,所以鸡肋一些

大概就只能做内网探测了

HttpClient.execute
HttpClient.executeMethod
HttpURLConnection.connect
HttpURLConnection.getInputStream
URL.openStream
Request.Get(url).execute()

HttpClients漏洞示例

我后来改成这个做了爬虫,这个感觉兼容性不错的。

String url = request.getParameter("url");
CloseableHttpClient client = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(url);
//发起请求
HttpResponse httpResponse = client.execute(httpGet);

0x03 漏洞修复

  • 限制协议为HTTP、HTTPS协议。

  • 禁止URL传入内网IP或者设置URL白名单。

302跳转这个问题是,Java会默认跟随跳转,但是跳转是有协议限制的,gopher都不行,所以限制上面那些就可以了。

0x04 总结

总的来说,Java的SSRF 漏洞比较受到限制,而且大家也比较少用原生的,封装过的用多一些?

大概率只能:

  • 利用file协议任意文件读取 (限制在URLConnection这种方式)
  • 利用http协议端口探测
  • 利用 http 进行 ntlmrelay 攻击 (这种大家自己研究一下吧。。。)

Reference

凌天实验室–园长 Github javaweb-sec

https://joychou.org/java/javassrf.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
程声明:该课程是教学使用,视频内涉及漏洞利用方法,请勿在互联网环境中使用;维护互联网安全,人人有责。实验所需环境:vmware;kali虚拟机一台;windows server一台;有docker环境的Linux虚拟机环境下载地址在购买课程后单独发送 【课程配套资源】1、Python脚本(Margin老师自研,不光能学漏洞,还能学Python,实在是划算)2、与Margin老师实时互动3、免费的CISP-PTE考试技巧指导(Margin老师与CISP-PTE的负责人很熟的,非常多的一手消息^o^)4、Margin老师的内部直播可以优先参加5、Margin老师的课程基于CISP-PTE的知识体系进一步扩展,使课程内容更贴近实战   【课程主要解决问题】1、CSRF、SSRF搞不清楚?2、SSRF原理是什么?危害大小?如何利用SSRF获取主机权限?如果使用Python提高挖洞效率?3、Gopher协议、Dict协议?完全没听过啊,没关系,看完课程后你门清。4、SSRF渗透Redis数据库,Redis客户端和服务器端怎么通信?通信报文是怎么样的?看这里就行。5、SSRF渗透Struts2总是失败?不知道如何编码?不知道如何使用Gopher协议?来这里。6、SSRF表面简单,实则有无数坑,通过视频提高学习效率吧。 【CISP-PTE介绍】1、CISP-PTE是进入网络安全行业的TOP1认证,能帮你梳理完整的网络安全知识体系2、有PTE证书在网络安全公司是免技术笔试的,怎么样?是不是很棒。3、Margin老师的课程基于CISP-PTE的知识体系进一步扩展,使课程内容更贴近实战本课程属于CISP-PTE渗透测试工程师认证体系的课程,但内容更加丰富。CISP-PTE是国内第一个以动手实操为主的网络安全认证,该注册考试是为了锻炼考生世界解决网络安全问题的能力,持续增强我国的网络安全水平和防御能力,促进国内网络防御能力的不断提高。考试内容从多个层面进行,考点和网络安全动态相结合,真实的反应出真实的网络环境中发现的各种问题。如果要考取CISP-PTE证书需要掌握以下内容:1、Web安全基础,注入漏洞、上传漏洞、跨站脚本漏洞、访问控制漏洞、会话管理漏洞哦等。2、中间件的安全知识,如:Apache,IIS,Tomcat,以及 JAVA 开发的中间件 Weblogic,Jboss, Websphere 等,且要了解中间件加固方法,在攻与防的能力上不断提升。3、操作系统安全,包含Windows和Linux操作系统,从账户管理、文件系统权限、日志审计等方面讲解,了解常见的漏洞方式和加固方法。4、数据库安全,包含MSSQL、MYSQL、ORACLE、REDIS数据,了解常用的数据库漏洞和题全方法,保证数据库的安全性。 【关于Margin老师】· Margin/教育系统网络安全保障人员认证首批讲师/高级讲师· 擅长CTF/Web安全/渗透测试 /系统安全· 3年研发/擅长Java/Python/某银行现金循环机业务系统开发者· 曾参与开发网络安全认证教材· 知乎专栏/CISP-PTE渗透测试工程师学习· 4年线下网络安全讲师/2000+线下学员/100000+线上学员
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值