|
7 | 7 |
|
8 | 8 | from lib.core.agent import agent |
9 | 9 | from lib.core.common import Backend |
| 10 | +from lib.core.common import getLimitRange |
10 | 11 | from lib.core.common import getSPQLSnippet |
11 | 12 | from lib.core.common import hashDBWrite |
12 | 13 | from lib.core.common import isListLike |
13 | 14 | from lib.core.common import isNoneValue |
| 15 | +from lib.core.common import isNumPosStrValue |
| 16 | +from lib.core.common import isTechniqueAvailable |
14 | 17 | from lib.core.common import pushValue |
15 | 18 | from lib.core.common import popValue |
16 | 19 | from lib.core.common import randomStr |
|
20 | 23 | from lib.core.data import conf |
21 | 24 | from lib.core.data import kb |
22 | 25 | from lib.core.data import logger |
| 26 | +from lib.core.enums import CHARSET_TYPE |
23 | 27 | from lib.core.enums import DBMS |
| 28 | +from lib.core.enums import EXPECTED |
24 | 29 | from lib.core.enums import HASHDB_KEYS |
| 30 | +from lib.core.enums import PAYLOAD |
25 | 31 | from lib.core.exception import sqlmapUnsupportedFeatureException |
26 | 32 | from lib.core.threads import getCurrentThreadData |
27 | 33 | from lib.core.unescaper import unescaper |
@@ -172,7 +178,16 @@ def xpCmdshellEvalCmd(self, cmd, first=None, last=None): |
172 | 178 | output = new_output |
173 | 179 | else: |
174 | 180 | inject.goStacked(self.xpCmdshellForgeCmd(cmd, self.cmdTblName)) |
175 | | - output = inject.getValue("SELECT %s FROM %s" % (self.tblField, self.cmdTblName), resumeValue=False) |
| 181 | + query = "SELECT %s FROM %s" % (self.tblField, self.cmdTblName) |
| 182 | + if any(isTechniqueAvailable(_) for _ in (PAYLOAD.TECHNIQUE.UNION, PAYLOAD.TECHNIQUE.ERROR)) or conf.direct: |
| 183 | + output = inject.getValue(query, resumeValue=False, blind=False) |
| 184 | + else: |
| 185 | + output = [] |
| 186 | + count = inject.getValue("SELECT COUNT(*) FROM %s" % self.cmdTblName, resumeValue=False, inband=False, error=False, expected=EXPECTED.INT, charsetType=CHARSET_TYPE.DIGITS) |
| 187 | + if isNumPosStrValue(count): |
| 188 | + for index in getLimitRange(count): |
| 189 | + query = agent.limitQuery(index, query, self.tblField) |
| 190 | + output.append(inject.getValue(query, inband=False, error=False, resumeValue=False)) |
176 | 191 | inject.goStacked("DELETE FROM %s" % self.cmdTblName) |
177 | 192 |
|
178 | 193 | if output and isListLike(output) and len(output) > 1: |
|
0 commit comments