@@ -825,7 +825,7 @@ def _setTamperingFunctions():
825825
826826def _setPreprocessFunctions ():
827827 """
828- Loads preprocess functions from given script(s)
828+ Loads preprocess function(s) from given script(s)
829829 """
830830
831831 if conf .preprocess :
@@ -870,7 +870,7 @@ def _setPreprocessFunctions():
870870 raise SqlmapSyntaxException ("cannot import preprocess module '%s' (%s)" % (getUnicode (filename [:- 3 ]), getSafeExString (ex )))
871871
872872 for name , function in inspect .getmembers (module , inspect .isfunction ):
873- if name == "preprocess" and inspect .getargspec (function ).args and all (_ in inspect .getargspec (function ).args for _ in ("page" , "headers" , "code" )):
873+ if name == "preprocess" and inspect .getargspec (function ).args and all (_ in inspect .getargspec (function ).args for _ in ("req" , )):
874874 found = True
875875
876876 kb .preprocessFunctions .append (function )
@@ -879,21 +879,96 @@ def _setPreprocessFunctions():
879879 break
880880
881881 if not found :
882- errMsg = "missing function 'preprocess(page, headers=None, code=None )' "
882+ errMsg = "missing function 'preprocess(req )' "
883883 errMsg += "in preprocess script '%s'" % script
884884 raise SqlmapGenericException (errMsg )
885885 else :
886886 try :
887- _ , _ , _ = function ("" , {}, None )
887+ function (_urllib . request . Request ( "http://localhost" ) )
888888 except :
889889 handle , filename = tempfile .mkstemp (prefix = MKSTEMP_PREFIX .PREPROCESS , suffix = ".py" )
890890 os .close (handle )
891891
892- open (filename , "w+b" ).write ("#!/usr/bin/env\n \n def preprocess(page, headers=None, code=None ):\n return page, headers, code \n " )
893- open (os .path .join (os .path .dirname (filename ), "__init__.py" ), "w+b" ).write ("pass" )
892+ openFile (filename , "w+b" ).write ("#!/usr/bin/env\n \n def preprocess(req ):\n pass \n " )
893+ openFile (os .path .join (os .path .dirname (filename ), "__init__.py" ), "w+b" ).write ("pass" )
894894
895- errMsg = "function 'preprocess(page, headers=None, code=None )' "
895+ errMsg = "function 'preprocess(req )' "
896896 errMsg += "in preprocess script '%s' " % script
897+ errMsg += "appears to be invalid "
898+ errMsg += "(Note: find template script at '%s')" % filename
899+ raise SqlmapGenericException (errMsg )
900+
901+ def _setPostprocessFunctions ():
902+ """
903+ Loads postprocess function(s) from given script(s)
904+ """
905+
906+ if conf .postprocess :
907+ for script in re .split (PARAMETER_SPLITTING_REGEX , conf .postprocess ):
908+ found = False
909+ function = None
910+
911+ script = safeFilepathEncode (script .strip ())
912+
913+ try :
914+ if not script :
915+ continue
916+
917+ if not os .path .exists (script ):
918+ errMsg = "postprocess script '%s' does not exist" % script
919+ raise SqlmapFilePathException (errMsg )
920+
921+ elif not script .endswith (".py" ):
922+ errMsg = "postprocess script '%s' should have an extension '.py'" % script
923+ raise SqlmapSyntaxException (errMsg )
924+ except UnicodeDecodeError :
925+ errMsg = "invalid character provided in option '--postprocess'"
926+ raise SqlmapSyntaxException (errMsg )
927+
928+ dirname , filename = os .path .split (script )
929+ dirname = os .path .abspath (dirname )
930+
931+ infoMsg = "loading postprocess module '%s'" % filename [:- 3 ]
932+ logger .info (infoMsg )
933+
934+ if not os .path .exists (os .path .join (dirname , "__init__.py" )):
935+ errMsg = "make sure that there is an empty file '__init__.py' "
936+ errMsg += "inside of postprocess scripts directory '%s'" % dirname
937+ raise SqlmapGenericException (errMsg )
938+
939+ if dirname not in sys .path :
940+ sys .path .insert (0 , dirname )
941+
942+ try :
943+ module = __import__ (safeFilepathEncode (filename [:- 3 ]))
944+ except Exception as ex :
945+ raise SqlmapSyntaxException ("cannot import postprocess module '%s' (%s)" % (getUnicode (filename [:- 3 ]), getSafeExString (ex )))
946+
947+ for name , function in inspect .getmembers (module , inspect .isfunction ):
948+ if name == "postprocess" and inspect .getargspec (function ).args and all (_ in inspect .getargspec (function ).args for _ in ("page" , "headers" , "code" )):
949+ found = True
950+
951+ kb .postprocessFunctions .append (function )
952+ function .__name__ = module .__name__
953+
954+ break
955+
956+ if not found :
957+ errMsg = "missing function 'postprocess(page, headers=None, code=None)' "
958+ errMsg += "in postprocess script '%s'" % script
959+ raise SqlmapGenericException (errMsg )
960+ else :
961+ try :
962+ _ , _ , _ = function ("" , {}, None )
963+ except :
964+ handle , filename = tempfile .mkstemp (prefix = MKSTEMP_PREFIX .PREPROCESS , suffix = ".py" )
965+ os .close (handle )
966+
967+ openFile (filename , "w+b" ).write ("#!/usr/bin/env\n \n def postprocess(page, headers=None, code=None):\n return page, headers, code\n " )
968+ openFile (os .path .join (os .path .dirname (filename ), "__init__.py" ), "w+b" ).write ("pass" )
969+
970+ errMsg = "function 'postprocess(page, headers=None, code=None)' "
971+ errMsg += "in postprocess script '%s' " % script
897972 errMsg += "should return a tuple '(page, headers, code)' "
898973 errMsg += "(Note: find template script at '%s')" % filename
899974 raise SqlmapGenericException (errMsg )
@@ -2038,6 +2113,7 @@ def _setKnowledgeBaseAttributes(flushAll=True):
20382113 kb .keywords = set (getFileItems (paths .SQL_KEYWORDS ))
20392114 kb .normalizeCrawlingChoice = None
20402115 kb .passwordMgr = None
2116+ kb .postprocessFunctions = []
20412117 kb .preprocessFunctions = []
20422118 kb .skipVulnHost = None
20432119 kb .storeCrawlingChoice = None
@@ -2684,6 +2760,7 @@ def init():
26842760 _listTamperingFunctions ()
26852761 _setTamperingFunctions ()
26862762 _setPreprocessFunctions ()
2763+ _setPostprocessFunctions ()
26872764 _setTrafficOutputFP ()
26882765 _setupHTTPCollector ()
26892766 _setHttpChunked ()
0 commit comments