Java编写敏感文件扫描工具

CracerCracer 2015-12-16 安全工具 1,130 0 3

 20140621214329_35uRW在渗透测试过程中,扫描敏感目录文件是一件非常重要的事情,那么接下来,我们就用Java来做一个目录扫描的Demo。

同样,对于网络编程一样要用到以下几个类:

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

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

request 类如下:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
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 {

private URL url;
private HttpURLConnection con;
private Proxy proxy = null;

/**
* 构造方法
*
* @param url
* Url信息
*/

public Request(String url) {
try {
this.url = new URL(url);
this.init();
} catch (MalformedURLException e) {
e.printStackTrace();
}
}

/**
*
* @param url
* URL 信息
* @param proxy
* 代理
*/

public Request(String url, Proxy proxy) {
try {
this.url = new URL(url);
this.proxy = proxy;
this.init();
} catch (MalformedURLException e) {
e.printStackTrace();
}
}

public Request(URL url) {
this.url = url;
this.init();
}

public URL getUrl() {
return url;
}

public HttpURLConnection getCon() {
return con;
}

/**
* 初始化 HTTP 信息
*/

private void 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
*/

public Response getResponse() {
try {
this.con.getInputStream(); // 发起请求
} catch (IOException e) {
e.printStackTrace();
}
Response res = new Response(this.con);
return res;
}

/**
* 设置请求方法
*
* @param method
*/

public void setMethod(String method) {
try {
this.con.setRequestMethod(method);
} catch (ProtocolException e) {
e.printStackTrace();
}
}

/**
* 设置请求头
*
* @param h
* 头
* @param v
* 值
*/

public Request setHeader(String h, String v) {

this.con.addRequestProperty(h, v);
return this;
}

/**
*设置请求头内容
*
* @param data
*/

public void setData(String data) {
this.con.setDoOutput(true);
OutputStream os = 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 (boolean flag) {
this.con. setInstanceFollowRedirects (flag);
}
}

response 类如下:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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等数据。

进行测试,代码如下:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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抓了包,来查看是否正确,果然,一些都没问题。

20140103112617209

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

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

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

11

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

22

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

33

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

 

转载请注明来自Cracer,本文标题:《Java编写敏感文件扫描工具》

喜欢 (3) 发布评论
发表评论


Top