Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion application/templates/app/feed.html
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ <h4>The home of of witty one-liners</h4>
len : 10
}, function(data) {
if (data) {
$("#feed ul").append(data);
$("#feed ul").append(DOMPurify.sanitize(data));
} else {
$(obj).remove();
}
Expand Down
4 changes: 2 additions & 2 deletions application/templates/app/profile.html
Original file line number Diff line number Diff line change
Expand Up @@ -216,12 +216,12 @@ <h4>Profile</h4>
$('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));
}
}
},
Expand Down
10 changes: 5 additions & 5 deletions application/views/blabController.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 = []
Expand Down Expand Up @@ -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"
Expand Down Expand Up @@ -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):
Expand Down Expand Up @@ -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):
Expand Down Expand Up @@ -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 = []
Expand Down
16 changes: 9 additions & 7 deletions application/views/resetController.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand All @@ -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))

Expand Down
47 changes: 24 additions & 23 deletions application/views/userController.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@

from application.models import User, Blabber
from application.forms import RegisterForm
from html import escape


# Get logger
Expand Down Expand Up @@ -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, \
Expand All @@ -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":
Expand Down Expand Up @@ -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):
Expand All @@ -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!")
Expand All @@ -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:
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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!"
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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:
Expand All @@ -508,19 +509,19 @@ 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

for result in userHistoryResult :
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'})
Expand Down Expand Up @@ -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"<script>alert('Successfully changed values!\\nusername: {username.lower()}\\nReal Name: {realName}\\nBlab Name: {blabName}');</script>"
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')
Expand Down Expand Up @@ -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:
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down