sqlmap

sqlmap用法不存在太多难度,略过。

对sqlmap源码的一些注解:

1. sqlmap/lib/core/common.py

输出函数dataToStdout中的sys.stdout.write

控制主要输出点

2. logging调级

sqlmap/lib/core/option.py

设置logging级别函数setVerbosity中,添加conf.verbose=0,则级别将设置为ERROR,级别较高,基本不输出,如有需求,可再设置为critical。 

控制sqlmap logging输出级别,设置为0则只有最高级的logging才会输出。

3. logging调级V2

同样的,还是原来的位置

conf.verbose=0的时候,将设置logger.setLevel(logging.ERROR)。

python logging中,有六个级别:

CRITICA、ERROR、WARNING、INFO、DEBUG、NOTSET

而即使设置成最高的级别CRITICA,还是会raise出CRITICA级别的信息,为红色的,在主程序的console中不太好看。

根据logging文档:https://docs.python.org/2/library/logging.html#levels

logging的级别对应50、40、30、20、10、0

所以,logger.setLevel(60)时什么logging都不会输出的,因为没有logging.XX级别无对应。

def setVerbosity():
    """
    This function set the verbosity of sqlmap output messages.
    """
    # set the verbose -1, and the follow "if" would not go in.
    conf.verbose = -1
    if conf.verbose is None:
        conf.verbose = 1

    conf.verbose = int(conf.verbose)
    if conf.verbose == -1:
        # setLevel 60, and all logging would not output
        logger.setLevel(60)

    if conf.verbose == 0:
        logger.setLevel(logging.ERROR)
    elif conf.verbose == 1:
        logger.setLevel(logging.INFO)
    elif conf.verbose > 2 and conf.eta:
        conf.verbose = 2
        logger.setLevel(logging.DEBUG)
    elif conf.verbose == 2:
        logger.setLevel(logging.DEBUG)
    elif conf.verbose == 3:
        logger.setLevel(CUSTOM_LOGGING.PAYLOAD)
    elif conf.verbose == 4:
        logger.setLevel(CUSTOM_LOGGING.TRAFFIC_OUT)
    elif conf.verbose >= 5:
        logger.setLevel(CUSTOM_LOGGING.TRAFFIC_IN)

如此甚好,什么输出都空了,舒服,从sys.stdout与logging两个源头中断输出,sqlmap本身程序哑了。

 

4. 多线程调用sqlmap时,如果不存在注入,调用的程序也会终止。即使使用 try抓取异常,也会被中断。

这一点刚开始找不到原因。

  1. 表面现象,raise后程序也终止了,注释掉raise SqlmapNotVulnerableException之后,还是会终止。

  2. sqlmap程序return值后,主程序收不到值,同时也终止了,看上去好像return时同时终止了程序。

  3. 最后找到了try: except:finally:,finally中有exit(0)。而finally优先级高于return,就算在try中return了,finally中exit,主程序还是会被exit给退出。

  

sqlmap.py  main()函数最后一行:

  if threading.activeCount() > 1:
    os._exit(0)

该语句解决了sqlmap跑完结果出现、该结束时还存在线程在运行(在sqlmap运行时,线程存在于inject过程中;但在二次开发过程中,主程序的线程会影响sqlmap中该处的判断语句),可能导致报错的问题,但也导致主程序被中断。

将之换成pass吧,不能用return的原因:finally的return会覆盖try中的return,导致try中的retun接受不到。

之后想要全面消除这种现象,就要将程序中所有exit都看一下。

原文地址:https://www.cnblogs.com/huim/p/8978042.html