|
122 | 122 | from lib.core.settings import PARAMETER_SPLITTING_REGEX |
123 | 123 | from lib.core.settings import PROBLEMATIC_CUSTOM_INJECTION_PATTERNS |
124 | 124 | from lib.core.settings import SITE |
| 125 | +from lib.core.settings import SOCKET_PRE_CONNECT_QUEUE_SIZE |
125 | 126 | from lib.core.settings import SQLMAP_ENVIRONMENT_PREFIX |
126 | 127 | from lib.core.settings import SUPPORTED_DBMS |
127 | 128 | from lib.core.settings import SUPPORTED_OS |
@@ -1014,10 +1015,44 @@ def _getaddrinfo(*args, **kwargs): |
1014 | 1015 | kb.cache[args] = socket._getaddrinfo(*args, **kwargs) |
1015 | 1016 | return kb.cache[args] |
1016 | 1017 |
|
1017 | | - if not hasattr(socket, '_getaddrinfo'): |
| 1018 | + if not hasattr(socket, "_getaddrinfo"): |
1018 | 1019 | socket._getaddrinfo = socket.getaddrinfo |
1019 | 1020 | socket.getaddrinfo = _getaddrinfo |
1020 | 1021 |
|
| 1022 | +def _setSocketPreConnect(): |
| 1023 | + """ |
| 1024 | + Makes a pre-connect version of socket.connect |
| 1025 | + """ |
| 1026 | + |
| 1027 | + def _(): |
| 1028 | + while kb.threadContinue: |
| 1029 | + for address in socket._ready: |
| 1030 | + if len(socket._ready[address]) < SOCKET_PRE_CONNECT_QUEUE_SIZE: |
| 1031 | + s = socket.socket() |
| 1032 | + s._connect(address) |
| 1033 | + socket._ready[address].append(s._sock) |
| 1034 | + time.sleep(0.001) |
| 1035 | + |
| 1036 | + def connect(self, address): |
| 1037 | + found = False |
| 1038 | + with kb.locks.socket: |
| 1039 | + if address not in socket._ready: |
| 1040 | + socket._ready[address] = [] |
| 1041 | + if len(socket._ready[address]) > 0: |
| 1042 | + self._sock = socket._ready[address].pop(0) |
| 1043 | + found = True |
| 1044 | + if not found: |
| 1045 | + self._connect(address) |
| 1046 | + |
| 1047 | + if not hasattr(socket, "_connect"): |
| 1048 | + socket._ready = {} |
| 1049 | + socket.socket._connect = socket.socket.connect |
| 1050 | + socket.socket.connect = connect |
| 1051 | + |
| 1052 | + thread = threading.Thread(target=_) |
| 1053 | + thread.daemon = True |
| 1054 | + thread.start() |
| 1055 | + |
1021 | 1056 | def _setHTTPHandlers(): |
1022 | 1057 | """ |
1023 | 1058 | Check and set the HTTP/SOCKS proxy for all HTTP requests. |
@@ -1803,7 +1838,7 @@ def _setKnowledgeBaseAttributes(flushAll=True): |
1803 | 1838 | kb.lastParserStatus = None |
1804 | 1839 |
|
1805 | 1840 | kb.locks = AttribDict() |
1806 | | - for _ in ("cache", "count", "index", "io", "limit", "log", "redirect", "request", "value"): |
| 1841 | + for _ in ("cache", "count", "index", "io", "limit", "log", "socket", "redirect", "request", "value"): |
1807 | 1842 | kb.locks[_] = threading.Lock() |
1808 | 1843 |
|
1809 | 1844 | kb.matchRatio = None |
@@ -2517,6 +2552,7 @@ def init(): |
2517 | 2552 | _setHTTPAuthentication() |
2518 | 2553 | _setHTTPHandlers() |
2519 | 2554 | _setDNSCache() |
| 2555 | + _setSocketPreConnect() |
2520 | 2556 | _setSafeVisit() |
2521 | 2557 | _doSearch() |
2522 | 2558 | _setBulkMultipleTargets() |
|
0 commit comments