Skip to content

Commit 5cecd79

Browse files
author
abdurahman-ctis
committed
ML all the way
1 parent 5addab8 commit 5cecd79

13 files changed

+147
-25
lines changed

api_endpoints.py

+11-21
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,14 @@
22
import json
33
from time import time
44
from urllib.parse import urlparse
5-
5+
from requests import post
66
import firebase_admin
7+
from dateutil.parser import parse
78
from firebase_admin import credentials
89
from firebase_admin import db
910
from requests import post
1011
from tornado.web import RequestHandler
1112

12-
from dateutil.parser import parse
13-
1413
cred = credentials.Certificate('ids-hackathor-636a3e9f4e4c.json')
1514
firebase_admin.initialize_app(cred, {
1615
'databaseURL': 'https://ids-hackathor.firebaseio.com/'
@@ -69,19 +68,17 @@ async def get(self):
6968

7069
async def post(self):
7170
print("Entered post")
72-
params = json.loads(self.request.body)
7371
ip = self.request.remote_ip
72+
params = json.loads(self.request.body)
73+
response = post("http://localhost:5000/hello/hikmet", json=params)
74+
response_val = json.loads(response.text)
75+
for i in response_val:
76+
print(i)
77+
send_ref(ip, i['param'], i['val'], i['type'])
78+
self.report({i['type']: {"ip": ip, "param": i['param'], "val": i['val'],
79+
"uid": 99, "confidence": i['confidence']}})
80+
7481
for param, val in params.items():
75-
# XSS
76-
for pload in XSS:
77-
if pload in val:
78-
send_ref(ip, param, val, 'XSS')
79-
self.report({"XSS": {"ip": ip, "param": param, "val": val, "uid": 99}})
80-
break
81-
# SQLi
82-
if "'" in val and ('and' in val.lower() or 'or' in val.lower()) or '--' in val:
83-
send_ref(ip, param, val, 'SQLi')
84-
self.report({"SQLi": {"ip": ip, "param": param, "val": val, "uid": 99}})
8582

8683
# CRLF
8784
if '%0d' in val.lower() or '%0a' in val.lower():
@@ -94,13 +91,6 @@ async def post(self):
9491
send_ref(ip, param, val, 'Open Redirect')
9592
self.report({"Redirect": {"ip": ip, "param": param, "val": val, "uid": 99}})
9693

97-
# Path Traversal
98-
for pload in TRAVERS:
99-
if pload in val:
100-
send_ref(ip, param, val, 'Path Traversal')
101-
self.report({"Traversal": {"ip": ip, "param": param, "val": val, "uid": 99}})
102-
break
103-
10494
self.write({"Result": "200 Success"})
10595

10696

c1g.vec

4.26 KB
Binary file not shown.

c2g.vec

142 KB
Binary file not shown.

c3g.vec

1.13 MB
Binary file not shown.

logistic.model

525 KB
Binary file not shown.

ml_model.py

+120
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
from bottle import route, run, template,post,request
2+
import matplotlib.pyplot as plt
3+
import nltk
4+
import pandas as pd
5+
import scipy
6+
from nltk.util import ngrams
7+
from scipy.sparse import coo_matrix, hstack, vstack
8+
from sklearn.datasets import load_iris
9+
from sklearn.decomposition import TruncatedSVD
10+
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
11+
from sklearn.linear_model import LogisticRegression
12+
from sklearn.metrics import f1_score
13+
from sklearn.model_selection import train_test_split
14+
import os
15+
import pickle
16+
import random
17+
import json
18+
import string
19+
20+
def get1Grams(payload_obj):
21+
'''Divides a string into 1-grams
22+
23+
Example: input - payload: "<script>"
24+
output- ["<","s","c","r","i","p","t",">"]
25+
'''
26+
payload = str(payload_obj)
27+
ngrams = []
28+
for i in range(0,len(payload)-1):
29+
ngrams.append(payload[i:i+1])
30+
return ngrams
31+
32+
def get2Grams(payload_obj):
33+
'''Divides a string into 2-grams
34+
35+
Example: input - payload: "<script>"
36+
output- ["<s","sc","cr","ri","ip","pt","t>"]
37+
'''
38+
payload = str(payload_obj)
39+
ngrams = []
40+
for i in range(0,len(payload)-2):
41+
ngrams.append(payload[i:i+2])
42+
return ngrams
43+
44+
def get3Grams(payload_obj):
45+
'''Divides a string into 3-grams
46+
47+
Example: input - payload: "<script>"
48+
output- ["<sc","scr","cri","rip","ipt","pt>"]
49+
'''
50+
payload = str(payload_obj)
51+
ngrams = []
52+
for i in range(0,len(payload)-3):
53+
ngrams.append(payload[i:i+3])
54+
return ngrams
55+
56+
57+
58+
@post('/hello/<name>')
59+
def index(name):
60+
data_params = request.json
61+
print(data_params)
62+
#postdata = name = request.forms.get("query_val")
63+
return_value = run_model(data_params)
64+
print("return value ",return_value)
65+
return str(return_value)
66+
67+
return "1"
68+
def run_model(param):
69+
list_of_results = []
70+
check = 0
71+
for key in param:
72+
content = param[key]
73+
q_val = content
74+
type_attack = None
75+
q_key = key
76+
df = pd.DataFrame([[content]],columns=['content'])
77+
df['content'] = df['content'].str.strip('\n')
78+
df['content'] = df['content'].str.lower()
79+
X1C = count_vectorizer_1grams.transform(df["content"])
80+
X2C = count_vectorizer_2grams.transform(df["content"])
81+
X3C = count_vectorizer_3grams.transform(df["content"])
82+
X1T = tfidf_vectorizer_1grams.transform(df["content"])
83+
X2T = tfidf_vectorizer_2grams.transform(df["content"])
84+
X3T = tfidf_vectorizer_3grams.transform(df["content"])
85+
X = hstack([X1C,X2C,X3C,X1T,X2T,X3T])
86+
predicted = logistic_model.predict(X)
87+
predicted_sql = sql_model.predict_proba(X)[0][1]
88+
predicted_traverse = traverse_model.predict_proba(X)[0][1]
89+
predicted_xss = xss_model.predict_proba(X)[0][1]
90+
max_value = max(predicted_sql,predicted_traverse,predicted_xss)
91+
if max_value >= 0.5:
92+
if max_value == predicted_sql:
93+
type_attack = "SQLi"
94+
elif max_value == predicted_traverse:
95+
type_attack = "Path Traversal"
96+
elif max_value == predicted_xss:
97+
type_attack = "XSS"
98+
dicc = {
99+
"type":type_attack,
100+
"param": q_key,
101+
"val": q_val,
102+
"confidence": max_value
103+
}
104+
list_of_results.append(dicc)
105+
return json.dumps(list_of_results)
106+
107+
if __name__ == '__main__':
108+
count_vectorizer_1grams = pickle.load(open("c1g.vec","rb"))
109+
count_vectorizer_2grams = pickle.load(open("c2g.vec","rb"))
110+
count_vectorizer_3grams = pickle.load(open("c3g.vec","rb"))
111+
tfidf_vectorizer_1grams = pickle.load(open("t1g.vec","rb"))
112+
tfidf_vectorizer_2grams = pickle.load(open("t2g.vec","rb"))
113+
tfidf_vectorizer_3grams = pickle.load(open("t3g.vec","rb"))
114+
logistic_model = pickle.load(open("logistic.model","rb"))
115+
sql_model = pickle.load(open("sql.model","rb"))
116+
traverse_model = pickle.load(open("traverse.model","rb"))
117+
xss_model = pickle.load(open("xss.model","rb"))
118+
119+
print("valalal")
120+
run(host = 'localhost', port=5000,reloader=True)

requirements.txt

+16-4
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
aniso8601==8.0.0
2+
bottle==0.12.17
23
CacheControl==0.12.5
34
cachetools==3.1.1
45
certifi==2019.11.28
56
chardet==3.0.4
67
Click==7.0
8+
cycler==0.10.0
79
enum34==1.1.6
810
firebase-admin==3.2.0
911
Flask==1.1.1
@@ -25,21 +27,31 @@ httplib2==0.14.0
2527
idna==2.8
2628
itsdangerous==1.1.0
2729
Jinja2==2.10.3
30+
joblib==0.14.0
31+
kiwisolver==1.1.0
2832
MarkupSafe==1.1.1
33+
matplotlib==3.1.2
2934
msgpack==0.6.2
35+
nltk==3.4.5
36+
numpy==1.17.4
37+
pandas==0.25.3
3038
protobuf==3.11.0
3139
pyasn1==0.4.8
3240
pyasn1-modules==0.2.7
41+
pycryptodome==3.8.2
42+
pyparsing==2.4.5
43+
python-dateutil==2.8.1
3344
python-engineio==3.10.0
3445
python-socketio==4.4.0
3546
pytz==2019.3
3647
requests==2.22.0
3748
rsa==4.0
49+
scikit-learn==0.21.3
50+
scipy==1.3.3
3851
six==1.13.0
52+
sklearn==0.0
53+
tornado==6.0.3
3954
uritemplate==3.0.0
4055
urllib3==1.25.7
56+
websockets==7.0
4157
Werkzeug==0.16.0
42-
pycryptodome == 3.8.2
43-
tornado == 6.0.3
44-
websockets == 7.0
45-

sql.model

525 KB
Binary file not shown.

t1g.vec

6.62 KB
Binary file not shown.

t2g.vec

201 KB
Binary file not shown.

t3g.vec

1.59 MB
Binary file not shown.

traverse.model

525 KB
Binary file not shown.

xss.model

525 KB
Binary file not shown.

0 commit comments

Comments
 (0)