当前位置: 首页 > article >正文

JAVA-Exploit编写(1)--HttpURLConnection库使用

目录

1. HttpURLConnection简介

2.创建 HttpURLConnection请求.

2.1 HttpURLConnection的属性

2.2 设置相关的请求属性

2.3 设置请求头参数

3 使用GET方法进行请求

4.POST方法进行请求

4.1 常规使用

4.2 单独调用

 5. 设置代理

5.1 直接设置代理

5.2 配置Proxy代理类

 6.https请求协议引起的证书信任问题解决

6.1 解决方法:信任所有证书忽略检测

6.2 具体实现

6.3 未设置信任管理器下的请求

6.4 代码实现设置后

 


1. HttpURLConnection简介

        JDK 自带的 HttpURLConnection 标准库,是一个多用途、轻量级的http客户端。它对网络请求的封装没有Httpclient彻底,api比较简单,用起来没有那么方便。但是正是由于此,使得我们能更容易的扩展和优化的HttpURLConnection。HttpURLConnection继承URLConnection,底层socket,最原始通信,使用HttpURLConnection 发起 HTTP 请求最大的优点是不需要引入额外的依赖。但无法提供额外的功能.

2.创建 HttpURLConnection请求.

urlstring = "http://xxxx"
URL url=new URL(urlstring);//传入url
HttpURLConnection connection =(HttpuRLConnection)url.openConnection();

2.1 HttpURLConnection的属性

int getResponsecode();//获取服务器的响应代码。
String getResponseMessage();//获取服务器的响应消息。
string getResponseMethod();//获取发送请求的方法
void setRequestMethod(string method);//设置发送请求的方法

2.2 设置相关的请求属性

//设置连接超时时间
connection.setConnectTimeout(5000); //5*1000
//设置读取超时时间
connection.setReadTime0ut(15000);
//设置请求参数,即具体的 HTTP方法
connection.setRequestMethod("GET");
connection.setRequestMethod("POST");
//添加 HTTPHEAD中的一些参数,可参考《Java 核心技术 卷II》
connection.setRequestProperty("connection",“Keep-Alive”);
//设置是否向 httpUrlconnection 输出,
//对于post请求,参数要放在 http正文内,因此需要设为true。
// 默认情况下是false;
connection.setDo0utput(true);
//设置是否从 httpUrlconnection 读入,默认情况下是true;
connection.setDoInput(true);

2.3 设置请求头参数

//设置发送请求的类型
connection.setRequestProperty("content-Type","application/x-www-form-urlencoded");//设置浏览器头信息

3 使用GET方法进行请求

package com.deger;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

public class SendUtil {
    public static void main(String[] args) throws Exception{
        //调用方法
        System.out.println(doget("https://www.xxxxx.com", "name=admin"));
    }
    public static String doget(String urlstr,String params) throws Exception{
        // 接收返回结果
        String res = null;
        //创建url对象
        URL url = new URL(urlstr + "?" + params);
        // 通过url对象获取 HttpURLConnection对象
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        //设置请求方法
        connection.setRequestMethod("GET");
        //设置连接超时时间毫秒
        connection.setConnectTimeout(5000); //5*1000
        //设置主机读取的响应时间毫秒
        connection.setReadTimeout(5000);
        //...设置请求头信息等等

        //发起请求
        connection.connect();
        
        //获取状态码
        int responseCode = connection.getResponseCode();
        if (responseCode == HttpURLConnection.HTTP_OK) {
            // 响应字节流 connection.getInputStream()
            // 将字节流转为为字符流 InputStreamReader
            // BufferedReader 缓冲输入流
            BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
            StringBuffer sb = new StringBuffer();
            String line=null;
            while ((line=br.readLine())!=null){
                sb.append(line);
            }
             res = sb.toString();
        }
        connection.disconnect();
        return res;
    }
}

测试服务器可以用PHPStudy搭建环境,下面是test.php文件的代码

<?php
var_dump($_REQUEST);

4.POST方法进行请求

4.1 常规使用

public static void main(String[] args) throws Exception{
        //调用方法
//        System.out.println(doget("http://127.0.0.1/test.php?username=1234"));
        System.out.println(dopost("http://127.0.0.1/test.php","username=hacker"));
    }

//post方法进行请求
    public static String dopost(String urlstr,String params) throws Exception{

        // 接收返回结果
        String res = null;
        //创建url对象
//        URL url = new URL(urlstr + "?" + params);
        URL url = new URL(urlstr);
        // 通过url对象获取 HttpURLConnection对象
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        //设置请求方法
        connection.setRequestMethod("POST");
        //设置连接超时时间毫秒
        connection.setConnectTimeout(5000); //5*1000
        //设置主机读取的响应时间毫秒
        connection.setReadTimeout(5000);

        //设置正文的请求
        connection.setDoOutput(true);
        //设置请求的类型是 application/x-www-form-urlencoded application/json
        connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        //设置请求的浏览器信息(请求头)
        connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3");


        //发起请求--最后需要关闭连接
        connection.connect();

        //设置正文的数据
        OutputStream outputStream = connection.getOutputStream();
        outputStream.write(params.getBytes("UTF-8"));
        //获取状态码
        int responseCode = connection.getResponseCode();
        if (responseCode == HttpURLConnection.HTTP_OK) {
            // 响应字节流 connection.getInputStream()
            // 将字节流转为为字符流 InputStreamReader
            // BufferedReader 缓冲输入流
            BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
            StringBuffer sb = new StringBuffer();
            String line=null;
            while ((line=br.readLine())!=null){
                sb.append(line);
            }
            res = sb.toString();
        }
        //关闭连接
        connection.disconnect();
        return res;
    }

4.2 单独调用

单独创建一个主函数,然后来调用也是可以的 

package com.deger;

public class Main {
    public static void main(String[] args) throws Exception{
       //写逻辑,然后调用工具类的方法就可以了
        String doget = SendUtil.doget("http://127.0.0.1/test.php?username=admin");
        System.out.println(doget);
        String dopost = SendUtil.dopost("http://127.0.0.1/test.php", "username=hacker");
        System.out.println(dopost);
    }
}

 5. 设置代理

5.1 直接设置代理

System.setProperty("http.proxyHost","127.0.0.1");
System.setProperty("http.proxyPort","8888");
L url = new URL(urlstr);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();

5.2 配置Proxy代理类

//配置代理类
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetsocketAddress("127.0.8.1",8888));
URL url = new URL(path);
//通过代理类建立连接
HttpURLConnection conn =(HttpURLconnection)url.openonnection(proxy);

burp多添加一个代理端口

注意抓到的包的UA头,为了防止服务器监测,可以在创建HttpURLConnection后,在发送请求前时设置UA头 

抓到的包可以发送到burp的重放器模块,然后或者其他模块,然后就可以进行测试了 

 6.https请求协议引起的证书信任问题解决

         现在多数的网站都是https协议 网站是https请求的是http会出现错,可以使用 URL中的 httpsURLconnection 这个协议是请求https请求但是还要设置证书

6.1 解决方法:信任所有证书忽略检测

信任管理器

final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
        @Override
        public boolean verify(String hostname, SSLSession session) {
            return true; // 将所有验证的结果都设为true,不进行主机名验证
        }
    };

    private static void trustAllHosts()  {
        final String TAG = "trustAllHosts";


            // 创建信任所有证书的信任管理器
            TrustManager[] trustAllCerts = new TrustManager[]{
                    new X509TrustManager() {
                        @Override
                        public X509Certificate[] getAcceptedIssuers() {
                            return new X509Certificate[]{};
                        }

                        @Override
                        public void checkClientTrusted(X509Certificate[] chain, String authType) {
                            // 不做任何检查,信任所有客户端证书
                        }

                        @Override
                        public void checkServerTrusted(X509Certificate[] chain, String authType) {
                            // 不做任何检查,信任所有服务器证书
                        }
                    }
            };

            // 安装信任管理器
            try {
                SSLContext sc = SSLContext.getInstance("TLS");
                sc.init(null, trustAllCerts, new SecureRandom());
                HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

6.2 具体实现

//get方法进行请求
    public static String doget(String urlstr) throws Exception{
        HttpURLConnection connection;
        HttpsURLConnection httpsURLConnection;
        
        //设置一代理类
        Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 8888));
        // 需要删掉这个参数String params
        // 接收返回结果
        String res = null;
        //创建url对象
//        URL url = new URL(urlstr + "?" + params);
        URL url = new URL(urlstr);
        // 处理http与https
        trustAllHosts();

        httpsURLConnection = (HttpsURLConnection)url.openConnection(proxy);
        //判断是https请求还是http请求
        if (url.getProtocol().toLowerCase().equals("https")) {
            httpsURLConnection.setHostnameVerifier(DO_NOT_VERIFY);
            connection = httpsURLConnection;
        } else {
            connection = (HttpURLConnection) url.openConnection();
        }

        //设置请求方法
        connection.setRequestMethod("GET");
        //设置连接超时时间毫秒
        connection.setConnectTimeout(5000); //5*1000
        //设置主机读取的响应时间毫秒
        connection.setReadTimeout(5000);
        //...设置请求头信息等等

        //发起请求--最后需要关闭连接
        connection.connect();

        //获取状态码
        int responseCode = connection.getResponseCode();
        if (responseCode == HttpURLConnection.HTTP_OK) {
            // 响应字节流 connection.getInputStream()
            // 将字节流转为为字符流 InputStreamReader
            // BufferedReader 缓冲输入流
            BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
            StringBuffer sb = new StringBuffer();
            String line = null;
            while ((line = br.readLine()) != null){
                sb.append(line);
            }
            res = sb.toString();
        }
        //关闭连接
        connection.disconnect();
        return res;
    }

6.3 未设置信任管理器下的请求

6.4 代码实现设置后

 


http://www.kler.cn/a/506721.html

相关文章:

  • qml LevelAdjust详解
  • 【后端面试总结】tls中.crt和.key的关系
  • 网络安全 | 什么是威胁情报?
  • TensorFlow深度学习实战(5)——神经网络性能优化技术详解
  • 【JavaEE进阶】SpringMVC 响应
  • 【leetcode 13】哈希表 242.有效的字母异位词
  • Vue2+OpenLayers给2个标点Feature分别添加独立的点击事件(提供Gitee源码)
  • 细说STM32F407单片机窗口看门狗WWDG的原理及使用方法
  • 【数据可视化-12】数据分析岗位招聘分析
  • 开源在线聊天服务Fiora本地搭建个性化社交网络定制专属聊天工具
  • 校园能源管理:从困境到突破的智慧之旅
  • 数据结构、数据类型、数字编码、字符编码:保姆级图文详解
  • K8S 亲和性与反亲和性 深度好文
  • 使用jupyter notebook没有正常打开浏览器的几种情况解决
  • frameworks 之 AMS与ActivityThread交互
  • LLaMA Pro是什么 相比于lora full freeze有什么区别 怎么使用
  • [Qt]常用控件介绍-输入类控件-QLineEdit、QTextEdit、QComboBox控件
  • Jmeter代理录制脚本
  • Vscode——SSH连接不上的一种解决办法
  • Linux 进程前篇(冯诺依曼体系结构和操作系统)
  • Linux浅谈——管道、网络配置和客户端软件的使用
  • ubuntu 系统 ,docker建的服务 ,其他局网机器可以通过IP:端口的方式访问。不是docker的不行。
  • 高阶数据结构之B树
  • 三大智能体平台对比分析:FastGPT、Dify、Coze 哪个更适合你?
  • 如何用python部署本地ocr脚本
  • macos arm 本地/docker/本地k8s 安装jupyterhub 并登陆