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. Django 详解 中间件Middleware

    Django中间件 还是涉及到django的请求生命周期.middle ware 请求穿过中间件到达url,再经过中间件返回给用户. 简单实例 django项目根目录新建一个Middle文件夹,再新建 ...

  2. 【tmos】SpringBoot项目IDEA不识别依赖,但是能够运行时什么鬼?

    如下图,但是项目却能够正常运行 解决方法 方法1 方法2 方法3 删除项目的.idea文件,然后重新打开IDEA 方法4 删除项目的iml文件,然后reimport项目的pom.xml 文件,错误提示 ...

  3. Spring Data

    官网地址 http://projects.spring.io/spring-data 包含子项目 简介 Spring Data 是 Spring 的一个子项目.用于简化数据库访问,支持NoSQL,关系 ...

  4. (5)Java数据结构--有继承图,用途分析

    java 中几种常用数据结构 - u010947402的博客 - CSDN博客http://blog.csdn.net/u010947402/article/details/51878166 JAVA ...

  5. MySQL登录报错ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

    [root@pisphkdcbsql01 mysql3307]# /opt/mysql3307/bin/mysql -upisp -ppisp@ mysql: [Warning] Using a pa ...

  6. H5混合开发app常用代码

    1.Android与H5互调可以让我们的实现混合开发,至于混合开发就是在一个App中内嵌一个轻量级的浏览器(高性能webkit内核浏览器),一部分原生的功能改为Html 5来开发.然后这个浏览器又封装 ...

  7. 利用shell简单监控网络设备的接口状态发出告警

    作者:邓聪聪 #!/bin/sh Date=$(date +%F_%T) iplist=`cat ip.txt |awk '{print $1}'` snmp="hjsz-snmp" ...

  8. 题解-hzy loves segment tree I

    Problem 题目概要:给定一棵 \(n\) 个节点的树,点有点权,进行 \(m\) 次路径取\(\max\)的操作,最后统一输出点权 \(n\leq 10^5,m\leq 5\times 10^6 ...

  9. ubuntu 安装source insight3.5

    版本 ubuntu 16.04 在linux下安装 windows下程序,需要安装wine, wine 是 "“Wine Is Not an Emulator" 缩写. 1) 安装 ...

  10. ASP.NET MVC5入门3之登录验证

    参考: HTML页面模版: http://www.ui.cn/detail/70262.html(第38个) MVC后台代码参考: http://www.oschina.net/p/nfine 开发环 ...