@@ -405,7 +405,6 @@ def cmd(request):
405405 return render (request ,'Lab/CMD/cmd.html' )
406406 else :
407407 return redirect ('login' )
408- @csrf_exempt
409408def cmd_lab (request ):
410409 if request .user .is_authenticated :
411410 if (request .method == "POST" ):
@@ -414,15 +413,15 @@ def cmd_lab(request):
414413 os = request .POST .get ('os' )
415414 print (os )
416415 if (os == 'win' ):
417- command = "nslookup {}" . format ( domain )
416+ command = [ "nslookup" , domain ]
418417 else :
419- command = "dig {}" . format ( domain )
418+ command = [ "dig" , domain ]
420419
421420 try :
422421 # output=subprocess.check_output(command,shell=True,encoding="UTF-8")
423422 process = subprocess .Popen (
424423 command ,
425- shell = True ,
424+ shell = False ,
426425 stdout = subprocess .PIPE ,
427426 stderr = subprocess .PIPE )
428427 stdout , stderr = process .communicate ()
@@ -481,8 +480,6 @@ def bau_lab(request):
481480
482481def login_otp (request ):
483482 return render (request ,"Lab/BrokenAuth/otp.html" )
484-
485- @csrf_exempt
486483def Otp (request ):
487484 if request .method == "GET" :
488485 email = request .GET .get ('email' )
@@ -540,7 +537,6 @@ def a9(request):
540537 return render (request ,"Lab/A9/a9.html" )
541538 else :
542539 return redirect ('login' )
543- @csrf_exempt
544540def a9_lab (request ):
545541 if request .user .is_authenticated :
546542 if request .method == "GET" :
@@ -550,7 +546,8 @@ def a9_lab(request):
550546 try :
551547 file = request .FILES ["file" ]
552548 try :
553- data = yaml .load (file ,yaml .Loader )
549+ import json
550+ data = json .loads (file .read ())
554551
555552 return render (request ,"Lab/A9/a9_lab.html" ,{"data" :data })
556553 except :
@@ -562,8 +559,6 @@ def a9_lab(request):
562559 return redirect ('login' )
563560def get_version (request ):
564561 return render (request ,"Lab/A9/a9_lab.html" ,{"version" :"pyyaml v5.1" })
565-
566- @csrf_exempt
567562def a9_lab2 (request ):
568563 if not request .user .is_authenticated :
569564 return redirect ('login' )
@@ -598,6 +593,7 @@ def a9_lab2(request):
598593 return render (request , "Lab/A9/a9_lab2.html" , {"data" :"Please Upload a file" , "error" :True })
599594
600595
596+
601597@authentication_decorator
602598def A9_discussion (request ):
603599 return render (request , "playground/A9/index.html" )
@@ -734,9 +730,6 @@ def a1_broken_access(request):
734730 return redirect ('login' )
735731
736732 return render (request ,"Lab_2021/A1_BrokenAccessControl/broken_access.html" )
737-
738-
739- @csrf_exempt
740733def a1_broken_access_lab_1 (request ):
741734 if request .user .is_authenticated :
742735 pass
@@ -771,8 +764,6 @@ def a1_broken_access_lab_1(request):
771764
772765 else :
773766 return render (request ,'Lab_2021/A1_BrokenAccessControl/broken_access_lab_1.html' ,{"no_creds" :True })
774-
775- @csrf_exempt
776767def a1_broken_access_lab_2 (request ):
777768 if request .user .is_authenticated :
778769 pass
@@ -842,9 +833,6 @@ def injection(request):
842833 return redirect ('login' )
843834
844835 return render (request ,"Lab_2021/A3_Injection/injection.html" )
845-
846-
847- @csrf_exempt
848836def injection_sql_lab (request ):
849837 if request .user .is_authenticated :
850838
@@ -854,7 +842,7 @@ def injection_sql_lab(request):
854842 print (password )
855843
856844 if name :
857- sql_query = "SELECT * FROM introduction_sql_lab_table WHERE id='" + name + "' AND password='" + password + "' "
845+ sql_query = "SELECT * FROM introduction_sql_lab_table WHERE id=%s AND password=%s "
858846
859847 sql_instance = sql_lab_table (id = "admin" , password = "65079b006e85a7e798abecb99e47c154" )
860848 sql_instance .save ()
@@ -868,7 +856,7 @@ def injection_sql_lab(request):
868856 print (sql_query )
869857
870858 try :
871- user = sql_lab_table .objects .raw (sql_query )
859+ user = sql_lab_table .objects .raw (sql_query , [ name , password ] )
872860 user = user [0 ].id
873861 print (user )
874862
@@ -897,6 +885,7 @@ def injection_sql_lab(request):
897885 return redirect ('login' )
898886
899887
888+
900889##----------------------------------------------------------------------------------------------------------
901890##----------------------------------------------------------------------------------------------------------
902891
@@ -907,7 +896,6 @@ def ssrf(request):
907896 return render (request ,"Lab/ssrf/ssrf.html" )
908897 else :
909898 return redirect ('login' )
910-
911899def ssrf_lab (request ):
912900 if request .user .is_authenticated :
913901 if request .method == "GET" :
@@ -917,6 +905,7 @@ def ssrf_lab(request):
917905 try :
918906 dirname = os .path .dirname (__file__ )
919907 filename = os .path .join (dirname , file )
908+ filename = os .path .abspath (filename )
920909 file = open (filename ,"r" )
921910 data = file .read ()
922911 return render (request ,"Lab/ssrf/ssrf_lab.html" ,{"blog" :data })
@@ -944,26 +933,39 @@ def ssrf_target(request):
944933 return render (request ,"Lab/ssrf/ssrf_target.html" )
945934 else :
946935 return render (request ,"Lab/ssrf/ssrf_target.html" ,{"access_denied" :True })
947-
948936@authentication_decorator
949937def ssrf_lab2 (request ):
950938 if request .method == "GET" :
951939 return render (request , "Lab/ssrf/ssrf_lab2.html" )
952940
953941 elif request .method == "POST" :
954942 url = request .POST ["url" ]
943+ allowed_schemes = ["https" ]
944+ allowed_hosts = ["example.com" ]
955945 try :
956- response = requests .get (url )
957- return render (request , "Lab/ssrf/ssrf_lab2.html" , {"response" : response .content .decode ()})
946+ parsed_url = urlparse (url )
947+ if parsed_url .scheme in allowed_schemes and parsed_url .netloc in allowed_hosts :
948+ response = requests .get (url )
949+ return render (request , "Lab/ssrf/ssrf_lab2.html" , {"response" : "Request successful" })
950+ else :
951+ return render (request , "Lab/ssrf/ssrf_lab2.html" , {"error" : "Invalid URL" })
958952 except :
959953 return render (request , "Lab/ssrf/ssrf_lab2.html" , {"error" : "Invalid URL" })
954+
960955#--------------------------------------- Server-side template injection --------------------------------------#
961956
962957def ssti (request ):
963958 if request .user .is_authenticated :
964959 return render (request ,"Lab_2021/A3_Injection/ssti.html" )
965960 else :
966961 return redirect ('login' )
962+ from django .shortcuts import render
963+ from django .shortcuts import redirect
964+ from django .http import HttpResponse
965+ from .models import Blogs
966+ import os
967+ import uuid
968+ from django .template import Template
967969
968970def ssti_lab (request ):
969971 if request .user .is_authenticated :
@@ -985,8 +987,10 @@ def ssti_lab(request):
985987 new_blog .save ()
986988 dirname = os .path .dirname (__file__ )
987989 filename = os .path .join (dirname , f"templates/Lab_2021/A3_Injection/Blogs/{ id } .html" )
990+ template = Template (blog )
991+ rendered_blog = template .render ({})
988992 file = open (filename , "w+" )
989- file .write (blog )
993+ file .write (rendered_blog )
990994 file .close ()
991995 return redirect (f'blog/{ id } ' )
992996 else :
@@ -1007,6 +1011,7 @@ def crypto_failure(request):
10071011 return render (request ,"Lab_2021/A2_Crypto_failur/crypto_failure.html" ,{"success" :False ,"failure" :False })
10081012 else :
10091013 redirect ('login' )
1014+ import hashlib
10101015
10111016def crypto_failure_lab (request ):
10121017 if request .user .is_authenticated :
@@ -1016,14 +1021,20 @@ def crypto_failure_lab(request):
10161021 username = request .POST ["username" ]
10171022 password = request .POST ["password" ]
10181023 try :
1019- password = md5 (password .encode ()).hexdigest ()
1020- user = CF_user .objects .get (username = username ,password = password )
1024+ user = CF_user .objects .get (username = username )
1025+ # Assuming 'password' field now stores salt
1026+ salt = user .password [:32 ]
1027+ password_hash = hashlib .scrypt (
1028+ password .encode (), salt = salt , n = 2 ** 14 , r = 8 , p = 1
1029+ ).hex ()
1030+ user = CF_user .objects .get (username = username , password = password_hash )
10211031 return render (request ,"Lab_2021/A2_Crypto_failur/crypto_failure_lab.html" ,{"user" :user , "success" :True ,"failure" :False })
10221032 except :
10231033 return render (request ,"Lab_2021/A2_Crypto_failur/crypto_failure_lab.html" ,{"success" :False , "failure" :True })
10241034 else :
10251035 return redirect ('login' )
10261036
1037+
10271038def crypto_failure_lab2 (request ):
10281039 if request .user .is_authenticated :
10291040 if request .method == "GET" :
@@ -1037,7 +1048,6 @@ def crypto_failure_lab2(request):
10371048 return render (request ,"Lab_2021/A2_Crypto_failur/crypto_failure_lab2.html" ,{"user" :user , "success" :True ,"failure" :False })
10381049 except :
10391050 return render (request ,"Lab_2021/A2_Crypto_failur/crypto_failure_lab2.html" ,{"success" :False , "failure" :True })
1040-
10411051# based on CWE-319
10421052def crypto_failure_lab3 (request ):
10431053 if request .user .is_authenticated :
@@ -1066,20 +1076,19 @@ def crypto_failure_lab3(request):
10661076 expire = datetime .datetime .now () + datetime .timedelta (minutes = 60 )
10671077 cookie = f"{ username } |{ expire } "
10681078 response = render (request ,"Lab_2021/A2_Crypto_failur/crypto_failure_lab3.html" ,{"success" :True , "failure" :False , "admin" :False })
1069- response .set_cookie ("cookie" , cookie )
1079+ response .set_cookie ("cookie" , cookie , httponly = True , secure = True , samesite = 'Lax' )
10701080 response .status_code = 200
10711081 return response
10721082 else :
10731083 response = render (request ,"Lab_2021/A2_Crypto_failur/crypto_failure_lab3.html" ,{"success" :False , "failure" :True })
1074- response .set_cookie ("cookie" , None )
1084+ response .set_cookie ("cookie" , None , httponly = True , secure = True , samesite = 'Lax' )
10751085 return response
10761086 except :
10771087 return render (request ,"Lab_2021/A2_Crypto_failur/crypto_failure_lab2.html" ,{"success" :False , "failure" :True })
10781088
1089+
10791090#-----------------------------------------------SECURITY MISCONFIGURATION -------------------
10801091from pygoat .settings import SECRET_COOKIE_KEY
1081-
1082-
10831092def sec_misconfig_lab3 (request ):
10841093 if not request .user .is_authenticated :
10851094 return redirect ('login' )
@@ -1099,7 +1108,7 @@ def sec_misconfig_lab3(request):
10991108
11001109 cookie = jwt .encode (payload , SECRET_COOKIE_KEY , algorithm = 'HS256' )
11011110 response = render (request ,"Lab/sec_mis/sec_mis_lab3.html" , {"admin" :False } )
1102- response .set_cookie (key = "auth_cookie" , value = cookie )
1111+ response .set_cookie (key = "auth_cookie" , value = cookie , secure = True , httponly = True , samesite = 'Lax' )
11031112 return response
11041113
11051114# - ------------------------Identification and Authentication Failures--------------------------------
@@ -1159,7 +1168,6 @@ def auth_failure_lab2(request):
11591168 "User3" :{"userid" :"3" , "username" :"User3" , "password" : "5a91a66f0c86b5435fe748706b99c17e6e54a17e03c2a3ef8d0dfa918db41cf6" },
11601169 "User4" :{"userid" :"4" , "username" :"User4" , "password" : "6046bc3337728a60967a151ee584e4fd7c53740a49485ebdc38cac42a255f266" }
11611170}
1162-
11631171# USER_A7_LAB3 = {
11641172# "User1":{"userid":"1", "username":"User1", "password": "Hash1"},
11651173# "User2":{"userid":"2", "username":"User2", "password": "Hash2"},
@@ -1168,7 +1176,6 @@ def auth_failure_lab2(request):
11681176# }
11691177
11701178@authentication_decorator
1171- @csrf_exempt
11721179def auth_failure_lab3 (request ):
11731180 if request .method == "GET" :
11741181 try :
@@ -1194,7 +1201,7 @@ def auth_failure_lab3(request):
11941201 session_data = AF_session_id .objects .create (session_id = token , user = USER_A7_LAB3 [username ]['username' ])
11951202 session_data .save ()
11961203 response = render (request , "Lab_2021/A7_auth_failure/lab3.html" , {"success" :True , "failure" :False , "username" :username })
1197- response .set_cookie ("session_id" , token )
1204+ response .set_cookie ("session_id" , token , secure = True , httponly = True , samesite = 'Lax' )
11981205 return response
11991206
12001207#-- coding playground for lab2
0 commit comments