首页 > 编程语言 >JAVA-Exploit编写(1)--HttpURLConnection库使用

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

时间:2025-01-18 19:28:45浏览次数:3  
标签:JAVA String -- connection url Exploit new 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 代码实现设置后

 

标签:JAVA,String,--,connection,url,Exploit,new,HttpURLConnection,请求
From: https://blog.csdn.net/weixin_72543266/article/details/145175052

相关文章

  • 揭秘“弈搏术”:从神秘技能到思维策略
    一、引入:“弈搏术”初印象最近重温《通天狄仁杰》,再次被剧中狄大人的智慧折服。剧中有一幕让我印象深刻:狄大人被22名杀手围攻,他却丝毫不慌,手指飞速掐算,瞬间就洞悉了敌人的进攻路线和破绽。紧接着,他就地取材,利用周围的环境布置出一个巧妙的阵法,一举将杀手们全部击退。还有......
  • JAVA-Exploit编写(2)--HttpClient库使用
    目录1.HttpClient简介1.1ApacheHttpClient特性1.2 ApacheHttpClient使用流程2.依赖导入3.HttpClient属性4.GET方式请求4.1 test2.php4.2不携带参数请求 4.3 携带参数提交4.4 支持URIBuilder对象的使用 5.POST请求5.1test3.php5.2 单个参数提交......
  • Vue3 自定义Hooks完全指南
    目录1.前言2.什么是Hooks2.1Hooks的定义2.2为什么需要Hooks2.3与Vue2的区别3.Hooks的实现原理3.1响应式系统3.2生命周期集成3.3依赖注入系统4.Hooks的作用与应用场景4.1常见应用场景4.2实际案例分析5.Hooks的优缺点5.1优点5.2缺点6.Hooks的书写规范6......
  • “洋悟运动”之己见
    作为常驻B站人,之前我对小红书的印象是什么?AI图片集散地?国内版Instagram?还是“生活记录”?就在两天前,外国人就占据了这款软件的半壁江山。我很疑惑。实际上,我一直对这次的“暴发”有一个猜想。是否存在这些内容全部为AI生成的可能?至少,在一开始得知这次事件时,我是这么......
  • if-else对比switch-case
    概述在编程中,控制流语句用于控制程序的执行路径。if-else和 switch-case是两种常见的控制流语句,分别适用于不同的场景。了解它们的区别和最佳使用场景,有助于编写更高效、可读性更强的代码。if-else结构1.基本语法if-else语句根据布尔表达式的结果来选择执行不同的代码块。其......
  • 寒假学习日记8
    今天主要是有关服务器查看自己系统和版本 .使用uname命令uname命令可以提供关于系统的基本信息。查看操作系统名称:uname-o查看操作系统的版本和内核版本:uname-a要查看服务器的架构(即处理器架构),你可以使用以下几种方法:.使用uname-m命令uname-m会显......
  • 有一个包含开始时间和结束时间的数组,要求日期从早到晚有连贯性,不能出现重叠,用JAVA判断
    packagecom.cfb.oa.m;importjava.time.LocalDate;importjava.util.ArrayList;importjava.util.List;classDateRange{LocalDatestart;LocalDateend;publicDateRange(LocalDatestart,LocalDateend){this.start=start;th......
  • 使用 AWS CLI 管理 EMR
    AmazonEMR(ElasticMapReduce)是一种托管的大数据处理服务,使用户能够在云上便捷、快速地运行和管理大规模数据分析和处理任务。创建EMR集群创建默认IAM角色:awsemrcreate-default-roles查询EMR版本:awsemrlist-release-labels创建EMR集群:awsemrcrea......
  • 将IDEA的setter代码模板改成链式setter
    setter传统模式UserInfouserInfo=newUserInfo();userInfo.setUserId("zhangsan");userInfo.setUserName("张三");userInfo.setAge(18);每一行都需要分号来隔断,影响编码效率。链式setterUserInfouserInfo=newUserInfo().setUserId("zhangsan").setUserNam......
  • 图书馆管理系统javaweb(含数据库脚本)
    图书馆管理系统javaweb(含数据库脚本),tomcat7eclipsejdk1.8包含数据库文件列表BookLibrarySystem-master/.classpath , 9020BookLibrarySystem-master/.project , 1639BookLibrarySystem-master/.settings/.jsdtscope , 499BookLibrarySystem-master/.settings/org.ec......