5
5
import sys
6
6
7
7
import requests
8
- from flask import Blueprint , make_response , render_template , request , url_for
8
+ from flask import Blueprint , Request , make_response , render_template , request , url_for
9
9
10
10
from bci .web .page_parser import load_experiment_pages
11
11
26
26
27
27
@exp .before_request
28
28
def before_request ():
29
+ __report (request )
29
30
host = request .host .lower ()
30
31
if host not in ALLOWED_DOMAINS :
31
32
logger .error (
@@ -34,29 +35,13 @@ def before_request():
34
35
return f"Host '{ host } ' is not supported by this framework."
35
36
36
37
37
- @exp .route ("/" )
38
- def index ():
39
- return f"This page is visited over <b>{ request .scheme } </b>."
40
-
41
-
42
- @exp .route ("/report/" , methods = ["GET" , "POST" ])
43
- def report ():
44
- get_params = [item for item in get_all_GET_parameters (request ).items ()]
45
- resp = make_response (
46
- render_template ("cookies.html" , title = "Report" , get_params = get_params )
47
- )
48
-
49
- cookie_exp_date = datetime .datetime .now () + datetime .timedelta (weeks = 4 )
50
- resp .set_cookie ("generic" , "1" , expires = cookie_exp_date )
51
- resp .set_cookie ("secure" , "1" , expires = cookie_exp_date , secure = True )
52
- resp .set_cookie ("httpOnly" , "1" , expires = cookie_exp_date , httponly = True )
53
- resp .set_cookie ("lax" , "1" , expires = cookie_exp_date , samesite = "lax" )
54
- resp .set_cookie ("strict" , "1" , expires = cookie_exp_date , samesite = "strict" )
55
-
38
+ def __report (request : Request ) -> None :
39
+ """
40
+ Submit report to BugHog
41
+ """
56
42
# Respond to collector on same IP
57
43
# remote_ip = request.remote_addr
58
44
remote_ip = request .headers .get ("X-Real-IP" )
59
-
60
45
response_data = {
61
46
"url" : request .url ,
62
47
"method" : request .method ,
@@ -72,6 +57,29 @@ def send_report_to_collector():
72
57
73
58
threading .Thread (target = send_report_to_collector ).start ()
74
59
60
+
61
+ def __get_all_GET_parameters (request ) -> dict [str ,str ]:
62
+ return {k : v for k , v in request .args .items ()}
63
+
64
+
65
+ @exp .route ("/" )
66
+ def index ():
67
+ return f"This page is visited over <b>{ request .scheme } </b>."
68
+
69
+
70
+ @exp .route ("/report/" , methods = ["GET" , "POST" ])
71
+ def report_endpoint ():
72
+ get_params = [item for item in __get_all_GET_parameters (request ).items ()]
73
+ resp = make_response (
74
+ render_template ("cookies.html" , title = "Report" , get_params = get_params )
75
+ )
76
+
77
+ cookie_exp_date = datetime .datetime .now () + datetime .timedelta (weeks = 4 )
78
+ resp .set_cookie ("generic" , "1" , expires = cookie_exp_date )
79
+ resp .set_cookie ("secure" , "1" , expires = cookie_exp_date , secure = True )
80
+ resp .set_cookie ("httpOnly" , "1" , expires = cookie_exp_date , httponly = True )
81
+ resp .set_cookie ("lax" , "1" , expires = cookie_exp_date , samesite = "lax" )
82
+ resp .set_cookie ("strict" , "1" , expires = cookie_exp_date , samesite = "strict" )
75
83
return resp
76
84
77
85
@@ -81,7 +89,7 @@ def report_leak_if_using_http(target_scheme):
81
89
Triggers request to /report/ if a request was received over the specified `scheme`.
82
90
"""
83
91
used_scheme = request .headers .get ("X-Forwarded-Proto" )
84
- params = get_all_GET_parameters (request )
92
+ params = __get_all_GET_parameters (request )
85
93
if used_scheme == target_scheme :
86
94
return "Redirect" , 307 , {"Location" : url_for ("experiments.report" , ** params )}
87
95
else :
@@ -96,7 +104,7 @@ def report_leak_if_present(expected_header_name: str):
96
104
if expected_header_name not in request .headers :
97
105
return f"Header { expected_header_name } not found" , 200 , {"Allow-CSP-From" : "*" }
98
106
99
- params = get_all_GET_parameters (request )
107
+ params = __get_all_GET_parameters (request )
100
108
return (
101
109
"Redirect" ,
102
110
307 ,
@@ -121,7 +129,7 @@ def report_leak_if_contains(expected_header_name: str, expected_header_value: st
121
129
{"Allow-CSP-From" : "*" },
122
130
)
123
131
124
- params = get_all_GET_parameters (request )
132
+ params = __get_all_GET_parameters (request )
125
133
return (
126
134
"Redirect" ,
127
135
307 ,
@@ -132,15 +140,15 @@ def report_leak_if_contains(expected_header_name: str, expected_header_value: st
132
140
)
133
141
134
142
135
- @exp .route ("/<string:project>/<string:experiment>/<string:directory>/ " )
136
- def python_evaluation (project : str , experiment : str , directory : str ):
143
+ @exp .route ("/<string:project>/<string:experiment>/<string:file_name>.py " )
144
+ def python_evaluation (project : str , experiment : str , file_name : str ):
137
145
"""
138
146
Evaluates the python script and returns its result.
139
147
"""
140
148
host = request .host .lower ()
141
149
142
- module_name = f"{ host } /{ project } /{ experiment } / { directory } "
143
- path = f"experiments/pages/{ project } /{ experiment } /{ host } /{ directory } /index .py"
150
+ module_name = f"{ host } /{ project } /{ experiment } "
151
+ path = f"experiments/pages/{ project } /{ experiment } /{ host } /{ file_name } .py"
144
152
145
153
# Dynamically import the file
146
154
sys .dont_write_bytecode = True
@@ -150,7 +158,3 @@ def python_evaluation(project: str, experiment: str, directory: str):
150
158
spec .loader .exec_module (module )
151
159
152
160
return module .main (request )
153
-
154
-
155
- def get_all_GET_parameters (request ):
156
- return {k : v for k , v in request .args .items ()}
0 commit comments