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

Skip to content

Commit 8df4cc3

Browse files
author
Louis-Philippe Huberdeau
committed
Adding initial hook to receive the request/response pairs
1 parent 5ec44b8 commit 8df4cc3

6 files changed

Lines changed: 50 additions & 0 deletions

File tree

lib/core/common.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2599,6 +2599,9 @@ def logHTTPTraffic(requestLogMsg, responseLogMsg):
25992599
"""
26002600
Logs HTTP traffic to the output file
26012601
"""
2602+
threadData = getCurrentThreadData()
2603+
assert threadData.requestCollector is not None, "Request collector should be initialized by now"
2604+
threadData.requestCollector.collectRequest(requestLogMsg, responseLogMsg)
26022605

26032606
if not conf.trafficFile:
26042607
return

lib/core/option.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@
149149
from lib.request.rangehandler import HTTPRangeHandler
150150
from lib.request.redirecthandler import SmartRedirectHandler
151151
from lib.request.templates import getPageTemplate
152+
from lib.utils.collect import RequestCollectorFactory
152153
from lib.utils.crawler import crawl
153154
from lib.utils.deps import checkDependencies
154155
from lib.utils.search import search
@@ -1844,6 +1845,7 @@ def _setConfAttributes():
18441845
conf.scheme = None
18451846
conf.tests = []
18461847
conf.trafficFP = None
1848+
conf.requestCollectorFactory = None
18471849
conf.wFileType = None
18481850

18491851
def _setKnowledgeBaseAttributes(flushAll=True):
@@ -2228,6 +2230,11 @@ def _setTrafficOutputFP():
22282230

22292231
conf.trafficFP = openFile(conf.trafficFile, "w+")
22302232

2233+
def _setupRequestCollector():
2234+
conf.requestCollectorFactory = RequestCollectorFactory(collect=conf.collectRequests)
2235+
threadData = getCurrentThreadData()
2236+
threadData.requestCollector = conf.requestCollectorFactory.create()
2237+
22312238
def _setDNSServer():
22322239
if not conf.dnsDomain:
22332240
return
@@ -2604,6 +2611,7 @@ def init():
26042611
_setTamperingFunctions()
26052612
_setWafFunctions()
26062613
_setTrafficOutputFP()
2614+
_setupRequestCollector()
26072615
_resolveCrossReferences()
26082616
_checkWebSocket()
26092617

lib/core/optiondict.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@
197197
"binaryFields": "string",
198198
"charset": "string",
199199
"checkInternet": "boolean",
200+
"collectRequests": "string",
200201
"crawlDepth": "integer",
201202
"crawlExclude": "string",
202203
"csvDel": "string",

lib/core/threads.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ def reset(self):
3838
Resets thread data model
3939
"""
4040

41+
self.requestCollector = None
42+
4143
self.disableStdOut = False
4244
self.hashDBCursor = None
4345
self.inTransaction = False

lib/parse/cmdline.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -631,6 +631,10 @@ def cmdLineParser(argv=None):
631631
action="store_true",
632632
help="Never ask for user input, use the default behaviour")
633633

634+
general.add_option("--collect-requests", dest="collectRequests",
635+
action="store_true",
636+
help="Collect requests in HAR format")
637+
634638
general.add_option("--binary-fields", dest="binaryFields",
635639
help="Result fields having binary values (e.g. \"digest\")")
636640

lib/utils/collect.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#!/usr/bin/env python
2+
3+
"""
4+
Copyright (c) 2006-2017 sqlmap developers (http://sqlmap.org/)
5+
See the file 'doc/COPYING' for copying permission
6+
"""
7+
8+
from lib.core.data import logger
9+
10+
11+
class RequestCollectorFactory:
12+
13+
def __init__(self, collect=False):
14+
self.collect = collect
15+
16+
def create(self):
17+
collector = RequestCollector()
18+
19+
if not self.collect:
20+
collector.collectRequest = self._noop
21+
22+
return collector
23+
24+
@staticmethod
25+
def _noop(*args, **kwargs):
26+
pass
27+
28+
29+
class RequestCollector:
30+
31+
def collectRequest(self, requestMessage, responseMessage):
32+
logger.info("Received request/response: %s/%s", len(requestMessage), len(responseMessage))

0 commit comments

Comments
 (0)