Java编写敏感文件扫描工具


发布人:admin分类:网络安全浏览量:24发布时间:2017-12-12

在渗透测试过程中,扫描敏感目录文件是一件非常重要的事情,那么接下来,我们就用Java来做一个目录扫描的Demo。同样,对于网络编程一样要用到以下几个类:

1、java.net.HttpUrlConnection
2、java.net.Url

接下来对Http UrlConnection类进行了分装,按照http请求分为了request与response,这样一来直接对HTTP协议进行操作,就方便多了。

request 类如下:

package com.xxser.http;
 
import java.io.IOException;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.Proxy;
import java.net.URL;
 
public class Request {
 
         privateURL url;
         privateHttpURLConnection con;
         privateProxy proxy = null;
 
         /**
          * 构造方法
          *
          * @param url
          *           Url信息
          */
         publicRequest(String url) {
                   try{
                            this.url= new URL(url);
                            this.init();
                   } catch(MalformedURLException e) {
                            e.printStackTrace();
                   }
         }
 
         /**
          *
          * @param url
          *           URL 信息
          * @param proxy
          *           代理
          */
         publicRequest(String url, Proxy proxy) {
                   try{
                            this.url= new URL(url);
                            this.proxy= proxy;
                            this.init();
                   } catch(MalformedURLException e) {
                            e.printStackTrace();
                   }
         }
 
         publicRequest(URL url) {
                   this.url= url;
                   this.init();
         }
 
         publicURL getUrl() {
                   returnurl;
         }
 
         publicHttpURLConnection getCon() {
                   returncon;
         }
 
         /**
          * 初始化 HTTP 信息
          */
         privatevoid init() {
                   try{
 
                            if(this.proxy == null) {
 
                                     this.con= (HttpURLConnection) url.openConnection();
                            } else {
                                     this.con= (HttpURLConnection) this.url
                                                        .openConnection(this.proxy);
                            }
                   }catch (IOException e) {
                            e.printStackTrace();
                   }
         }
 
         /**
          * 得到Response
          *
          * @return
          */
         publicResponse getResponse() {
                   try{
                            this.con.getInputStream();// 发起请求
                   } catch (IOException e) {
                            e.printStackTrace();
                   }
 
                   Responseres = new Response(this.con);
                   returnres;
         }
 
         /**
          * 设置请求方法
          *
          * @param method
          */
         publicvoid setMethod(String method) {
                   try{
                            this.con.setRequestMethod(method);
                   } catch (ProtocolException e){
                            e.printStackTrace();
                   }
         }
 
         /**
          * 设置请求头
          *
          * @param h
          *           头
          * @param v
          *           值
          */
         publicRequest setHeader(String h, String v) {
 
                   this.con.addRequestProperty(h,v);
                   returnthis;
         }
 
         /**
          *设置请求头内容
          *
          * @param data
          */
         publicvoid setData(String data) {
                   this.con.setDoOutput(true);
                   OutputStreamos = null;
                   try{
                            os= this.con.getOutputStream();
                            os.write(data.getBytes());
                            os.close();
                   } catch (IOException e) {
                            e.printStackTrace();
                   }
                  
         }
        
        
        
         /**
          * 设置是否执行302跳转
          * @param set
          */
         @SuppressWarnings("static-access")
         public  void setInstanceFollowRedirects (booleanflag) {
                   this.con.setInstanceFollowRedirects (flag);
         }
}

response 类如下:

package com.xxser.http;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
public class Response {
private HttpURLConnection con;
public Response(HttpURLConnection con) {
this.con = con;
}
/**
 * 
 * @return  获取原始请求
 */
public HttpURLConnection getCon() {
return con;
}
/**
 * 获取请求头
 * @param key
 * @return
 */
public String getHeader(String key) {
return this.con.getHeaderField(key);
}
/**
 * 
 * @return获取内容,默认编码为GBK
 */
public String getBody() {
return this.getBody("GBK");
}
/**
 * 
 * @param charset字符编码
 * @return获取内容
 */
public String getBody(String charset) {
BufferedReader buf = null;
try {
buf = new BufferedReader(new InputStreamReader(this.con
.getInputStream(), charset));
} catch (IOException e) {
e.printStackTrace();
}
StringBuilder sb = new StringBuilder();
try {
for (String temp = buf.readLine(); temp != null; temp = buf
.readLine()) {
sb.append(temp);
sb.append(System.getProperty("line.separator"));
}
} catch (IOException e) {
e.printStackTrace();
}
return sb.toString();
}
/**
 * 
 * @return HTTP 状态码
 */
public int getResponseCode() {
int temp = -1 ;
try {
 temp = this.con.getResponseCode() ;
} catch (IOException e) {
e.printStackTrace();
}
return temp ;
}
}

两个类都有了,那么接下来步入正题,在扫描中,一般使用HEAD方法是最快的,因为不用等待取得HTTP body,也就是HTML、JS、CSS等数据。

进行测试,代码如下:

package com.xxser.test;

import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.Proxy.Type;
import com.xxser.http.Request;
import com.xxser.http.Response;
public class Main {

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

		Proxy p = new Proxy(Type.HTTP,new InetSocketAddress("127.0.0.1",8888));
		
		Request r = new Request("http://www.moonsos.com"+"/index.html", p);
			
		r.setHeader("User-Agent", "HelloWorld").setMethod("HEAD");

		Response  ps =	r.getResponse();
		
		System.out.println(ps.getResponseCode());
		
	}

}

这里使用了代理,用BurpSuite抓了包,来查看是否正确,果然,一些都没问题。

ps:如果你不懂的如何使用代理,请看另外一篇文章Java编写代理服务器(Burp拦截Demo)

但有一点需要注意,那就是禁止302跳转,比如我们访问:

http://www.baidu.com/xxx.html,这个"xxx.html"页面是不存在的,那么服务器为了避免404错误,会直接重定向到另外一个页面,一般都是“error”页面,如下图所示:

这个页面是不存在的,但如果不禁止302跳转,依然会返回状态码200!,如下图所示。

所以我们可以调用request. setInstanceFollowRedirects(false) 来禁止302自动跳转,如下图所示,就没问题了。

接下来,你可以做一个多线程,进行扫描了。我就不在一一的说了。无法就是IO与状态吗判断的问题了。


被黑站点统计 - 文章版权1、本主题所有言论和图片纯属会员个人意见,与本文章立场无关
2、本站所有主题由该文章作者发表,该文章作者与被黑站点统计享有文章相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该文章作者和被黑站点统计的同意
4、文章作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、被黑站点统计管理员有权不事先通知发贴者而删除本文

免责声明

本站主要通过网络搜集国内被黑网站信息,统计分析数据,为部署安全型网络提供强有力的依据.本站所有工作人员均不参与黑站,挂马或赢利性行为,所有数据均为网民提供,提交者不一定是黑站人,所有提交采取不记名,先提交先审核的方式,如有任何疑问请及时与我们联系.

admin  的文章


微信公众号

微信公众号


Copyright © 2012-2022被黑网站统计系统All Rights Reserved
页面总访问量:21379937(PV) 页面执行时间:271.13(MS)
  • xml
  • 网站地图