1
1
package ru .nsu .xwaf ;
2
2
3
3
import java .io .*;
4
+ import java .net .InetSocketAddress ;
4
5
import java .net .Socket ;
5
6
import java .net .URL ;
6
7
import java .net .URLDecoder ;
7
8
import java .util .Map ;
8
9
9
10
/**
11
+ * Main logic of analyze request/response
10
12
*
11
- * @author daredevil
13
+ * @author FallDi
12
14
*/
13
15
public class ProxyThread extends Thread {
14
16
@@ -17,12 +19,14 @@ public class ProxyThread extends Thread {
17
19
private static final int READ_BUFFERD_SIZE_REQUEST = 1 ;
18
20
private static final int BUFFER_SIZE = 32000 ;
19
21
private RulesGroup rules ;
22
+ private Map <Integer , String > blacklistIp ;
20
23
private DatabaseManager dbm ;
21
24
22
- public ProxyThread (Socket socket , RulesGroup rules , DatabaseManager dbm ) {
25
+ public ProxyThread (Socket socket , RulesGroup rules , Map < Integer , String > blacklistIp , DatabaseManager dbm ) {
23
26
super ("ProxyThread" );
24
27
this .socket = socket ;
25
28
this .rules = rules ;
29
+ this .blacklistIp = blacklistIp ;
26
30
this .dbm = dbm ;
27
31
}
28
32
@@ -34,8 +38,10 @@ public void run() {
34
38
DataOutputStream servOut = null ;
35
39
Socket server = null ;
36
40
try {
41
+ // initialize input streams
37
42
clientOut = new DataOutputStream (socket .getOutputStream ());
38
43
clientIn = new DataInputStream (socket .getInputStream ());
44
+ String clientIpAddress = ((InetSocketAddress ) socket .getRemoteSocketAddress ()).getHostName ();
39
45
// get request
40
46
HTTPRequest hr ;
41
47
Map <String , String > fields ;
@@ -58,34 +64,39 @@ public void run() {
58
64
break ;
59
65
}
60
66
}
61
- System .out .println (requestStr );
67
+ // System.out.println(requestStr);
62
68
String [] tokens = requestStr .split (" " );
63
69
String urlToCall = tokens [1 ];
64
70
URL url = new URL (urlToCall );
65
- Rule blockedRule = null ;
66
- if (null == (blockedRule = rules .isVulnerable (URLDecoder .decode (requestStr , "UTF-8" )))) {
67
- // get response and send to client
68
- server = new Socket (url .getHost (), 80 );
69
- servIn = new DataInputStream (server .getInputStream ());
70
- servOut = new DataOutputStream (server .getOutputStream ());
71
- servOut .write (requestByte , 0 , sizeRequest );
71
+ if (blacklistIp .containsValue (clientIpAddress )) {
72
+ Answer answer = new Answer ("./answers/blacklist_ip.html" );
73
+ answer .loadFile ();
74
+ byte [] answerByte = (answer .getAnswerBlockIp (clientIpAddress )).getBytes ();
75
+ clientOut .write (answerByte , 0 , answerByte .length );
76
+ } else {
77
+ Rule blockedRule = null ;
78
+ if (null == (blockedRule = rules .isVulnerable (URLDecoder .decode (requestStr , "UTF-8" )))) {
79
+ // get response and send to client
80
+ server = new Socket (url .getHost (), 80 );
81
+ servIn = new DataInputStream (server .getInputStream ());
82
+ servOut = new DataOutputStream (server .getOutputStream ());
83
+ servOut .write (requestByte , 0 , sizeRequest );
72
84
73
- //begin send response to client byte by[] = new
74
- byte [] by = new byte [BUFFER_SIZE ];
75
- index = servIn .read (by , 0 , READ_BUFFER_SIZE );
76
- int responseSize = 0 ;
77
- while (index >= 0 ) {
78
- clientOut .write (by , 0 , index );
79
- responseSize += index ;
85
+ //begin send response to client byte by[] = new
86
+ byte [] by = new byte [BUFFER_SIZE ];
80
87
index = servIn .read (by , 0 , READ_BUFFER_SIZE );
88
+ while (index >= 0 ) {
89
+ clientOut .write (by , 0 , index );
90
+ index = servIn .read (by , 0 , READ_BUFFER_SIZE );
91
+ }
92
+ } else {
93
+ Answer answer = new Answer ("./answers/block.html" );
94
+ answer .loadFile ();
95
+ byte [] answerByte = (answer .getAnswerBlock (requestStr , blockedRule ) + blockedRule .getName ()).getBytes ();
96
+ clientOut .write (answerByte , 0 , answerByte .length );
97
+ dbm .addLog (url , blockedRule , socket .getLocalAddress ().getHostAddress ());
98
+ dbm .updateLogFile ();
81
99
}
82
- } else {
83
- Answer answer = new Answer ("./answers/block.html" );
84
- answer .loadFile ();
85
- byte [] answerByte = (answer .getAnswer (requestStr , blockedRule ) + blockedRule .getName ()).getBytes ();
86
- clientOut .write (answerByte , 0 , answerByte .length );
87
- dbm .addLog (url , blockedRule , socket .getLocalAddress ().getHostAddress ());
88
- dbm .updateLogFile ();
89
100
}
90
101
clientOut .flush ();
91
102
} catch (IOException e ) {
0 commit comments