@@ -1045,6 +1045,8 @@ def queryPage(value=None, place=None, content=False, getRatioValue=False, silent
10451045 auxHeaders [value .split (',' )[0 ]] = value .split (',' , 1 )[- 1 ]
10461046
10471047 if conf .csrfToken :
1048+ token = AttribDict ()
1049+
10481050 def _adjustParameter (paramString , parameter , newValue ):
10491051 retVal = paramString
10501052
@@ -1061,56 +1063,64 @@ def _adjustParameter(paramString, parameter, newValue):
10611063
10621064 return retVal
10631065
1064- token = AttribDict ()
1065- page , headers , code = Connect .getPage (url = conf .csrfUrl or conf .url , data = conf .data if conf .csrfUrl == conf .url else None , method = conf .csrfMethod or (conf .method if conf .csrfUrl == conf .url else None ), cookie = conf .parameters .get (PLACE .COOKIE ), direct = True , silent = True , ua = conf .parameters .get (PLACE .USER_AGENT ), referer = conf .parameters .get (PLACE .REFERER ), host = conf .parameters .get (PLACE .HOST ))
1066- page = urldecode (page ) # for anti-CSRF tokens with special characters in their name (e.g. 'foo:bar=...')
1066+ for attempt in xrange (conf .csrfRetries + 1 ):
1067+ if token :
1068+ break
1069+
1070+ if attempt > 0 :
1071+ warnMsg = "unable to find anti-CSRF token '%s' at '%s'" % (conf .csrfToken ._original , conf .csrfUrl or conf .url )
1072+ warnMsg += ". sqlmap is going to retry the request"
1073+ logger .warn (warnMsg )
10671074
1068- match = re .search (r"(?i)<input[^>]+\bname=[\"']?(?P<name>%s)\b[^>]*\bvalue=[\"']?(?P<value>[^>'\"]*)" % conf .csrfToken , page or "" , re .I )
1075+ page , headers , code = Connect .getPage (url = conf .csrfUrl or conf .url , data = conf .data if conf .csrfUrl == conf .url else None , method = conf .csrfMethod or (conf .method if conf .csrfUrl == conf .url else None ), cookie = conf .parameters .get (PLACE .COOKIE ), direct = True , silent = True , ua = conf .parameters .get (PLACE .USER_AGENT ), referer = conf .parameters .get (PLACE .REFERER ), host = conf .parameters .get (PLACE .HOST ))
1076+ page = urldecode (page ) # for anti-CSRF tokens with special characters in their name (e.g. 'foo:bar=...')
10691077
1070- if not match :
1071- match = re .search (r"(?i)<input[^>]+\bvalue=[\"']?(?P<value>[^>'\"]*)[\"']?[^>]*\bname=[\"']?(?P<name>%s)\b" % conf .csrfToken , page or "" , re .I )
1078+ match = re .search (r"(?i)<input[^>]+\bname=[\"']?(?P<name>%s)\b[^>]*\bvalue=[\"']?(?P<value>[^>'\"]*)" % conf .csrfToken , page or "" , re .I )
10721079
10731080 if not match :
1074- match = re .search (r"(?P<name>%s)[\"']: [\"'](?P<value>[^\"']+) " % conf .csrfToken , page or "" , re .I )
1081+ match = re .search (r"(?i)<input[^>]+\bvalue= [\"']? (?P<value>[^>'\"]*)[\"']?[^>]*\bname=[\"']?(?P<name>%s)\b " % conf .csrfToken , page or "" , re .I )
10751082
10761083 if not match :
1077- match = re .search (r"\b (?P<name>%s)\s*[:=]\s* (?P<value>\w +)" % conf .csrfToken , str ( headers ) , re .I )
1084+ match = re .search (r"(?P<name>%s)[\"']:[\"'] (?P<value>[^\"'] +)" % conf .csrfToken , page or "" , re .I )
10781085
10791086 if not match :
1080- match = re .search (r"\b(?P<name>%s)\s*= \s*['\"]? (?P<value>[^;'\"] +)" % conf .csrfToken , page or "" , re .I )
1087+ match = re .search (r"\b(?P<name>%s)\s*[:=] \s*(?P<value>\w +)" % conf .csrfToken , str ( headers ) , re .I )
10811088
1082- if match :
1083- token . name , token . value = match . group ( " name" ), match . group ( "value" )
1089+ if not match :
1090+ match = re . search ( r"\b(?P< name>%s)\s*=\s*['\"]?(?P<value>[^;'\"]+)" % conf . csrfToken , page or "" , re . I )
10841091
1085- match = re .search (r"String\.fromCharCode\(([\d+, ]+)\)" , token .value )
10861092 if match :
1087- token .value = "" . join ( _unichr ( int ( _ )) for _ in match .group (1 ). replace ( ' ' , "" ). split ( ',' ) )
1093+ token .name , token . value = match . group ( "name" ), match .group ("value" )
10881094
1089- if not token :
1090- if conf .csrfUrl and conf .csrfToken and conf .csrfUrl != conf .url and code == _http_client .OK :
1091- if headers and "text/plain" in headers .get (HTTP_HEADER .CONTENT_TYPE , "" ):
1092- token .name = conf .csrfToken
1093- token .value = page
1094-
1095- if not token and conf .cj and any (re .search (conf .csrfToken , _ .name , re .I ) for _ in conf .cj ):
1096- for _ in conf .cj :
1097- if re .search (conf .csrfToken , _ .name , re .I ):
1098- token .name , token .value = _ .name , _ .value
1099- if not any (re .search (conf .csrfToken , ' ' .join (_ ), re .I ) for _ in (conf .paramDict .get (PLACE .GET , {}), conf .paramDict .get (PLACE .POST , {}))):
1100- if post :
1101- post = "%s%s%s=%s" % (post , conf .paramDel or DEFAULT_GET_POST_DELIMITER , token .name , token .value )
1102- elif get :
1103- get = "%s%s%s=%s" % (get , conf .paramDel or DEFAULT_GET_POST_DELIMITER , token .name , token .value )
1104- else :
1105- get = "%s=%s" % (token .name , token .value )
1106- break
1095+ match = re .search (r"String\.fromCharCode\(([\d+, ]+)\)" , token .value )
1096+ if match :
1097+ token .value = "" .join (_unichr (int (_ )) for _ in match .group (1 ).replace (' ' , "" ).split (',' ))
11071098
11081099 if not token :
1109- errMsg = "anti-CSRF token '%s' can't be found at '%s'" % (conf .csrfToken ._original , conf .csrfUrl or conf .url )
1110- if not conf .csrfUrl :
1111- errMsg += ". You can try to rerun by providing "
1112- errMsg += "a valid value for option '--csrf-url'"
1113- raise SqlmapTokenException (errMsg )
1100+ if conf .csrfUrl and conf .csrfToken and conf .csrfUrl != conf .url and code == _http_client .OK :
1101+ if headers and "text/plain" in headers .get (HTTP_HEADER .CONTENT_TYPE , "" ):
1102+ token .name = conf .csrfToken
1103+ token .value = page
1104+
1105+ if not token and conf .cj and any (re .search (conf .csrfToken , _ .name , re .I ) for _ in conf .cj ):
1106+ for _ in conf .cj :
1107+ if re .search (conf .csrfToken , _ .name , re .I ):
1108+ token .name , token .value = _ .name , _ .value
1109+ if not any (re .search (conf .csrfToken , ' ' .join (_ ), re .I ) for _ in (conf .paramDict .get (PLACE .GET , {}), conf .paramDict .get (PLACE .POST , {}))):
1110+ if post :
1111+ post = "%s%s%s=%s" % (post , conf .paramDel or DEFAULT_GET_POST_DELIMITER , token .name , token .value )
1112+ elif get :
1113+ get = "%s%s%s=%s" % (get , conf .paramDel or DEFAULT_GET_POST_DELIMITER , token .name , token .value )
1114+ else :
1115+ get = "%s=%s" % (token .name , token .value )
1116+ break
1117+
1118+ if not token :
1119+ errMsg = "anti-CSRF token '%s' can't be found at '%s'" % (conf .csrfToken ._original , conf .csrfUrl or conf .url )
1120+ if not conf .csrfUrl :
1121+ errMsg += ". You can try to rerun by providing "
1122+ errMsg += "a valid value for option '--csrf-url'"
1123+ raise SqlmapTokenException (errMsg )
11141124
11151125 if token :
11161126 token .value = token .value .strip ("'\" " )
0 commit comments