diff --git a/application/templates/app/feed.html b/application/templates/app/feed.html
index 9515110..c56de60 100644
--- a/application/templates/app/feed.html
+++ b/application/templates/app/feed.html
@@ -157,7 +157,7 @@
The home of of witty one-liners
len : 10
}, function(data) {
if (data) {
- $("#feed ul").append(data);
+$("#feed ul").append(DOMPurify.sanitize(data));
} else {
$(obj).remove();
}
diff --git a/application/templates/app/profile.html b/application/templates/app/profile.html
index 0d23fba..44b191c 100644
--- a/application/templates/app/profile.html
+++ b/application/templates/app/profile.html
@@ -216,12 +216,12 @@ Profile
$('input[name="' + key + '"]').val(val);
if (key === "username") {
- $('#profileImage').attr('src', image_path + val + '.png');
+$('#profileImage').attr('src', DOMPurify.sanitize(image_path + val + '.png'));
}
});
}
if ('message' in data) {
- $('body').append(data.message);
+$('body').append(DOMPurify.sanitize(data.message));
}
}
},
diff --git a/application/views/blabController.py b/application/views/blabController.py
index 85bc8a7..4315fde 100644
--- a/application/views/blabController.py
+++ b/application/views/blabController.py
@@ -48,7 +48,7 @@ def feed(request):
logger.info("Executing query to get all 'Blabs for me'")
blabsForMe = sqlBlabsForMe.format(10, 0)
- cursor.execute(blabsForMe % (username,))
+ cursor.execute("%s %s", (username, ))
blabsForMeResults = cursor.fetchall()
feedBlabs = []
@@ -117,7 +117,7 @@ def feed(request):
addBlabSql = "INSERT INTO blabs (blabber, content, timestamp) values ('%s', '%s', datetime('now'));"
logger.info("Executing query to add new blab")
- cursor.execute(addBlabSql % (username, blab))
+ cursor.execute("INSERT INTO blabs (blabber, content, timestamp) values (%s, %s, %s);", (username, blab, datetime(now)))
if not cursor.rowcount:
request.error = "Failed to add blab"
@@ -170,7 +170,7 @@ def morefeed(request):
except Exception as e:
logger.error("Unexpected error", e)
- return HttpResponse(ret)
+ return escape(HttpResponse(ret))
# Brings up the page to view a blab, or to write a blab
def blab(request):
@@ -198,7 +198,7 @@ def blab(request):
with connection.cursor() as cursor:
logger.info("Executing query to see Blab details")
- cursor.execute(blabDetailsSql % (blabid,))
+ cursor.execute("%s", (blabid, ))
blabDetailsResults = cursor.fetchone()
if (blabDetailsResults):
@@ -297,7 +297,7 @@ def blabbers(request):
logger.info(blabbersSql)
logger.info("Executing query to see Blab details")
- cursor.execute(blabbersSql % (username, username))
+ cursor.execute('SELECT * FROM users WHERE username = %s', (username, ))
blabbersResults = cursor.fetchall()
blabbers = []
diff --git a/application/views/resetController.py b/application/views/resetController.py
index b420bae..a594960 100644
--- a/application/views/resetController.py
+++ b/application/views/resetController.py
@@ -60,7 +60,7 @@ def reset(request):
elif(request.method == "POST"):
return processReset(request)
else:
- h = httplib2.Http(".cache", disable_ssl_certificate_validation=True) #CWE-295
+ h = httplib2.Http(".cache", enable_ssl_certificate_validation=True) #CWE-295
h.add_credentials('thiswaskevinsidea','hardcode') #CWE-798
data=h.request("http://localhost/",method='GET')
return data
@@ -108,7 +108,8 @@ def processReset(request):
listenersStatement = "INSERT INTO listeners (blabber, listener, status) values ('%s', '%s', 'Active');"
for blabber in users[2:]:
for listener in users[2:]:
- if rand.choice([False, True]) and (blabber != listener):
+ rand = random.SystemRandom()
+ if rand.choice([False, True]) and (blabber!= listener):
logger.info("Adding " + listener.username + " as a listener of " + blabber.username)
@@ -125,7 +126,8 @@ def processReset(request):
blabsStatement = "INSERT INTO blabs (blabber, content, timestamp) values (%s, %s, datetime('now'));"
for blabContent in blabsContent:
# Get the array offset for a random user
- randomUserOffset = rand.randint(2,len(users) - 1)
+ rand = random.SystemRandom()
+ randomUserOffset = rand.randint(2, len(users) - 1)
# get the number or seconds until some time in the last 30 days.
#vary = rand.randint(0,(30 * 24 * 3600)+1)
@@ -144,19 +146,19 @@ def processReset(request):
commentsStatement = "INSERT INTO comments (blabid, blabber, content, timestamp) values (%s, %s, %s, datetime('now'));"
for i in range(len(blabsContent)):
# Add a random number of comment
- count = rand.randint(0,5) # between 0 and 6
+ count = random.SystemRandom().randint(0, 5) #between 0 and 6
for j in range(count) :
# Get the array offset for a random user
- randomUserOffset = rand.randint(2,len(users)-1) #removed +1 cause no admin, removed -2 because no admin and inclusive.
+ randomUserOffset = rand.SystemRandom().randint(2, len(users)-1) #removed +1 cause no admin, removed -2 because no admin and inclusive.
username = users[randomUserOffset].username
# Pick a random comment to add
- commentNum = rand.randint(0,len(commentsContent)-1)
+ commentNum = rand.SystemRandom().randint(0, len(commentsContent)-1)
comment = commentsContent[commentNum]
# get the number or seconds until some time in the last 30 days.
- vary = rand.randint(0,(30 * 24 * 3600)+1)
+ vary = rand.SystemRandom().randint(0, (30 * 24 * 3600)+1)
logger.info("Adding a comment from " + username + " on blab ID " + str(i))
diff --git a/application/views/userController.py b/application/views/userController.py
index 7f1afdb..724d4b6 100644
--- a/application/views/userController.py
+++ b/application/views/userController.py
@@ -22,6 +22,7 @@
from application.models import User, Blabber
from application.forms import RegisterForm
+from html import escape
# Get logger
@@ -108,7 +109,7 @@ def login(request):
parsed = sqlparse.parse(sqlQuery)[0]
logger.info("Attempted login with username and password: " + parsed[8].value)
- cursor.execute(sqlQuery)
+ cursor.execute('SELECT * FROM users WHERE username=%s;', (username,))
# END VULN CODE
# GOOD CODE
# sqlQuery = "select username, password, password_hint, created_at, last_login, \
@@ -135,8 +136,8 @@ def login(request):
blab_name=row["blab_name"])
response = updateInResponse(currentUser, response)
- update = "UPDATE users SET last_login=datetime('now') WHERE username='" + row['username'] + "';"
- cursor.execute(update)
+ update = "UPDATE users SET last_login=NOW() WHERE username=%s;"
+ cursor.execute(update, (username,))
# if the username ends with "totp", add the TOTP login step
if username[-4:].lower() == "totp":
@@ -181,9 +182,9 @@ def showPasswordHint(request):
try:
logger.info("Creating the Database connection")
with connection.cursor() as cursor:
- sql = "SELECT password_hint FROM users WHERE username = '" + username + "'"
+ sql = "SELECT password_hint FROM users WHERE username = %s"
logger.info(sql)
- cursor.execute(sql)
+ cursor.execute(sql, (username,))
row = cursor.fetchone()
if (row):
@@ -194,9 +195,9 @@ def showPasswordHint(request):
formatString = "Username '" + username + "' has password: {}"
hint = formatString.format(password[:2] + ("*" * (len(password) - 2)))
logger.info(hint)
- return HttpResponse(hint)
+ return HttpResponse(escape(hint))
else:
- return HttpResponse("No password found for " + username)
+ return HttpResponse(escape("No password found for " + username))
except DatabaseError as db_err:
logger.error("Database error", db_err)
return HttpResponse("ERROR!")
@@ -222,9 +223,9 @@ def showTotp(request):
#Create db connection
with connection.cursor() as cursor:
- sql = "SELECT totp_secret FROM users WHERE username = '" + username + "'"
+ sql = "SELECT totp_secret FROM users WHERE username = %s"
logger.info(sql)
- cursor.execute(sql)
+ cursor.execute(sql, (username,))
result = cursor.fetchone()
if result:
@@ -256,9 +257,9 @@ def processTotp(request):
with connection.cursor() as cursor:
- sql = "SELECT totp_secret FROM users WHERE username = '" + username + "'"
+ sql = "SELECT totp_secret FROM users WHERE username = %s"
logger.info(sql)
- cursor.execute(sql)
+ cursor.execute(sql, (username,))
result = cursor.fetchone()
if result:
@@ -338,8 +339,8 @@ def processRegister(request):
logger.info("Creating the Database connection")
try:
with connection.cursor() as cursor:
- sqlQuery = "SELECT username FROM users WHERE username = '" + username + "'"
- cursor.execute(sqlQuery)
+ sqlQuery = "SELECT username FROM users WHERE username = %s"
+ cursor.execute(sqlQuery, (username,))
row = cursor.fetchone()
if (row):
request.error = "Username '" + username + "' already exists!"
@@ -417,7 +418,7 @@ def processRegisterFinish(request):
query += ("'" + blabName + "'")
query += (");")
#execute query
- cursor.execute(query)
+ cursor.execute('%s', (password,))
sqlStatement = cursor.fetchone() #<- variable for response
logger.info(query)
# END EXAMPLE VULNERABILITY
@@ -491,7 +492,7 @@ def showProfile(request):
with connection.cursor() as cursor:
# Find the Blabbers that this user listens to
logger.info(sqlMyHecklers)
- cursor.execute(sqlMyHecklers % username)
+ cursor.execute(sqlMyHecklers, (username,))
myHecklersResults = cursor.fetchall()
hecklers=[]
for i in myHecklersResults:
@@ -508,9 +509,9 @@ def showProfile(request):
events = []
# START EXAMPLE VULNERABILITY
- sqlMyEvents = "select event from users_history where blabber=\"" + username + "\" ORDER BY eventid DESC; "
+ sqlMyEvents = "select event from users_history where blabber=%s ORDER BY eventid DESC; "
logger.info(sqlMyEvents)
- cursor.execute(sqlMyEvents)
+ cursor.execute(sqlMyEvents, (username,))
userHistoryResult = cursor.fetchall()
# END EXAMPLE VULNERABILITY
@@ -518,9 +519,9 @@ def showProfile(request):
events.append(result[0])
# Get the users information
- sql = "SELECT username, real_name, blab_name, totp_secret FROM users WHERE username = '" + username + "'"
+ sql = "SELECT username, real_name, blab_name, totp_secret FROM users WHERE username = %s"
logger.info(sql)
- cursor.execute(sql)
+ cursor.execute(sql, (username,))
myInfoResults = cursor.fetchone()
if not myInfoResults:
return JsonResponse({'message':'Error, no Inforesults found'})
@@ -557,7 +558,7 @@ def processProfile(request):
# Initial response only get returns if everything else succeeds.
# This must be here in order to use set_cookie later in the program
msg = f""
- response = JsonResponse({'values':{"username": username.lower(), "realName": realName, "blabName": blabName}, 'message':msg},status=200)
+ response = JsonResponse({'values':escape({"username": username.lower(), "realName": realName, "blabName": blabName}),'message':msg}, status=200)
logger.info("entering processProfile")
sessionUsername = request.session.get('username')
@@ -704,7 +705,7 @@ def downloadImage(request):
if mime_type is None:
mime_type = "application/octet-stream"
logger.info("MIME type: " + mime_type)
- response = HttpResponse(file.read(), content_type=mime_type)
+ response = HttpResponse(escape(file.read()), content_type=mime_type)
response.headers['Content-Disposition'] = 'attachment; filename=' + imageName
return response
except ValueError as ve:
@@ -730,7 +731,7 @@ def usernameExists(username):
with connection.cursor() as cursor:
logger.info("Preparing the duplicate username check Prepared Statement")
sqlStatement = "SELECT username FROM users WHERE username='%s'"
- cursor.execute(sqlStatement % (username,))
+ cursor.execute(sqlStatement, (username, ))
result = cursor.fetchone()
if not result:
# username does not exist
@@ -771,7 +772,7 @@ def updateUsername(oldUsername, newUsername):
# Execute updates as part of a batch transaction
# This will roll back all changes if one query fails
for query in sqlStrQueries:
- cursor.execute(query % (newUsername,oldUsername))
+ cursor.execute("%s", (newUsername, oldUsername))
# Rename the user profile image to match new username