Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit ddc4dfe

Browse files
committed
minor refactoring for regarding --forms
1 parent d7866ac commit ddc4dfe

2 files changed

Lines changed: 73 additions & 58 deletions

File tree

lib/core/common.py

Lines changed: 69 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@
4343
from xml.dom import minidom
4444
from xml.sax import parse
4545

46+
from extra.clientform.clientform import ParseResponse
47+
from extra.clientform.clientform import ParseError
4648
from extra.cloak.cloak import decloak
4749
from extra.magic import magic
4850
from extra.odict.odict import OrderedDict
@@ -53,10 +55,12 @@
5355
from lib.core.data import queries
5456
from lib.core.convert import htmlunescape
5557
from lib.core.convert import safecharencode
58+
from lib.core.convert import unicodeencode
5659
from lib.core.convert import urldecode
5760
from lib.core.convert import urlencode
5861
from lib.core.enums import DBMS
5962
from lib.core.enums import HTTPHEADER
63+
from lib.core.enums import HTTPMETHOD
6064
from lib.core.enums import OS
6165
from lib.core.enums import PLACE
6266
from lib.core.enums import PAYLOAD
@@ -3013,7 +3017,7 @@ def randomizeParameterValue(value):
30133017

30143018
return retVal
30153019

3016-
def asciifyUrl(url, force_quote=False):
3020+
def asciifyUrl(url, forceQuote=False):
30173021
"""
30183022
Attempts to make a unicode url usuable with ``urllib/urllib2``.
30193023
@@ -3046,7 +3050,7 @@ def quote(s, safe):
30463050
# Triggers on non-ascii characters - another option would be:
30473051
# urllib.quote(s.replace('%', '')) != s.replace('%', '')
30483052
# which would trigger on all %-characters, e.g. "&".
3049-
if s.encode('ascii', 'replace') != s or force_quote:
3053+
if s.encode('ascii', 'replace') != s or forceQuote:
30503054
return urllib.quote(s.encode('utf8'), safe=safe)
30513055
return s
30523056

@@ -3065,4 +3069,66 @@ def quote(s, safe):
30653069
if parts.port:
30663070
netloc += ':' + str(parts.port)
30673071

3068-
return urlparse.urlunsplit([parts.scheme, netloc, path, query, parts.fragment])
3072+
return urlparse.urlunsplit([parts.scheme, netloc, path, query, parts.fragment])
3073+
3074+
def findPageForms(content, url, raise_=False, addToTargets=False):
3075+
class _(StringIO):
3076+
def __init__(self):
3077+
StringIO.__init__(self, unicodeencode(content, kb.pageEncoding) if isinstance(content, unicode) else content)
3078+
self._url = url
3079+
def geturl(self):
3080+
return self._url
3081+
3082+
if raise_ and not content:
3083+
errMsg = "can't parse forms as the page content appears to be blank"
3084+
raise sqlmapGenericException, errMsg
3085+
3086+
retVal = set()
3087+
response = _()
3088+
try:
3089+
forms = ParseResponse(response, backwards_compat=False)
3090+
except ParseError:
3091+
errMsg = "badly formed HTML at the target url. will try to filter it"
3092+
logger.error(errMsg)
3093+
response.seek(0)
3094+
filtered = _("".join(re.findall(r'<form.+?</form>', response.read(), re.I | re.S)), response.geturl())
3095+
try:
3096+
forms = ParseResponse(filtered, backwards_compat=False)
3097+
except ParseError:
3098+
errMsg = "no success"
3099+
if raise_:
3100+
raise sqlmapGenericException, errMsg
3101+
else:
3102+
logger.debug(errMsg)
3103+
3104+
if forms:
3105+
for form in forms:
3106+
for control in form.controls:
3107+
if hasattr(control, 'items'):
3108+
# if control has selectable items select first non-disabled
3109+
for item in control.items:
3110+
if not item.disabled:
3111+
item.selected = True
3112+
break
3113+
request = form.click()
3114+
url = urldecode(request.get_full_url(), kb.pageEncoding)
3115+
method = request.get_method()
3116+
data = urldecode(request.get_data(), kb.pageEncoding) if request.has_data() else None
3117+
if not data and method and method.upper() == HTTPMETHOD.POST:
3118+
debugMsg = "invalid POST form with blank data detected"
3119+
logger.debug(debugMsg)
3120+
continue
3121+
target = (url, method, data, conf.cookie)
3122+
retVal.add(target)
3123+
else:
3124+
errMsg = "there were no forms found at the given target url"
3125+
if raise_:
3126+
raise sqlmapGenericException, errMsg
3127+
else:
3128+
logger.debug(errMsg)
3129+
3130+
if addToTargets and retVal:
3131+
for target in retVal:
3132+
kb.targetUrls.add(target)
3133+
3134+
return retVal

lib/core/option.py

Lines changed: 4 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
import os
1616
import re
1717
import socket
18-
import StringIO
1918
import sys
2019
import threading
2120
import urllib2
@@ -24,8 +23,6 @@
2423
import lib.core.common
2524
import lib.core.threads
2625

27-
from extra.clientform.clientform import ParseResponse
28-
from extra.clientform.clientform import ParseError
2926
from extra.keepalive import keepalive
3027
from extra.oset.pyoset import oset
3128
from lib.controller.checks import checkConnection
@@ -34,6 +31,7 @@
3431
from lib.core.common import getPublicTypeMembers
3532
from lib.core.common import extractRegexResult
3633
from lib.core.common import filterStringValue
34+
from lib.core.common import findPageForms
3735
from lib.core.common import getConsoleWidth
3836
from lib.core.common import getFileItems
3937
from lib.core.common import getFileType
@@ -524,13 +522,6 @@ def __setBulkMultipleTargets():
524522
f.close()
525523

526524
def __findPageForms():
527-
class _(StringIO.StringIO):
528-
def __init__(self, content, url):
529-
StringIO.StringIO.__init__(self, content)
530-
self._url = url
531-
def geturl(self):
532-
return self._url
533-
534525
if not conf.forms:
535526
return
536527

@@ -540,50 +531,9 @@ def geturl(self):
540531
infoMsg = "searching for forms"
541532
logger.info(infoMsg)
542533

543-
response, headers = Request.queryPage(response=True)
544-
545-
if response is None or isinstance(response, basestring):
546-
errMsg = "can't do form parsing as no valid response "
547-
errMsg += "object found. please check previous log messages "
548-
errMsg += "for connection issues"
549-
raise sqlmapGenericException, errMsg
550-
551-
response = _(response.read(), response.geturl())
552-
try:
553-
forms = ParseResponse(response, backwards_compat=False)
554-
except ParseError:
555-
errMsg = "badly formed HTML at the target url. will try to filter it"
556-
logger.error(errMsg)
557-
response.seek(0)
558-
filtered = _("".join(re.findall(r'<form.+?</form>', response.read(), re.I | re.S)), response.geturl())
559-
try:
560-
forms = ParseResponse(filtered, backwards_compat=False)
561-
except ParseError:
562-
raise sqlmapGenericException, "no success"
563-
564-
if forms:
565-
for form in forms:
566-
for control in form.controls:
567-
if hasattr(control, 'items'):
568-
# if control has selectable items select first non-disabled
569-
for item in control.items:
570-
if not item.disabled:
571-
item.selected = True
572-
break
573-
request = form.click()
574-
url = urldecode(request.get_full_url(), kb.pageEncoding)
575-
method = request.get_method()
576-
data = urldecode(request.get_data(), kb.pageEncoding) if request.has_data() else None
577-
if not data and method and method.upper() == HTTPMETHOD.POST:
578-
debugMsg = "invalid POST form with blank data detected"
579-
logger.debug(debugMsg)
580-
continue
581-
target = (url, method, data, conf.cookie)
582-
kb.targetUrls.add(target)
583-
kb.formNames.append(target)
584-
else:
585-
errMsg = "there were no forms found at the given target url"
586-
raise sqlmapGenericException, errMsg
534+
page, _ = Request.queryPage(content=True)
535+
536+
findPageForms(page, conf.url, True, True)
587537

588538
def __setMetasploit():
589539
if not conf.osPwn and not conf.osSmb and not conf.osBof:
@@ -1456,7 +1406,6 @@ def __setKnowledgeBaseAttributes(flushAll=True):
14561406
kb.explicitSettings = set()
14571407
kb.errorIsNone = True
14581408
kb.forcedDbms = None
1459-
kb.formNames = []
14601409
kb.headersCount = 0
14611410
kb.headersFp = {}
14621411
kb.heuristicTest = None

0 commit comments

Comments
 (0)