Evaluate any expression!
@@ -29,4 +30,4 @@
Output
-{% endblock %}
\ No newline at end of file
+{% endblock %}
diff --git a/introduction/templates/Lab/XSS/xss_lab_3.html b/introduction/templates/Lab/XSS/xss_lab_3.html
index a550b9a..e6935b3 100644
--- a/introduction/templates/Lab/XSS/xss_lab_3.html
+++ b/introduction/templates/Lab/XSS/xss_lab_3.html
@@ -19,7 +19,8 @@
Welcome to XSS Challenge
{{code}}
diff --git a/introduction/templates/Lab/ssrf/ssrf_discussion.html b/introduction/templates/Lab/ssrf/ssrf_discussion.html
index 7dc6678..2eb5868 100644
--- a/introduction/templates/Lab/ssrf/ssrf_discussion.html
+++ b/introduction/templates/Lab/ssrf/ssrf_discussion.html
@@ -123,22 +123,22 @@
ssrf_lab.html
@@ -50,4 +48,4 @@
Please Provide Credentials
-{% endblock %}
\ No newline at end of file
+{% endblock %}
diff --git a/introduction/views.py b/introduction/views.py
index 0f550c4..504c273 100644
--- a/introduction/views.py
+++ b/introduction/views.py
@@ -142,46 +142,28 @@ def sql(request):
return render(request,'Lab/SQL/sql.html')
else:
return redirect('login')
-
def sql_lab(request):
if request.user.is_authenticated:
-
- name=request.POST.get('name')
-
- password=request.POST.get('pass')
-
+ name = request.POST.get('name')
+ password = request.POST.get('pass')
+
if name:
-
- if login.objects.filter(user=name):
-
- sql_query = "SELECT * FROM introduction_login WHERE user='"+name+"'AND password='"+password+"'"
- print(sql_query)
- try:
- print("\nin try\n")
- val=login.objects.raw(sql_query)
- except:
- print("\nin except\n")
- return render(
- request,
- 'Lab/SQL/sql_lab.html',
- {
- "wrongpass":password,
- "sql_error":sql_query
- })
-
- if val:
- user=val[0].user
- return render(request, 'Lab/SQL/sql_lab.html',{"user1":user})
+ if login.objects.filter(user=name).exists():
+ val = login.objects.filter(user=name, password=password)
+ if val.exists():
+ user = val[0].user
+ return render(request, 'Lab/SQL/sql_lab.html', {"user1": user})
else:
return render(
request,
'Lab/SQL/sql_lab.html',
{
- "wrongpass":password,
- "sql_error":sql_query
- })
+ "wrongpass": password,
+ "sql_error": "Invalid username or password"
+ }
+ )
else:
- return render(request, 'Lab/SQL/sql_lab.html',{"no": "User not found"})
+ return render(request, 'Lab/SQL/sql_lab.html', {"no": "User not found"})
else:
return render(request, 'Lab/SQL/sql_lab.html')
else:
@@ -200,18 +182,19 @@ class TestUser:
admin: int = 0
pickled_user = pickle.dumps(TestUser())
encoded_user = base64.b64encode(pickled_user)
+import json
def insec_des_lab(request):
if request.user.is_authenticated:
response = render(request,'Lab/insec_des/insec_des_lab.html', {"message":"Only Admins can see this page"})
token = request.COOKIES.get('token')
- if token == None:
- token = encoded_user
- response.set_cookie(key='token',value=token.decode('utf-8'))
+ if token is None:
+ data = {'admin': 1}
+ token = json.dumps(data)
+ response.set_cookie(key='token', value=token, secure=True, httponly=True, samesite='Lax')
else:
- token = base64.b64decode(token)
- admin = pickle.loads(token)
- if admin.admin == 1:
+ data = json.loads(token)
+ if data.get('admin') == 1:
response = render(request,'Lab/insec_des/insec_des_lab.html', {"message":"Welcome Admin, SECRETKEY:ADMIN123"})
return response
@@ -234,8 +217,6 @@ def xxe_lab(request):
return render(request,'Lab/XXE/xxe_lab.html')
else:
return redirect('login')
-
-@csrf_exempt
def xxe_see(request):
if request.user.is_authenticated:
@@ -244,9 +225,6 @@ def xxe_see(request):
return render(request,'Lab/XXE/xxe_lab.html',{"com":com})
else:
return redirect('login')
-
-
-@csrf_exempt
def xxe_parse(request):
parser = make_parser()
@@ -269,7 +247,6 @@ def auth_home(request):
def auth_lab(request):
return render(request,'Lab/AUTH/auth_lab.html')
-
def auth_lab_signup(request):
if request.method == 'GET':
return render(request,'Lab/AUTH/auth_lab_signup.html')
@@ -280,25 +257,19 @@ def auth_lab_signup(request):
passwd = request.POST['pass']
obj = authLogin.objects.create(name=name,username=user_name,password=passwd)
try:
- rendered = render_to_string('Lab/AUTH/auth_success.html', {'username': obj.username,'userid':obj.userid,'name':obj.name,'err_msg':'Cookie Set'})
- response = HttpResponse(rendered)
- response.set_cookie('userid', obj.userid, max_age=31449600, samesite=None, secure=False)
- print('Setting cookie successful')
- return response
+ return render(request,'Lab/AUTH/auth_success.html', {'username': obj.username,'userid':obj.userid,'name':obj.name,'err_msg':'Cookie Set'})
except:
- render(request,'Lab/AUTH/auth_lab_signup.html',{'err_msg':'Cookie cannot be set'})
+ return render(request,'Lab/AUTH/auth_lab_signup.html',{'err_msg':'Cookie cannot be set'})
except:
return render(request,'Lab/AUTH/auth_lab_signup.html',{'err_msg':'Username already exists'})
-
+ response = render(request,'Lab/AUTH/auth_success.html', {'username': obj.username,'userid':obj.userid,'name':obj.name,'err_msg':'Cookie Set'})
+ response.set_cookie('userid', obj.userid, max_age=31449600, secure=True, httponly=True, samesite='Lax')
+ return response
def auth_lab_login(request):
if request.method == 'GET':
try:
obj = authLogin.objects.filter(userid=request.COOKIES['userid'])[0]
- rendered = render_to_string('Lab/AUTH/auth_success.html', {'username': obj.username,'userid':obj.userid,'name':obj.name, 'err_msg':'Login Successful'})
- response = HttpResponse(rendered)
- response.set_cookie('userid', obj.userid, max_age=31449600, samesite=None, secure=False)
- print('Login successful')
- return response
+ return render(request, 'Lab/AUTH/auth_success.html', {'username': obj.username,'userid':obj.userid,'name':obj.name, 'err_msg':'Login Successful'})
except:
return render(request,'Lab/AUTH/auth_lab_login.html')
elif request.method == 'POST':
@@ -307,32 +278,24 @@ def auth_lab_login(request):
passwd = request.POST['pass']
print(user_name,passwd)
obj = authLogin.objects.filter(username=user_name,password=passwd)[0]
- try:
- rendered = render_to_string('Lab/AUTH/auth_success.html', {'username': obj.username,'userid':obj.userid,'name':obj.name, 'err_msg':'Login Successful'})
- response = HttpResponse(rendered)
- response.set_cookie('userid', obj.userid, max_age=31449600, samesite=None, secure=False)
- print('Login successful')
- return response
- except:
- render(request,'Lab/AUTH/auth_lab_login.html',{'err_msg':'Cookie cannot be set'})
+ response = render(request, 'Lab/AUTH/auth_success.html', {'username': obj.username,'userid':obj.userid,'name':obj.name, 'err_msg':'Login Successful'})
+ response.set_cookie('userid', obj.userid, max_age=31449600, secure=True, httponly=True, samesite='Lax')
+ print('Login successful')
+ return response
except:
return render(request,'Lab/AUTH/auth_lab_login.html',{'err_msg':'Check your credentials'})
+from django.shortcuts import render
def auth_lab_logout(request):
- rendered = render_to_string('Lab/AUTH/auth_lab.html',context={'err_msg':'Logout successful'})
- response = HttpResponse(rendered)
- response.delete_cookie('userid')
- return response
-
-#***************************************************************Broken Access Control************************************************************#
-
-@csrf_exempt
+ return render(request, 'Lab/AUTH/auth_lab.html', context={'err_msg':'Logout successful'})
def ba(request):
if request.user.is_authenticated:
return render(request,"Lab/BrokenAccess/ba.html")
else:
return redirect('login')
-@csrf_exempt
+from django.middleware.csrf import csrf_protect
+
+@csrf_protect
def ba_lab(request):
if request.user.is_authenticated:
name = request.POST.get('name')
@@ -405,7 +368,8 @@ def cmd(request):
return render(request,'Lab/CMD/cmd.html')
else:
return redirect('login')
-@csrf_exempt
+from shlex import quote
+
def cmd_lab(request):
if request.user.is_authenticated:
if(request.method=="POST"):
@@ -414,22 +378,18 @@ def cmd_lab(request):
os=request.POST.get('os')
print(os)
if(os=='win'):
- command="nslookup {}".format(domain)
+ command=["nslookup", quote(domain)]
else:
- command = "dig {}".format(domain)
+ command = ["dig", quote(domain)]
try:
- # output=subprocess.check_output(command,shell=True,encoding="UTF-8")
process = subprocess.Popen(
command,
- shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
stdout, stderr = process.communicate()
data = stdout.decode('utf-8')
stderr = stderr.decode('utf-8')
- # res = json.loads(data)
- # print("Stdout\n" + data)
output = data + stderr
print(data + stderr)
except:
@@ -441,17 +401,15 @@ def cmd_lab(request):
return render(request, 'Lab/CMD/cmd_lab.html')
else:
return redirect('login')
-
-@csrf_exempt
def cmd_lab2(request):
if request.user.is_authenticated:
if (request.method=="POST"):
val=request.POST.get('val')
-
print(val)
try:
- output = eval(val)
- except:
+ # Assuming val is a simple arithmetic expression
+ output = SafeMathEvaluator().evaluate(val)
+ except Exception as e:
output = "Something went wrong"
return render(request,'Lab/CMD/cmd_lab2.html',{"output":output})
print("Output = ", output)
@@ -461,6 +419,21 @@ def cmd_lab2(request):
else:
return redirect('login')
+class SafeMathEvaluator:
+ def __init__(self):
+ self-safe_operators = {
+ '+': lambda x, y: x + y,
+ '-': lambda x, y: x - y,
+ '*': lambda x, y: x * y,
+ '/': lambda x, y: x / y if y != 0 else float('inf')
+ }
+
+ def evaluate(self, expression):
+ # Implement a simple arithmetic expression evaluator
+ # You may want to use a library like asteval or numexpr for more complex expressions
+ # ...
+ pass
+
#******************************************Broken Authentication**************************************************#
def bau(request):
@@ -481,8 +454,9 @@ def bau_lab(request):
def login_otp(request):
return render(request,"Lab/BrokenAuth/otp.html")
+from django.views.decorators.csrf import csrf_protect
-@csrf_exempt
+@csrf_protect
def Otp(request):
if request.method=="GET":
email=request.GET.get('email')
@@ -540,7 +514,8 @@ def a9(request):
return render(request,"Lab/A9/a9.html")
else:
return redirect('login')
-@csrf_exempt
+import json
+
def a9_lab(request):
if request.user.is_authenticated:
if request.method=="GET":
@@ -550,26 +525,26 @@ def a9_lab(request):
try :
file=request.FILES["file"]
try :
- data = yaml.load(file,yaml.Loader)
+ data = json.load(file)
return render(request,"Lab/A9/a9_lab.html",{"data":data})
except:
return render(request, "Lab/A9/a9_lab.html", {"data": "Error"})
except:
- return render(request, "Lab/A9/a9_lab.html", {"data":"Please Upload a Yaml file."})
+ return render(request, "Lab/A9/a9_lab.html", {"data":"Please Upload a Json file."})
else:
return redirect('login')
def get_version(request):
return render(request,"Lab/A9/a9_lab.html",{"version":"pyyaml v5.1"})
-
-@csrf_exempt
def a9_lab2(request):
if not request.user.is_authenticated:
return redirect('login')
if request.method == "GET":
- return render (request,"Lab/A9/a9_lab2.html")
+ c = {}
+ c.update(csrf(request))
+ return render(request,"Lab/A9/a9_lab2.html", c)
elif request.method == "POST":
try :
file=request.FILES["file"]
@@ -589,6 +564,8 @@ def a9_lab2(request):
img.save(bufferd_ref, format="JPEG")
img_str_ref = base64.b64encode(bufferd_ref.getvalue()).decode("utf-8")
try :
+ c = {}
+ c.update(csrf(request))
return render(request,"Lab/A9/a9_lab2.html",{"img_str": img_str,"img_str_ref":img_str_ref, "success": True})
except Exception as e:
print(e)
@@ -721,22 +698,22 @@ def insec_desgine_lab(request):
pass
else:
return redirect('login')
-
-
#-------------------------------------------------------------------------------------------------------------------------
#-------------------------------------------------------------------------------------------------------------------------
###################################################### 2021 A1: Broken Access
-@csrf_exempt
def a1_broken_access(request):
if not request.user.is_authenticated:
return redirect('login')
return render(request,"Lab_2021/A1_BrokenAccessControl/broken_access.html")
+from django.template.loader import get_template
+from django.template import Context
+from django.http import HttpResponse
+from django.middleware.csrf import CSRF_exempt, csrf_protect
-
-@csrf_exempt
+@csrf_protect
def a1_broken_access_lab_1(request):
if request.user.is_authenticated:
pass
@@ -771,14 +748,17 @@ def a1_broken_access_lab_1(request):
else:
return render(request,'Lab_2021/A1_BrokenAccessControl/broken_access_lab_1.html',{"no_creds":True})
-
-@csrf_exempt
def a1_broken_access_lab_2(request):
if request.user.is_authenticated:
pass
else:
return redirect('login')
+ if request.method == 'POST':
+ csrf_token = csrf.get_token(request)
+ if csrf_token != request.POST.get('csrfmiddlewaretoken'):
+ return HttpResponseForbidden()
+
name = request.POST.get('name')
password = request.POST.get('pass')
user_agent = request.META['HTTP_USER_AGENT']
@@ -786,7 +766,7 @@ def a1_broken_access_lab_2(request):
# print(name)
# print(password)
print(user_agent)
- if name :
+ if name:
if (user_agent == "pygoat_admin"):
return render(
request,
@@ -796,7 +776,7 @@ def a1_broken_access_lab_2(request):
"username": "admin",
"status": "admin"
})
- elif ( name=='jack' and password=='jacktheripper'): # Will implement hashing here
+ elif (name=='jack' and password=='jacktheripper'): # Will implement hashing here
html = render(
request,
'Lab_2021/A1_BrokenAccessControl/broken_access_lab_2.html',
@@ -832,19 +812,11 @@ def a1_broken_access_lab3_secret(request):
return redirect('login')
# no checking applied here
return render(request, 'Lab_2021/A1_BrokenAccessControl/secret.html')
-
-
-###################################################### 2021 A3: Injection
-
-@csrf_exempt
def injection(request):
if not request.user.is_authenticated:
return redirect('login')
return render(request,"Lab_2021/A3_Injection/injection.html")
-
-
-@csrf_exempt
def injection_sql_lab(request):
if request.user.is_authenticated:
@@ -854,43 +826,18 @@ def injection_sql_lab(request):
print(password)
if name:
- sql_query = "SELECT * FROM introduction_sql_lab_table WHERE id='"+name+"'AND password='"+password+"'"
-
- sql_instance = sql_lab_table(id="admin", password="65079b006e85a7e798abecb99e47c154")
- sql_instance.save()
- sql_instance = sql_lab_table(id="jack", password="jack")
- sql_instance.save()
- sql_instance = sql_lab_table(id="slinky", password="b4f945433ea4c369c12741f62a23ccc0")
- sql_instance.save()
- sql_instance = sql_lab_table(id="bloke", password="f8d1ce191319ea8f4d1d26e65e130dd5")
- sql_instance.save()
-
- print(sql_query)
-
try:
- user = sql_lab_table.objects.raw(sql_query)
- user = user[0].id
- print(user)
-
- except:
+ user = sql_lab_table.objects.get(id=name, password=password)
+ print(user.id)
+ return render(request, 'Lab_2021/A3_Injection/sql_lab.html',{"user1":user.id})
+ except sql_lab_table.DoesNotExist:
return render(
request,
'Lab_2021/A3_Injection/sql_lab.html',
{
"wrongpass":password,
- "sql_error":sql_query
})
- if user:
- return render(request, 'Lab_2021/A3_Injection/sql_lab.html',{"user1":user})
- else:
- return render(
- request,
- 'Lab_2021/A3_Injection/sql_lab.html',
- {
- "wrongpass":password,
- "sql_error":sql_query
- })
else:
return render(request, 'Lab_2021/A3_Injection/sql_lab.html')
else:
@@ -907,16 +854,18 @@ def ssrf(request):
return render(request,"Lab/ssrf/ssrf.html")
else:
return redirect('login')
-
def ssrf_lab(request):
if request.user.is_authenticated:
if request.method=="GET":
return render(request,"Lab/ssrf/ssrf_lab.html",{"blog":"Read Blog About SSRF"})
else:
file=request.POST["blog"]
- try :
- dirname = os.path.dirname(__file__)
- filename = os.path.join(dirname, file)
+ filename = os.path.basename(file)
+ if not filename:
+ return render(request, "Lab/ssrf/ssrf_lab.html", {"blog": "No blog found"})
+ dirname = os.path.dirname(__file__)
+ filename = os.path.join(dirname, filename)
+ try:
file = open(filename,"r")
data = file.read()
return render(request,"Lab/ssrf/ssrf_lab.html",{"blog":data})
@@ -944,7 +893,6 @@ def ssrf_target(request):
return render(request,"Lab/ssrf/ssrf_target.html")
else:
return render(request,"Lab/ssrf/ssrf_target.html",{"access_denied":True})
-
@authentication_decorator
def ssrf_lab2(request):
if request.method == "GET":
@@ -952,11 +900,18 @@ def ssrf_lab2(request):
elif request.method == "POST":
url = request.POST["url"]
- try:
- response = requests.get(url)
- return render(request, "Lab/ssrf/ssrf_lab2.html", {"response": response.content.decode()})
- except:
- return render(request, "Lab/ssrf/ssrf_lab2.html", {"error": "Invalid URL"})
+ parsed_url = urlparse(url)
+ allowed_schemes = ['http', 'https']
+ allowed_hosts = ['example.com', 'other-allowed-host.com']
+ if parsed_url.scheme in allowed_schemes and parsed_url.netloc in allowed_hosts:
+ try:
+ response = requests.get(url)
+ return render(request, "Lab/ssrf/ssrf_lab2.html", {"response": response.content.decode()})
+ except:
+ return render(request, "Lab/ssrf/ssrf_lab2.html", {"error": "Invalid URL"})
+ else:
+ return render(request, "Lab/ssrf/ssrf_lab2.html", {"error": "Forbidden URL"})
+
#--------------------------------------- Server-side template injection --------------------------------------#
def ssti(request):
@@ -964,6 +919,9 @@ def ssti(request):
return render(request,"Lab_2021/A3_Injection/ssti.html")
else:
return redirect('login')
+from django import template
+from django.utils.safestring import mark_safe
+from markdown import markdown
def ssti_lab(request):
if request.user.is_authenticated:
@@ -974,7 +932,7 @@ def ssti_lab(request):
blog = request.POST["blog"]
id = str(uuid.uuid4()).split('-')[-1]
- blog = filter_blog(blog)
+ blog = markdown(mark_safe(filter_blog(blog))) # sanitized user input
prepend_code = "{% extends 'introduction/base.html' %}\
{% block content %}{% block title %}\
SSTI-Blogs\
@@ -1007,6 +965,8 @@ def crypto_failure(request):
return render(request,"Lab_2021/A2_Crypto_failur/crypto_failure.html",{"success":False,"failure":False})
else:
redirect('login')
+import hashlib
+import os
def crypto_failure_lab(request):
if request.user.is_authenticated:
@@ -1015,10 +975,15 @@ def crypto_failure_lab(request):
elif request.method=="POST":
username = request.POST["username"]
password = request.POST["password"]
+ salt = os.urandom(16)
+ key = hashlib.scrypt(password.encode(), salt=salt, n=16384, r=8, p=1)
try:
- password = md5(password.encode()).hexdigest()
- user = CF_user.objects.get(username=username,password=password)
- return render(request,"Lab_2021/A2_Crypto_failur/crypto_failure_lab.html",{"user":user, "success":True,"failure":False})
+ user = CF_user.objects.get(username=username)
+ stored_key = user.password
+ if hashlib.scrypt(password.encode(), salt=stored_key[:16], n=16384, r=8, p=1) == stored_key[16:]:
+ return render(request,"Lab_2021/A2_Crypto_failur/crypto_failure_lab.html",{"user":user, "success":True,"failure":False})
+ else:
+ return render(request,"Lab_2021/A2_Crypto_failur/crypto_failure_lab.html",{"success":False, "failure":True})
except:
return render(request,"Lab_2021/A2_Crypto_failur/crypto_failure_lab.html",{"success":False, "failure":True})
else :
@@ -1037,7 +1002,6 @@ def crypto_failure_lab2(request):
return render(request,"Lab_2021/A2_Crypto_failur/crypto_failure_lab2.html",{"user":user, "success":True,"failure":False})
except:
return render(request,"Lab_2021/A2_Crypto_failur/crypto_failure_lab2.html",{"success":False, "failure":True})
-
# based on CWE-319
def crypto_failure_lab3(request):
if request.user.is_authenticated:
@@ -1066,20 +1030,18 @@ def crypto_failure_lab3(request):
expire = datetime.datetime.now() + datetime.timedelta(minutes=60)
cookie = f"{username}|{expire}"
response = render(request,"Lab_2021/A2_Crypto_failur/crypto_failure_lab3.html",{"success":True, "failure":False , "admin":False})
- response.set_cookie("cookie", cookie)
+ response.set_cookie("cookie", cookie, secure=True, httponly=True, samesite='Lax')
response.status_code = 200
return response
else:
response = render(request,"Lab_2021/A2_Crypto_failur/crypto_failure_lab3.html",{"success":False, "failure":True})
- response.set_cookie("cookie", None)
+ response.set_cookie("cookie", None, secure=True, httponly=True, samesite='Lax')
return response
except:
return render(request,"Lab_2021/A2_Crypto_failur/crypto_failure_lab2.html",{"success":False, "failure":True})
#-----------------------------------------------SECURITY MISCONFIGURATION -------------------
from pygoat.settings import SECRET_COOKIE_KEY
-
-
def sec_misconfig_lab3(request):
if not request.user.is_authenticated:
return redirect('login')
@@ -1099,7 +1061,7 @@ def sec_misconfig_lab3(request):
cookie = jwt.encode(payload, SECRET_COOKIE_KEY, algorithm='HS256')
response = render(request,"Lab/sec_mis/sec_mis_lab3.html", {"admin":False} )
- response.set_cookie(key = "auth_cookie", value = cookie)
+ response.set_cookie(key = "auth_cookie", value = cookie, secure=True, httponly=True, samesite='Lax')
return response
# - ------------------------Identification and Authentication Failures--------------------------------
@@ -1159,7 +1121,6 @@ def auth_failure_lab2(request):
"User3":{"userid":"3", "username":"User3", "password": "5a91a66f0c86b5435fe748706b99c17e6e54a17e03c2a3ef8d0dfa918db41cf6"},
"User4":{"userid":"4", "username":"User4", "password": "6046bc3337728a60967a151ee584e4fd7c53740a49485ebdc38cac42a255f266"}
}
-
# USER_A7_LAB3 = {
# "User1":{"userid":"1", "username":"User1", "password": "Hash1"},
# "User2":{"userid":"2", "username":"User2", "password": "Hash2"},
@@ -1168,7 +1129,6 @@ def auth_failure_lab2(request):
# }
@authentication_decorator
-@csrf_exempt
def auth_failure_lab3(request):
if request.method == "GET":
try:
@@ -1187,14 +1147,14 @@ def auth_failure_lab3(request):
password = hashlib.sha256(password.encode()).hexdigest()
except:
response = render(request, "Lab_2021/A7_auth_failure/lab3.html")
- response.set_cookie("session_id", None)
+ response.set_cookie("session_id", None, secure=True, httponly=True, samesite='Lax')
return response
if USER_A7_LAB3[username]['password'] == password:
session_data = AF_session_id.objects.create(session_id=token, user=USER_A7_LAB3[username]['username'])
session_data.save()
response = render(request, "Lab_2021/A7_auth_failure/lab3.html", {"success":True, "failure":False, "username":username})
- response.set_cookie("session_id", token)
+ response.set_cookie("session_id", token, secure=True, httponly=True, samesite='Lax')
return response
#-- coding playground for lab2