Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sqlmapproject
GitHub Repository: sqlmapproject/sqlmap
Path: blob/master/lib/parse/sitemap.py
3554 views
1
#!/usr/bin/env python
2
3
"""
4
Copyright (c) 2006-2026 sqlmap developers (https://sqlmap.org)
5
See the file 'LICENSE' for copying permission
6
"""
7
8
import re
9
10
from lib.core.common import readInput
11
from lib.core.data import kb
12
from lib.core.data import logger
13
from lib.core.datatype import OrderedSet
14
from lib.core.exception import SqlmapSyntaxException
15
from lib.request.connect import Connect as Request
16
from thirdparty.six.moves import http_client as _http_client
17
18
abortedFlag = None
19
20
def parseSitemap(url, retVal=None, visited=None):
21
global abortedFlag
22
23
if retVal is not None:
24
logger.debug("parsing sitemap '%s'" % url)
25
26
try:
27
if retVal is None:
28
abortedFlag = False
29
retVal = OrderedSet()
30
visited = set()
31
32
if url in visited:
33
return retVal
34
35
visited.add(url)
36
37
try:
38
content = Request.getPage(url=url, raise404=True)[0] if not abortedFlag else ""
39
except _http_client.InvalidURL:
40
errMsg = "invalid URL given for sitemap ('%s')" % url
41
raise SqlmapSyntaxException(errMsg)
42
43
if content:
44
content = re.sub(r"", "", content, flags=re.DOTALL)
45
46
for match in re.finditer(r"<\w*?loc[^>]*>\s*([^<]+)", content, re.I):
47
if abortedFlag:
48
break
49
50
foundUrl = match.group(1).strip()
51
52
# Basic validation to avoid junk
53
if not foundUrl.startswith("http"):
54
continue
55
56
if foundUrl.endswith(".xml") and "sitemap" in foundUrl.lower():
57
if kb.followSitemapRecursion is None:
58
message = "sitemap recursion detected. Do you want to follow? [y/N] "
59
kb.followSitemapRecursion = readInput(message, default='N', boolean=True)
60
61
if kb.followSitemapRecursion:
62
parseSitemap(foundUrl, retVal, visited)
63
else:
64
retVal.add(foundUrl)
65
66
except KeyboardInterrupt:
67
abortedFlag = True
68
warnMsg = "user aborted during sitemap parsing. sqlmap "
69
warnMsg += "will use partial list"
70
logger.warning(warnMsg)
71
72
return retVal
73
74