1、经过setTargetEnv()就进入了checkWaf()的环节

def checkWaf():

    """
    Reference: http://seclists.org/nmap-dev/2011/q2/att-1005/http-waf-detect.nse
    """
    if any((conf.string, conf.notString, conf.regexp, conf.dummy, conf.offline, conf.skipWaf)):
        return None
    = hashDBRetrieve(HASHDB_KEYS.CHECK_WAF_RESULT, True)
    if is not None:
        if _:
            warnMsg = "previous heuristics detected that the target "
            warnMsg += "is protected by some kind of WAF/IPS/IDS"
            logger.critical(warnMsg)
        return _
    infoMsg = "checking if the target is protected by "
    infoMsg += "some kind of WAF/IPS/IDS"
    logger.info(infoMsg)
    retVal = False
    payload = "%d %s" % (randomInt(), IDS_WAF_CHECK_PAYLOAD)
    value = "" if not conf.parameters.get(PLACE.GET) else conf.parameters[PLACE.GET] + DEFAULT_GET_POST_DELIMITER
    value += agent.addPayloadDelimiters("%s=%s" % (randomStr(), payload))
    pushValue(conf.timeout)
    conf.timeout = IDS_WAF_CHECK_TIMEOUT
    try:
        retVal = Request.queryPage(place=PLACE.GET, value=value, getRatioValue=True, noteResponseTime=False, silent=True)[1] < IDS_WAF_CHECK_RATIO
    except SqlmapConnectionException:
        retVal = True
    finally:
        kb.matchRatio = None
        conf.timeout = popValue()
    if retVal:
        warnMsg = "heuristics detected that the target "
        warnMsg += "is protected by some kind of WAF/IPS/IDS"
        logger.critical(warnMsg)
        if not conf.identifyWaf:
            message = "do you want sqlmap to try to detect backend "
            message += "WAF/IPS/IDS? [y/N] "
            if readInput(message, default='N', boolean=True):
                conf.identifyWaf = True
        if conf.timeout == defaults.timeout:
            logger.warning("dropping timeout to %d seconds (i.e. '--timeout=%d')" % (IDS_WAF_CHECK_TIMEOUT, IDS_WAF_CHECK_TIMEOUT))
            conf.timeout = IDS_WAF_CHECK_TIMEOUT
    hashDBWrite(HASHDB_KEYS.CHECK_WAF_RESULT, retVal, True)
    return retVal
2、启发式注入检测
def heuristicCheckSqlInjection(place, parameter):

    if kb.nullConnection:
        debugMsg = "heuristic check skipped because NULL connection used"
        logger.debug(debugMsg)
        return None
    origValue = conf.paramDict[place][parameter]
    paramType = conf.method if conf.method not in (None, HTTPMETHOD.GET, HTTPMETHOD.POST) else place
    prefix = ""
    suffix = ""
    randStr = ""
    if conf.prefix or conf.suffix:
        if conf.prefix:
            prefix = conf.prefix
        if conf.suffix:
            suffix = conf.suffix
    while randStr.count('\'') != 1 or randStr.count('\"') != 1:
        randStr = randomStr(length=10, alphabet=HEURISTIC_CHECK_ALPHABET)
    kb.heuristicMode = True
    payload = "%s%s%s" % (prefix, randStr, suffix)
    payload = agent.payload(place, parameter, newValue=payload)
    page, _, _ = Request.queryPage(payload, place, content=True, raise404=False)
    kb.heuristicPage = page
    kb.heuristicMode = False
    parseFilePaths(page)
    result = wasLastResponseDBMSError()
    infoMsg = "heuristic (basic) test shows that %s parameter " % paramType
    infoMsg += "'%s' might " % parameter
    def _(page):
        return any(_ in (page or "") for in FORMAT_EXCEPTION_STRINGS)
    casting = _(page) and not _(kb.originalPage)
    if not casting and not result and kb.dynamicParameter and origValue.isdigit():
        randInt = int(randomInt())
        payload = "%s%s%s" % (prefix, "%d-%d" % (int(origValue) + randInt, randInt), suffix)
        payload = agent.payload(place, parameter, newValue=payload, where=PAYLOAD.WHERE.REPLACE)
        result = Request.queryPage(payload, place, raise404=False)
        if not result:
            randStr = randomStr()
            payload = "%s%s%s" % (prefix, "%s.%d%s" % (origValue, random.randint(19), randStr), suffix)
            payload = agent.payload(place, parameter, newValue=payload, where=PAYLOAD.WHERE.REPLACE)
            casting = Request.queryPage(payload, place, raise404=False)
    kb.heuristicTest = HEURISTIC_TEST.CASTED if casting else HEURISTIC_TEST.NEGATIVE if not result else HEURISTIC_TEST.POSITIVE
    if casting:
        errMsg = "possible %s casting " % ("integer" if origValue.isdigit() else "type")
        errMsg += "detected (e.g. \"$%s=intval($_REQUEST['%s'])\") " % (parameter, parameter)
        errMsg += "at the back-end web application"
        logger.error(errMsg)
        if kb.ignoreCasted is None:
            message = "do you want to skip those kind of cases (and save scanning time)? %s " % ("[Y/n]" if conf.multipleTargets else "[y/N]")
            kb.ignoreCasted = readInput(message, default='Y' if conf.multipleTargets else 'N', boolean=True)
    elif result:
        infoMsg += "be injectable"
        if Backend.getErrorParsedDBMSes():
            infoMsg += " (possible DBMS: '%s')" % Format.getErrorParsedDBMSes()
        logger.info(infoMsg)
    else:
        infoMsg += "not be injectable"
        logger.warn(infoMsg)
    kb.heuristicMode = True
    randStr1, randStr2 = randomStr(NON_SQLI_CHECK_PREFIX_SUFFIX_LENGTH), randomStr(NON_SQLI_CHECK_PREFIX_SUFFIX_LENGTH)
    value = "%s%s%s" % (randStr1, DUMMY_NON_SQLI_CHECK_APPENDIX, randStr2)
    payload = "%s%s%s" % (prefix, "'%s" % value, suffix)
    payload = agent.payload(place, parameter, newValue=payload)
    page, _, _ = Request.queryPage(payload, place, content=True, raise404=False)
    paramType = conf.method if conf.method not in (None, HTTPMETHOD.GET, HTTPMETHOD.POST) else place
    if value.lower() in (page or "").lower():
        infoMsg = "heuristic (XSS) test shows that %s parameter " % paramType
        infoMsg += "'%s' might be vulnerable to cross-site scripting attacks" % parameter
        logger.info(infoMsg)
    for match in re.finditer(FI_ERROR_REGEX, page or ""):
        if randStr1.lower() in match.group(0).lower():
            infoMsg = "heuristic (FI) test shows that %s parameter " % paramType
            infoMsg += "'%s' might be vulnerable to file inclusion attacks" % parameter
            logger.info(infoMsg)
            break
    kb.heuristicMode = False
    return kb.heuristicTest

首先是对sql注入的检测

1
payload = "%s%s%s" % (prefix, randStr, suffix)

randStr就是随机生成的可导致sql语句因闭合问题而报错的字符,这个payload不是用来注入的,而是将其产生的页面作为启发式注入标准页面(kb.heuristicPage),与不注入产生的正常页面(kb.originalPage)作为一个基准性对比。

接下来是一个关键变量casting

1
casting = _(page) and not _(kb.originalPage)

_()函数如下

1
2
def _(page):
    return any(_ in (page or "") for in FORMAT_EXCEPTION_STRINGS)

FORMAT_EXCEPTION_STRINGS 是一些在Web服务中常见的sql语句关于变量类型出错的报错

('Type mismatch', 'Error converting', 'Conversion failed', 'String or binary data would be truncated', 'Failed to convert', 'unable to interpret text value', 'Input string was not in a correct format', 'System.FormatException', 'java.lang.NumberFormatException', 'ValueError: invalid literal', 'DataTypeMismatchException', 'CF_SQL_INTEGER', ' for CFSQLTYPE ', 'cfqueryparam cfsqltype', 'InvalidParamTypeException', 'Invalid parameter type', 'is not of type numeric', '<cfif Not IsNumeric(', 'invalid input syntax for integer', 'invalid input syntax for type', 'invalid number', 'character to number conversion error', 'unable to interpret text value', 'String was not recognized as a valid', 'Convert.ToInt', 'cannot be converted to a ', 'InvalidDataException')

casting为false就代表这种注入样例因为变量类型不统一而无法使用,所以用户可以选择跳过这些样例

第二个关键变量 result

1
result = wasLastResponseDBMSError()

函数如下

1
2
3
4
5
6
def wasLastResponseDBMSError():
    """
    Returns True if the last web request resulted in a (recognized) DBMS error page
    """
    threadData = getCurrentThreadData()
    return threadData.lastErrorPage and threadData.lastErrorPage[0== threadData.lastRequestUID

如果启发式注入标准页面是可识别的,则返回ture,否则返回false

这也作为sqlmap启发性测试结果的标志,为true就代表可能存在注入,为false就可能不存在注入

接下来就是对于非sql注入漏洞的检测,sqlmap会随机生成可引发其他类型漏洞报错的字符,然后进行注入测试,在sqlmap源码中可以看出除了sql注入,还测试了xss与文件包含漏洞

1、内部类,java编译器生成的内部类的字节码文件的名字和通常的不同,内部类对应的字节码文件名字的格式是“外嵌类名&内部类类名”,如果将内部类添加修饰词static,则可以这样调用,  RedCowForm.RedCow redCow=new RedCowForm.RedCow(122,232,333);

public class NeiBuLai {

public static void main(String[] args) {
        // TODO Auto-generated method stub
        RedCowForm form=new RedCowForm("德纳司");
        form.showMessage();
    RedCowForm.RedCow redCow=new RedCowForm.RedCow(122,232,333);
    }
}
class RedCowForm{
    static String formName;
    RedCow cow;
    RedCowForm(){
    }
    RedCowForm(String s){
        cow=new RedCow(12,23,34);
        formName=s;
    }
    public void showMessage(){
        cow.speak();
    }
     static class RedCow{
        String cowName="bed wos";
        int height,weight,price;
//        int t=0;int w=0;int p=0;
        RedCow(int h, int w,int p){
            height=h;
            weight=w;
            price=p;
        }
        void speak(){
            System.out.println("mingzi"+cowName+"shenggao"+height+"tizhong"+weight+"shenghuozai"+formName);
        }
    }
}

2、匿名类匿名类继承父类的方法一个可以重写父类的方法,匿名类必须是内部类。用匿名类创建对象时直接使用父类的构造方法。

public class NiMingLei {

public static void main(String[] args) {
        // TODO Auto-generated method stub
        ShowBoard board=new ShowBoard();
        board.showMessge(new OutPutEnglish());//这是一个OutPutAlpaabe的子类对象
        board.showMessge(new OutPutAlphabe(){ public void output(){
            for(char c='@';c<'*';c++)
                        System.out.printf("%3c",c);
                }
                }
                );//这里是OutPutAlphabe的一个匿名类也是他的一个子类对象
    }
}
abstract class OutPutAlphabet{
    public abstract void output();
}
class OutPutEnglish extends OutPutAlphabet{
    public void output(){
        for(char c='a';c<'z';c++){
            System.out.printf("%3c",c);
        }
    }
}
class ShowBoard{
    void showMessge(OutPutAlphabet show){
        show.output();
    }
}

3、接口匿名类

public class JieKouNiMIng {

public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        HelloMachine machine=new HelloMachine();
        machine.turnON(new SpeakHello(){
            
            public void spaek(){
                System.out.println("Hello ,you are wellcome");
            }

@Override
            public void speak() {
                // TODO Auto-generated method stub
            }
        });
        machine.turnON(new SpeakHello(){
            public void spaek(){
                System.out.println("Hello ");
            }

@Override
            public void speak() {
                // TODO Auto-generated method stub
                
            }
        });
    }

}
interface SpeakHello{
    void speak();
}
class HelloMachine{
    public void turnON(SpeakHello hello){
        hello.speak();
    }
}
4、异常类的处理以及自定义异常类使用

SQLmap注入启发式检测算法的更多相关文章

  1. sqlmap注入入门

    sqlmap注入入门 sqlmap的用法: ​ linux中: sqlmap [选项] ​ Windows中: python sqlmap [选项] 常用的参数及含义: 目标 ​ -d DIRECT ...

  2. SQLMAP注入教程-11种常见SQLMAP使用方法详解

    sqlmap也是渗透中常用的一个注入工具,其实在注入工具方面,一个sqlmap就足够用了,只要你用的熟,秒杀各种工具,只是一个便捷性问题,sql注入另一方面就是手工党了,这个就另当别论了.今天把我一直 ...

  3. 基于候选区域的深度学习目标检测算法R-CNN,Fast R-CNN,Faster R-CNN

    参考文献 [1]Rich feature hierarchies for accurate object detection and semantic segmentation [2]Fast R-C ...

  4. sqlmap 注入的方法及技巧

    sqlmap 注入的方法及技巧 当给 sqlmap 这么一个 url 的时候,它会: 1.判断可注入的参数 2.判断可以用那种 SQL 注入技术来注入 3.识别出哪种数据库 4.根据用户选择,读取哪些 ...

  5. Sqlmap注入工具

    Sqlmap注入工具 http://sqlmap.org/ Sqlmap是国外的一个免费的注入工具,基于python开发,支持现在几乎所有的数据库,支持get.post.cookie注入,可以添加co ...

  6. 在windows系统和kali中通过sqlmap注入

    第1章 在windows系统中通过sqlmap注入 1.1 环境搭建 Sqlmap是目前功能最强大,使用最为广泛的注入类工具,是一个开源软件,被集成于kaliLinux, 由于sqlmap是基于Pyt ...

  7. 并行Louvain社区检测算法

    因为在我最近的科研中需要用到分布式的社区检测(也称为图聚类(graph clustering))算法,专门去查找了相关文献对其进行了学习.下面我们就以这篇论文IPDPS2018的文章[1]为例介绍并行 ...

  8. 浅谈Virtual Machine Manager(SCVMM 2012) cluster 过载状态检测算法

    在我们使用scvmm2012的时候,经常会看到群集状态变成了这样 点开看属性后,我们发现是这样 . 发现了吗?Over-committed,如果翻译过来就是资源过载,或者说资源过量使用了,那么这个状态 ...

  9. 异常检测算法--Isolation Forest

    南大周志华老师在2010年提出一个异常检测算法Isolation Forest,在工业界很实用,算法效果好,时间效率高,能有效处理高维数据和海量数据,这里对这个算法进行简要总结. iTree 提到森林 ...

随机推荐

  1. BZOJ4921「Lydsy1706月赛」互质序列

    吐槽一下BZOJ没有C++11  题还是不难的 BZOJ 4921 题意 在长度为$ n$的数列中去掉非空的连续一段并保证剩下数字不少于$ 2$ 求合法的所有方案中剩下数字的最大公约数的总和 $Sol ...

  2. Spring所有子项目

    官网地址 https://spring.io/projects 包含子项目 Spring IO Platform Spring Boot Spring Framework Spring Cloud D ...

  3. eclipse快捷键调试总结 -转--快捷键大全

    (1)Ctrl+M --切换窗口的大小(2)Ctrl+Q --跳到最后一次的编辑处(3)F2      ---重命名类名 工程名 --当鼠标放在一个标记处出现Tooltip时候按F2则把鼠标移开时To ...

  4. 微信小程序学习过程

    1.诞生背景: 更好的体验: 规范与管理: 2.什么是小程序: 小程序是一种不需要下载即可使用的应用,它实现了应用“触手可及”的梦想: 用户扫一扫或者搜一下即可打开应用,也体现了“用完即走”的理念: ...

  5. Hadoop Streaming开发要点

    一.shell脚本中的相关配置 HADOOP_CMD="/usr/local/src/hadoop-1.2.1/bin/hadoop" STREAM_JAR_PATH=" ...

  6. linux下 gdb+coredump 调试偶发crash的程序

    1. 打开 core dump 查看是否打开 ulimit -c 如果输出0, 说明没有打开. 方法一:使用命令 ulimit -c unlimited 可以打开,但是只对当前终端有效, 方法二: 配 ...

  7. 数字图像处理的Matlab实现(1)—绪论

    第1章 绪论 1.1 什么是数字图像处理 一幅图像可以定义为一个二维函数\(f(x,y)\),这里的\(x\)和\(y\)是空间坐标,而在任意坐标\((x,y)\)处的幅度\(f\)被称为这一坐标位置 ...

  8. Linux信号-信号集&信号屏蔽字&捕捉信号【转】

    转自:https://blog.csdn.net/Lycorisradiata__/article/details/80096203 一. 阻塞信号 1. 信号的常见其他概念    实际执行信号的处理 ...

  9. MySQL索引调优【转】

    一.关于查询计划 其实,关于所有的关系型数据库中,在运行T-SQL语句的时候,在查询器进行编译运行的同时,都会有着自己的内部的一个优化过程,而这优化之后的产物就是:执行计划. 在SQL SERVER中 ...

  10. MySQL死锁查询【原创】

    死锁详情查询 SELECT SUM(trx_rows_locked) AS rows_locked, SUM(trx_rows_modified) AS rows_modified, SUM(trx_ ...