diff --git a/_sqlmap.py b/_sqlmap.py index 968d753c6..26da868d0 100755 --- a/_sqlmap.py +++ b/_sqlmap.py @@ -59,7 +59,7 @@ def xmlRpcServe(): server = XMLRPCServer(cmdLineOptions.xmlRpcPort or XMLRPC_SERVER_PORT) def emit(self, record): message = stdoutencode(FORMATTER.format(record)) - sys.stdout.write("%s\n" % message) + sys.stdout.write("%s" % message) LOGGER_HANDLER.emit = types.MethodType(emit, LOGGER_HANDLER, type(LOGGER_HANDLER)) sys.stdout = StringIO.StringIO() sys.stderr = StringIO.StringIO() diff --git a/lib/parse/cmdline.py b/lib/parse/cmdline.py index fee52f85f..5d4fd6412 100644 --- a/lib/parse/cmdline.py +++ b/lib/parse/cmdline.py @@ -760,7 +760,8 @@ def cmdLineParser(): expandMnemonics(sys.argv[i+1], parser, args) if not any((args.direct, args.url, args.logFile, args.bulkFile, args.googleDork, args.configFile, \ - args.requestFile, args.updateAll, args.smokeTest, args.liveTest, args.wizard, args.dependencies, args.purgeOutput)): + args.requestFile, args.updateAll, args.smokeTest, args.liveTest, args.wizard, args.dependencies, \ + args.xmlRpc, args.purgeOutput)): errMsg = "missing a mandatory option (-d, -u, -l, -m, -r, -g, -c, --wizard, --update, --purge-output or --dependencies), " errMsg += "use -h for basic or -hh for advanced help" parser.error(errMsg) diff --git a/lib/utils/xmlrpc.py b/lib/utils/xmlrpc.py index b0c3c0db2..2b81beebc 100644 --- a/lib/utils/xmlrpc.py +++ b/lib/utils/xmlrpc.py @@ -7,6 +7,7 @@ See the file 'doc/COPYING' for copying permission import sys import threading +import types import xmlrpclib try: @@ -29,11 +30,9 @@ class XMLRPCServer: self.reset() self.server = SimpleXMLRPCServer(addr=("", self.port), logRequests=False, allow_none=True, encoding=UNICODE_ENCODING) - self.server.register_function(self.reset) - self.server.register_function(self.set_option) - self.server.register_function(self.get_option) - self.server.register_function(self.get_option_names) - self.server.register_function(self.run) + for _ in dir(self): + if not _.startswith('_') and isinstance(getattr(self, _), types.MethodType): + self.server.register_function(getattr(self, _)) logger.info("Registering RPC methods: %s" % str(self.server.system_listMethods()).strip("[]")) self.server.register_introspection_functions() logger.info("Running XML-RPC server at '0.0.0.0:%d'..." % self.port) @@ -43,16 +42,28 @@ class XMLRPCServer: def set_option(self, name, value): self.options[name] = value + return value def get_option(self, name): return self.options[name] def get_option_names(self): - return self.options.keys() + return sorted(self.options.keys()) def is_busy(self): return kb.get("busyFlag") + def read_output(self): + retval = [] + for _ in ("stdout", "stderr"): + stream = getattr(sys, _) + stream.seek(0) + retval.append(stream.read()) + stream.truncate(0) + if not filter(None, retval) and not self.is_busy(): + retval = None + return retval + def run(self): if not self.is_busy(): init(self.options, True) @@ -85,11 +96,12 @@ if __name__ == "__main__": else: while True: try: - _ = raw_input("> ") - if not _.startswith("print"): - print eval(_) or "" - else: - exec(_) + cmd = raw_input("> ") + try: + result = eval(cmd) + print result if result is not None else "" + except SyntaxError: + exec(cmd) except KeyboardInterrupt: exit(0) except Exception, ex: